现象:
创建、删除或重建 Pod 后,等待很长时间(小时级别),kubectl get pods 显示 Pod 的 Status 一直是 Creating、Terminating 状态,进而导致 Service 长时间不可用;
在 Pod 调度到的节点上,执行 docker ps |grep xxx 命令,可以看到 Creating 的 Pod 容器已实际 Running 一段时间了;
原因:
kubelet 周期(1s)向 docker 查询各容器的状态、配置参数、image 是否存在、image 版本等信息;
kubelet 将查询的结果发给 kube-apiserver,以更新 Pod 的状态,这个发送过程受多个 QPS 参数控制;
kubelet 的 QPS 配置参数: --event-qps 、–kube-api-qps、–event-burst、–kube-api-burst 默认值分别为 5、5、10、10 ;
当节点 Pod 数目过多(200+),Pod 状态更新时间非常频繁时,kubelet 的默认 QPS 值成为瓶颈,导致 Pod 状态不能及时更新到 kube-apiserver。查看 Pod 的 Status时, 一直处于 Creating、Terminating 状态,进而导致 Service 长时间不可用;
解决办法:
调大 kubelet 的 QPS 配置参数:
--event-qps=0
--kube-api-qps=2000
--kube-api-burst=4000
--registry-qps=0
参考:
https://github.com/kubernetes/kubernetes/issues/39113#issuecomment-305919878