kubernetes集群證書過期問題解決
- 問題描述
- 檢查證書是否過期
- 更新證書
- master節點操作
- node節點操作
問題描述
K8S 各個組件需要與 api-server 進行通信,通信使用的證書都存放在 /etc/kubernetes/pki 路徑下,kubeadm 生成的證書大部分默認有效期為 1 年,因此需要定時更新證書,否則證書到期會導致整個集群不可用
檢查證書是否過期
通過kubeadm certs check-expiration
命令來檢查集群里的證書是否過期,其中EXPIRES
為過期時間, RESIDUAL TIME
表示還有多久過期
(我這里因為已經更新過了,所以時間顯示都是沒過期的)
root@master:/etc/kubernetes/pki# kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W0617 12:40:58.742236 1515160 utils.go:69] The recommended value for "resolvConf" in "KubeletConfiguration" is: /run/systemd/resolve/resolv.conf; the provided value is: /run/systemd/resolve/resolv.confCERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Mar 05, 2025 02:53 UTC 260d ca no
apiserver Mar 05, 2025 02:52 UTC 260d ca no
apiserver-etcd-client Feb 22, 2025 02:10 UTC 249d etcd-ca no
apiserver-kubelet-client Feb 22, 2025 02:10 UTC 249d ca no
controller-manager.conf Mar 05, 2025 02:53 UTC 260d ca no
etcd-healthcheck-client Feb 22, 2025 02:10 UTC 249d etcd-ca no
etcd-peer Mar 05, 2025 02:53 UTC 260d etcd-ca no
etcd-server Mar 05, 2025 02:53 UTC 260d etcd-ca no
front-proxy-client Feb 22, 2025 02:10 UTC 249d front-proxy-ca no
scheduler.conf Mar 05, 2025 02:53 UTC 260d ca noCERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Feb 20, 2034 02:10 UTC 9y no
etcd-ca Feb 20, 2034 02:10 UTC 9y no
front-proxy-ca Feb 20, 2034 02:10 UTC 9y no
如果你的kubernetes不是通過kubeadm部署的,或者因為其他原因導致上述命令無法使用,可以使用openssl命令,也可以查看證書的過期時間
# 進入kubernetes中存放證書的目錄
root@master:/# cd /etc/kubernetes/pki
root@master:/etc/kubernetes/pki# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not 'Not Before: Feb 23 02:10:47 2024 GMTNot After : Mar 5 02:52:58 2025 GMT
更新證書
master節點操作
1.證書備份(更改任何系統文件之前,都建議先備份)
cp -r /etc/kubernetes /etc/kubernetes-$(date +%Y-%m-%d).bak
cp -r /var/lib/kubelet /var/lib/kubelet-$(date +%Y-%m-%d).bak
2.刪除舊的過期的證書
有些證書是十年才過期的,就不需要刪除,我這里通過上述方式查看是以下這些證書即將或者已經過期的
cd /etc/kubernetes/pki
rm -rf apiserver-etcd-client.*
rm -rf apiserver-kubelet-client.*
rm -rf etcd/healthcheck-client.*
rm -rf front-proxy-client.*
3.重新生成新的證書
上面刪除了哪些證書便重新生成哪些證書
kubeadm init phase certs apiserver-etcd-client
kubeadm init phase certs apiserver-kubelet-client
kubeadm init phase certs etcd-healthcheck-client
kubeadm init phase certs front-proxy-client
4.重新生成kubeconfig文件
cd /etc/kubernetes
rm -f admin.conf kubelet.conf controller-manager.conf scheduler.conf
kubeadm init phase kubeconfig all
#覆蓋默認的配置文件
cp /etc/kubernetes/admin.conf $HOME/.kube/config
5.重啟docker和kubelet
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet
6.刪除node節點
這里跟上篇更換集群IP一樣,因為node節點的證書問題處理比較麻煩,我這里選擇之間重新加入集群,重新頒發證書(如果你有更好的方式,可以不這么做)
kubectl delete node node1
kubectl delete node node2
node節點操作
1.備份要更改的文件,在更改每個配置文件前,最好先備份
cp -r /etc/kubernetes{,-$(date +%Y-%m-%d).bak}
cp -r /var/lib/kubelet/pki{,-$(date +%Y-%m-%d).bak}
2.重置kubernetes配置
kubeadm reset -f
3.重啟服務器
reboot
4.重新加入master節點所在的kubernetes集群(因為node節點的證書問題處理起來有點麻煩,所以直接重新加入簡單點)
#先在master節點生成加入口令
kubeadm token create --print-join-command
#在node節點上執行kuberadm join命令
kubeadm join 10.98.99.140:6443 --token ne2dbu.74etnc2273wx6ysg --discovery-token-ca-cert-hash sha256:bd373617bc307f5192cb38ab0d0ccd261d95d6aa4c64a97d4c1acf1f7ffa02cd