问题描述
虚拟机挂起恢复后,corednsPod始终处于CreshLoopBackOff,如下图所示:
问题定位
首先对pod进行describe,并查看日志,查看节点状态。
kubectl describe po coredns-ff77c979f-f6qfb -n kube-system
【输出结果】可以看出Pod一直没有起来,存存活探针检验失败。
接下来查看一下该Pod的日志
kubectl logs coredns-ff77c979f-f6qfb -n kube-system
【输出结果】可以看处443端口没有连接上,推测是apiserver没连接上。
kubectl get svc -A | grep 443
【输出结果】Pod的服务服务端口是443
查看kubernetes的svc的yaml文件
kubectl get svc kubernetes -o yaml
【输出结果】
打印节点信息,发现各节点连接状况良好,均处于Ready状态。并且从windows命令行telnet 6443端口没有问题可以访问。
综合上述信息可以推断出网络插件flannel出问题。flannel的作用是Pod之间进行通信的插件,并进行node地址段分配。
【输出结果】flannel容器的日志信息
进一步证明,flannel网络出现问题。
注意:此处一定要打印node上的那个flannel Pod,因为之前的coredns报错是在node上的pod无法连接。
重启flannel,尝试重启虚拟网卡。结果flannel日志报错
解决方法
通过网上查阅资料,通过如下方法解决最稳妥。不需要重新安装flannel,也不需要重新启动集群。
- 删除node1上的flannel虚拟网卡设备
ip link delete flannel.1
- 删除node1上对应的flannel容器
kubectl get po -o wide #查看node1对应的flannel pod
kubectl delete po kube-flannelxxx-xxxx -n kube-system #删除flannel Pod
- 等flannel Pod恢复后,删除节点对应的 coredns Pod,容器启动可能有些慢,原因是flannel容器网络服务可能尚未就绪,可重复delete操作,直至容器恢复。
kubectl delete po corednsxxx-xxxx -n kube-system
4.重复该步骤在master节点上,Crash容器即可恢复
PS:特别感谢管理员群友@戏子 的支持!