事故说明:
k8s集群资源有限,在同一时刻内进行大量滚动升级。造成整个集群cpu,io,内存同一时刻飙到最高,导致集群里面4台机器死机,需要人手重启,重启后,对应的calico pod 出现 pullImageErr的状态。
处理步骤
1,尝试删除calico pod,没有任何帮助
2,登录calico pod ,用docker images没有发现calico镜像,利用docker pull重新拉取,docker没有执行任何拉取,直接报镜像 is update to date. 用docker rmi删除镜像,又报无法认得镜像
3,利用systemctl status docker -l ,显示calico镜像某些层不存在。
4,通过 systemctl status docker -l 定位到docker 存放文件的地方,例如在 /data/docker,先systemclt stop docker停调docker服务,利用rm -rf /data/docker把该文件夹里面的所有文件删除,再重启systemclt start docker,用docker images和docker ps没有查询到任何记录。
5,回到 master节点,删除没有办法启动的 calico pod ,触发重新建pod,重新触发拉取镜像,此时可以选择等待,也可以直接去到对应的node节点手动拉取对应的镜像。
6,如果一切正常calico pod 转变成running状态,利用calicoctl node status可以看到对应的节点已经建立了连接
7,此时以为已经排除了故障,但发现 coreDns的pod 一直是crash状态,利用kubectl log 查看日志,发现出现如下提示
github.com/coredns/coredns/plugin/kubernetes/controller.go:317: Failed to list *v1.Endpoints timeout
在网上尝试了多种方法,都没有办法解决
8,最后找到建立coreDns和calico的yaml,直接kubectl delete -f 删除全部的calico pod和 coreDns pod,删除过程中遇到了机器僵死情况,直接重启了机器。
9, 机器重启后,发现整个集群所有节点都是notready状态,利用systemcl status kube-proxy,发现kube-proxy无法连接到虚拟IP,我们的集群是通过连接keepalive来做master负载均衡的,这个虚拟IP就是keepalive里面的来源,目标就是对应的master节点的IP。运行相应的命令在对应的master节点绑定虚拟IP
10,绑定后一切正常,coreDns正常重建,calico pod也正常,整个集群恢复