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上的證書告警可能不會消除。