测试 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