本文共 1910 字,大约阅读时间需要 6 分钟。
今天突然测试环境的Kubernetes 持续集成/持续发布出了问题了,然后上测试环境服务器排查,发现kubectl
指令执行出现问题,提示证书过期。错误信息显示为:Unable to connect to the server: x509: certificate has expired or is not yet valid
。详细分析发现,这个问题源于Kubernetes API服务器与Kubelet服务之间的通信中,证书验证功能未能及时更新。
为了解决这个问题,进行了以下操作:
备份现有配置文件和证书:
cp -rf
命令将/etc/kubernetes
目录复制到/etc/kubernetes_bak
。/etc/kubernetes/pki/apiserver.*
、front-proxy-client.*
以及相关的配置文件(如admin.conf
、kubelet.conf
等),以确保旧的证书文件不再影响新的部署。生成新的证书和配置文件:
cd ~/kuberneteskubeadm alpha phase certs apiserver-kubelet-clientkubeadm alpha phase certs front-proxy-clientkubeadm alpha phase kubeconfig all --config config.yaml
重启相关服务:
systemctl restart kubeletsystemctl restart docker
验证和测试:
openssl
命令检查了新生成证书的有效日期,并确保它们的有效期超过当前时间。-重新运行了kubectl get node -o wide
,观察到节点状态显示为“Ready”,表明集群服务已正常恢复。除了解决API服务器和Kubelet证书过期问题,ETCD集群的证书也需要及时更新。采取的解决步骤类似于Kubernetes集群的处理:
备份ETCD数据:
tar
命令备份了/var/lib/etcd/
目录:cd /var/libtar -zvcf etcd.tar.gz etcd/
重新生成ETCD证书:
cfssl gencert
工具生成新的ETCD证书和密钥文件:rm -rf /etc/etcd/ssl/*cd /root/sslcfssl gencert -initca ca-csr.json | cfssljson -bare ca ca.pem ca-key.pem -config ca-config.json -profile kubernetes-Soulmatecfssljson -bare etcd-cert etcd.pem etcd-key.pem -config etcd-config.json -profile kubernetes-Soulmatescp -r /etc/etcd/ssl/*.pem node02:/etc/etcd/ssl/scp -r /etc/etcd/ssl/*.pem node03:/etc/etcd/ssl/
验证ETCD证书:
openssl
确认新生成证书的有效日期,并确保它们仍在有效期内:[root@node01 ssl]# openssl x509 -in etcd.pem -noout -text | grep 'Not'Not Before: Oct 8 13:49:00 2020 GMTNot After : Oct 8 13:49:00 2021 GMT
通过以上步骤,成功避免了由于证书过期导致的服务中断问题。这一过程遵循了Kubernetes官方推荐的证书管理流程,即定期生成和部署新的证书,以确保集群的安全运行。
转载地址:http://qkgkk.baihongyu.com/