更新k8s集群的證書


k8s集群的證書包括master節點相關證書(apiserver、etcd、proxy)和node節點相關證書(kubelet),默認的有效期都是1年。兩類證書的更新方式有所不同。

一、更新master節點相關證書

1.首先,在master節點上執行:

openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt

查看證書的有效期。apiserver.crt可以換成同路徑下的其他crt文件。

然后,將/etc/kubernetes/pki文件夾備份一下后,在master節點上執行:

kubeadm alpha certs renew all

之后,再執行openssl命令,查看證書有效期是否更新。

2.在master節點上將/etc/kubernetes目錄下的所有配置文件備份,然后執行:

kubeadm alpha kubeconfig user --client-name=admin
kubeadm alpha kubeconfig user --org system:masters --client-name kubernetes-admin  > /etc/kubernetes/admin.conf
kubeadm alpha kubeconfig user --client-name system:kube-controller-manager > /etc/kubernetes/controller-manager.conf
kubeadm alpha kubeconfig user --org system:nodes --client-name system:node:$(hostname) > /etc/kubernetes/kubelet.conf
kubeadm alpha kubeconfig user --client-name system:kube-scheduler > /etc/kubernetes/scheduler.conf

3.用更新后的admin.conf替換/root/.kube/config文件。

如果出現

Unable to connect to the server: x509: certificate is valid for xxxx, not xxxx

的報錯,就需要修改/root/.kube/config文件中的cluster.server字段,將其改為master的kubelet監聽的ip。這種問題發生在多網卡的情況下。

4.重啟所有master節點上的apiserver和scheduler兩個系統組件。靜態pod的情況見下。

二、更新kubelet相關證書

kubelet的證書通過修改kubelet啟動參數配置為自動更新。

1.首先,在master節點上,修改controller manager組件的參數,增加:

kube-controller-manager --experimental-cluster-signing-duration=87600h  --feature-gates=RotateKubeletClientCertificate=true

這兩個參數。

對於controller manager運行在靜態pod中的情況,在/etc/kubernets/manifests目錄下編輯controller manager的yaml文件,在啟動命令下增加這兩項參數。

然后,將此yaml文件移出/etc/kubernets/manifests目錄,等幾秒鍾,再移回來,controller manager的靜態pod就會自動重啟。

注意,不要直接通過kubectl edit修改靜態pod。

對於controller manager運行在物理機上的情況,與下面kubelet的操作類似。

2.在所有節點上,修改kubelet的systemctl的啟動命令。在CentOS中位於/etc/systemd/system/kubelet.service.d中,增加:

kubelet --feature-gates=RotateKubeletClientCertificate=true  --cert-dir=/var/lib/kubelet/pki --rotate-certificates  --rotate-server-certificates 

四項參數。

然后執行:

systemctl daemon-reload
systemctl restart kubelet

kubelet正常運行了,則證書更新完成。

三、更新csr資源

執行完以上兩步后,集群可能會出現日志無法查看的情況。執行kubectl logs時,報:

Error from server: Get https://xxx:10250/containerLogs/xxx remote error: tls: internal error

這里需要認證一下csr,即certificatesigningrequests,是kubelet向master節點發送的證書認證請求。

執行kubectl get csr,發現有大量的csr處於Pending狀態。將這些csr認證通過:

kubectl certificate approve [name]

一一更新后,再查看狀態時變為Approved,Issued。此后,再執行kubectl logs就正常了。

四、更新secret

集群中與etcd相關的secret會用到etcd的證書作為字段。這些secret需要根據新生成的etcd證書進行更新。

用kubectl get secret -n kube-system | grep etcd找出所有與etcd相關的secret資源,將里面的xxx.crt和xxx.key字段分別替換為位於/etc/kubernetes/pki/etcd下的,server.crt和server.key經過base64加密后的字符串。

之后,重啟etcd和使用到secret的各組件即可。

五、重啟apiserver

在所有事情都做完后,最后再重啟一下所有master節點上的apiserver組件,不然prometheus上的證書告警可能不會消除。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM