維護 K8s 集羣,證書過期問題是繞不過去的坎,特別是控制平面,嚴重依賴一套 PKI 證書來保證組件間的安全通信,而一旦核心證書過期(如 APIServer),無論使用雲方案還是私有化部署,都可能導致 APIServer 拒絕連接,Kubelet 節點失聯等。

一、查看證書

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text  | grep Not

k8s證書過期問題解決_安全通信

二、檢測證書是否過期?

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 服務來調用腳本。