維護 K8s 集羣,證書過期問題是繞不過去的坎,特別是控制平面,嚴重依賴一套 PKI 證書來保證組件間的安全通信,而一旦核心證書過期(如 APIServer),無論使用雲方案還是私有化部署,都可能導致 APIServer 拒絕連接,Kubelet 節點失聯等。
一、查看證書
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not
二、檢測證書是否過期?
1、在集羣 Master 節點上,運行以下命令查看證書的過期時間:
kubeadm certs check-expiration
該命令會列出所需要續期的證書及過期日期:
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Aug 05, 2025 12:11 UTC 91d ca no
apiserver Aug 05, 2025 12:11 UTC 91d ca no
apiserver-etcd-client Aug 05, 2025 12:11 UTC 91d etcd-ca no
apiserver-kubelet-client Aug 05, 2025 12:11 UTC 91d ca no
2、手動檢查
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
三、證書續期
如果證書即將過期,可以使用 kubeadm 命令來續期證書
kubeadm certs renew all
- 如果遇到問題,可以嘗試使用腳本來延長證書的有效期
證書續期後,需要重啓所有節點上的 kubelet 服務才能使新證書生效:
sudo systemctl daemon-reload
sudo systemctl restart kubelet
四、驗證證書是否更新
在完成以上步驟,再次運行 kubeadm certs check-expiration 命令,驗證證書的是否已經更新。
五、腳本的角度
可以將證書的問題寫進一個腳本里:
#!/bin/bash
echo"## 到期前續期 ##"
/usr/local/bin/kubeadm certs check-expiration
echo"## 通過 kubeadm 來續期證書 ##"
/usr/local/bin/kubeadm certs renew all
echo"## 通過 kubeadm 來重啓平面中的 Pods 節點 ##"
/usr/local/bin/crictl pods --namespace kube-system --name 'kube-scheduler-*|kube-controller-manager-*|kube-apiserver-*|etcd-*' -q | /usr/bin/xargs /usr/local/bin/crictl rmp -f
echo"## 更新 /root/.kube/config ##"
cp /etc/kubernetes/admin.conf /root/.kube/config
echo"## 等待 apiserver 重新啓動 ##"
until printf"" 2>>/dev/null >>/dev/tcp/127.0.0.1/6443; dosleep 1; done
echo"## Expiration after renewal ##"
/usr/local/bin/kubeadm certs check-expiration
可以通過創建 system 服務來調用腳本。