今天将K8s启动后,用
kubectl get pod -n kube-system
查看节点,发现两个coredns都处在CrashLoopBackOff状态,记录下解决方案
先查看自己的coredns版本,低版本CoreDNS(1.4及之前的版本)存在的以下两个问题,影响了ACK 1.16以前版本集群内域名解析服务的稳定性:
- 因为CoreDNS需要通过watch apiserver拿到Service数据,所以health插件会检查CoreDNS与apiserver的连通性。如果连通性不正常(如网络抖动、apiserver重启等情况),健康检查接口会报错。CoreDNS在3次健康检查失败后会重启,重启过程中将导致服务不可以用。
- CoreDNS会受到klog缺陷的影响:CoreDNS与apiserver断连后,klog尝试向一个不存在的目录/tmp写错误日志,此行为会失败并进一步导致CoreDNS不可用。
kubectl get deployment coredns -n kube-system -o jsonpath="{.spec.template.spec.containers[0].image}"
可以查看coredns的版本
升级步骤
变更CoreDNS配置项
# 打开编辑。
kubectl edit configmap/coredns -n kube-system
# 替换proxy字段为forward
# 保存并退出
变更CoreDNS应用
# 打开编辑。
kubectl edit deployment/coredns -n kube-system
# 变更镜像版本到1.6.2
# 保存并退出
完成后再次使用kubectl get deployment coredns -n kube-system -o jsonpath="{.spec.template.spec.containers[0].image}"
查看coredns的版本,现在可以看到版本变为1.6.2
依然出错
在我将上面步骤执行完成后,出现更奇怪的错误,本来两个coredns都不能运行,现在只有一个不能运行,另一个可以运行,我开始在网上查找解决方法,发现都是关闭防火墙,清空防火墙的规则,这些我跟着试,发现还是不行,我开始看两个节点的区别
原来上述清空防火墙规则,关闭防火墙要在pod的相应节点上进行,我重新在k8s-node04上执行命令
systemctl disable firewalld
systemctl stop firewalld
systemctl reboot
systemctl stop kubelet
systemctl stop docker
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
ip6tables -t nat -F
ip6tables -t mangle -F
ip6tables -F
ip6tables -X
ip6tables -P INPUT ACCEPT
ip6tables -P FORWARD ACCEPT
ip6tables -P OUTPUT ACCEPT
$ systemctl stop kubelet
$ systemctl stop docker
$ iptables --flush
$ iptables -tnat --flush
$ systemctl start kubelet
$ systemctl start docker