Kubernetes - 记一次所有机器重启导致的集群问题

最近给客户部署的集群由于机器重启集群不能启动,首先执行kubectl get node,发现没有可用的node,于是去看centos的系统日志/var/log/message,日志中有x509,证书无效或已过期,心想,为啥重启集群会导致证书错误?且先记录下:

x509,证书错误,无效或已过期

于是从集群的基础从底层往上查,k8s将集群的信息会记录在etcd中,而各个节点由flannel分配的docker子网段信息也存储在etcd中,所以我们先从etcd查起,然后查flannel,最后查k8s,集群层次结构如下图:

Kubernetes - 记一次所有机器重启导致的集群问题_第1张图片 k8s集群层次简图

查etcd,发现etcd的集群日志也有报告加密证书错误,那重新生成一遍证书,重启etcd集群,使其使用新证书,这个时候出现了新的问题,etcd集群报告各个节点的时间差距太大,超过1s的容错范围,etcd使用了raft算法,选举leader过程中,会使用日志和日志记录的时间,如果各个节点时间差距超过1s,那么选举过程就会一直不成功,集群也一直不能正常启动。

既然由于各个节点时间差距较大,那就用ntp server都校正一下,但由于客户集群环境是纯内网,与互联网隔绝,无法使用网络校正。于是在master节点上离线安装ntp server,并配置使用本机时间,设置开机启动,其他node节点都安装ntp client,在cron中写入每天固定时间与master校正时间:

ntpdate master_ip

校正同一时间后,etcd集群正常了,检查flannel也正常:

etcdctl --endpoints="${ETCD_ENDPOINTS}" \
  --ca-file=/etc/kubernetes/ssl/ca.pem \
  --cert-file=/etc/kubernetes/ssl/kubernetes.pem \
  --key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
  ls /kube-centos/network/subnets

重启kube-apiserver和kubelet,发现kubectl get node还是返回各个node都无效,查看Master节点系统日志:tail -f /var/log/message,发现日志中还是报告x509,然后查看各个证书:

kubectl get ca

发现仍然都显示invalid,于是重新把k8s的安装过程都重新走了一遍,集群恢复正常。正常后,才恍然大悟,证书过期也许是计算机的时间由于机器重启重新从bios读取了,导致证书中设置的有效期过期。

希望遇到这个问题的同学别走弯路,一开始的日志x509就是原因所在,不过没有马上意识到,后知后觉。

你可能感兴趣的:(docker,云计算,kubernetes,容器云)