测试 Kubernetes 问题随笔
2020-03-02 by dongnan
k8s版本兼容性问题
确认,k8s
集群添加新的节点时,k8s
小版本需要保持一致,如v1.16.x
无法添加 v1.17.x
。
k8s
版本号格式为x.y.z
,其中x
为大版本号、y
为小版本号、z
为补丁版本号。- 小版本大约每
3
个月发布一个,每个小版本分支会维护9
个月。 - 对于
Docker
需要使用k8s
支持的版本。(k8s v1.16
支持的版本docker-ce 18.09
)
详细说明请参考这里。
按照项目(命名空间)进行用户授权
确认,可以与 Rancher
中的项目概念相结合按照项目(命名空间)进行授权。
举个栗子
项目ABC:
# 测试环境
K8S 创建命名空间 abc-test 。
Rancher 创建 abc项目,关联 abc-test 命名空间。
Rancher 创建用户 abc-user,分配到 abc项目,并交由开发人员使用。
# 生产环境
K8S 创建命名空间 abc-prod 。
Rancher 关联 abc-prod 命名空间到 Prod 项目(生产使用相同的项目)。
Rancher 使用管理员账户管理 Prod项目,并交由运维人员使用。
按照项目(命名空间)进行网络隔离
确认,使用网络策略(networkpolicies
)进行pod
级别网络隔离。
HTTP负载均衡方式
L4 或者 L7 的会话保持?
- L4问题,
HTTP/HTTPS
多端口,后端服务器需要绑定SSL
证书。 - L7问题,
nginx-inc
提供的ingress controller
,无法保持会话(plus
需要收费)。
确认,使用 kubernets
提供的 ingress controller
解决此问题。
亲和性
Pod运行在特定的主机之上
确认,使用节点亲和性(nodeAffinity
)调度策略,指定Pod
运行特定主机节点。
Pod之间互斥性
确认,通过节点亲和性(nodeAffinity
)相反条件实现反亲和性,使Pod
之间不运行在同一个区域(主机)。
资源限制
确认,使用LimitRange
功能配置某个命名空间内的资源限制规则。
挂载数据卷时的用户权限
确认,使用初始化容器,对数据卷进行配置(www-data
)权限。
备份与恢复
确认,使用ECS
快照+Rsync
同步元数据的方式,详见 k8s元数据备份方案。
Ingress 相关问题
Http 413 请求实体过大
两种解决方式:
为 ingress
规则添加注解(annotation
):
nginx.ingress.kubernetes.io/proxy-body-size: 100m
调整 ingress
控制器 configmaps
的参数
ingress controller configmaps
proxy-body-size: "100m"
Http 504 网关超时问题
默认超时时间 60s
,了可以调整超时参数:
annotation:
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
nginx.ingress.kubernetes.io/proxy-connect-timeout: "300"
gzip 重复压缩问题
返回多个 HTTP vary
头部。
# 关闭SLB 或者 ingress gzip 压缩。
# ingress 控制器 添加 configmaps 参数。
# use-gzip: 'false'
SLB 健康检查日志问题
K8S集群的 default svc
承担外部的SLB
健康检查功能,由于外部SLB
数量较多,
用于监控的/check.html
日志每分钟近千条,这些日志无效且占用大量磁盘空间,关闭它们。
# disable access log
# annotations:
# nginx.ingress.kubernetes.io/enable-access-log: "false"
参考
- https://github.com/kubernetes/kubernetes/issues/60807
- websockets
- custom-timeouts
- 亲和性与反亲和性
- pod亲和性与反亲和性的topologyKey