5 kubelet證書自動續簽
如果kubelet證書到期,kubelet將無法使用過期的證書連接apiserver,從而導致kubelet無法正常工
作,日志會給出證書過期錯誤(x509: certificate has expired or is not yet valid)。
5.1 說明
1 證書分類
K8s證書一般分為兩套: K8s組件(apiserver)和Etcd,假如按角色來分,證書分為管理節點和工作節點。
(1) 管理節點: 如果是kubeadm部署則自動生成,如果是二進制部署一般由cfssl或者openssl生成。
(2) 工作節點: 工作節點主要是指kubelet連接apiserver所需的客戶端證書,這個證書由
kube-controller-manager組件自動頒發。
2 kubeadm部署證書說明
(1) master配置
etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kubectl、kubelet、kube-proxy
(2) node配置
3 二進制部署證書說明
(1) etcd配置
(2) master配置
kube-apiserver、kube-controller-manager、kube-scheduler、kubectl、kubelet、kube-proxy
(3) node配置
kubelet、kube-proxy
(4) 原始證書目錄(非常重要,一定要備份)
4 證書過期
(1) kubeadm部署
官方文檔: https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/
由kubeadm生成的客戶端證書在1年后到期,ca是10年。
檢查證書是否過期:
# kubeadm certs check-expiration
注:
該命令顯示 /etc/kubernetes/pki 文件夾中的客戶端證書以及 kubeadm(admin.conf, controller-manager.conf 和
scheduler.conf)使用的 KUBECONFIG 文件中嵌入的客戶端證書的到期時間/剩余時間。
上面的列表中沒有包含 kubelet.conf,因為 kubeadm 將 kubelet 配置為自動更新證書。輪換的證書位於目錄 /var/lib/kubelet/pki。
(2) 二進制部署
二進制部署etcd、k8s組件的ca證書時間為10年,由於cfssl工具的限制,ca證書只有5年的期限
,相應簽發的客戶端證書也只有5年期限,但也夠用了。
紅線:K8s自建證書頒發機構(CA),需攜帶由它生成的客戶端證書訪問apiserver。
藍色:Etcd自建證書頒發機構(CA),需攜帶由它生成的客戶端證書訪問etcd。
2 查看證書有效期的方法
比如查看kubeadm方式部署的kubelet證書過期時間:
# cd /var/lib/kubelet/pki/
# openssl x509 -in kubelet-client-current.pem -noout -dates
5.2 kubeadm部署k8s環境下kubelet證書自動續簽
官方文檔: https://kubernetes.io/zh/docs/tasks/tls/certificate-rotation/
1 配置kube-controller-manager組件(master節點)
# vim /etc/kubernetes/manifests/kube-controller-manager.yaml
- --experimental-cluster-signing-duration=87600h0m0s
# kubelet客戶端證書頒發有效期設置為10年
- --feature-gates=RotateKubeletServerCertificate=true
# 啟用server證書頒發
# 啟用server證書頒發配置完成后,重建pod使之生效
# kubectl delete pod kube-controller-manager-k8s-master1 -n kube-system
注: 如果你運行了一個 HA 集群,以上操作需要在所有控制面板節點上執行
2 配置kubelet組件(node節點)
# vim /var/lib/kubelet/config.yaml
# 默認kubelet證書輪轉已經啟用
rotateCertificates: true
注:
kubelet證書輪詢只能在kubelet證書沒有過期之前操作,如果kubelet證書已經過期,那么kubelet證書輪轉就
不起作用了,並且kubelet服務也無法運行。
3 測試
(1) 找一台測試node節點,查看現有客戶端證書有效期
# cd /var/lib/kubelet/pki/
# openssl x509 -in kubelet-client-current.pem -noout -dates
(2) 修改服務器時間,模擬kubelet證書即將到期
# date
Mon Sep 27 16:15:12 CST 2021
# date -s "2022-08-20"
# date
Sat Aug 20 00:00:01 CST 2022
(3) 重啟kubelet服務
# systemctl restart kubelet.service
(4) 再次查看證書有效期,發現已經變成十年了
# openssl x509 -in kubelet-client-current.pem -noout -dates
注: 我服務器的時間已經設置為了2022-08-20,但是kubelet證書的起始時間是2021-09-27
(今天的確切日期),說明證書有效期的起始時間不是根據kubelet所在服務器時間計算的,
是由kube-controller-manager所在服務器時間決定的。如果node服務器時間發生改變,
那么在該node上的pod容器時間也會跟着發生變化。
4 k8s其它組件證書有效期續簽
(1) 查看證書有效期
[root@k8s-master1 ~]# kubeadm certs check-expiration
注: 我們可以看到除kubelet客戶端證書之外其它k8s組件證書有效期還剩330天。
(2) 續簽證書
[root@k8s-master1 ~]# kubeadm alpha certs renew all
(3) 重啟kube-apiserver, kube-controller-manager, kube-scheduler and etcd服務應用新的證書
1) 查看相應pod名
2) 重啟相應服務
[root@k8s-master1 ~]# kubectl delete pod/kube-apiserver-k8s-master1 -n kube-system
[root@k8s-master1 ~]# kubectl delete pod/kube-controller-manager-k8s-master1 -n kube-system
[root@k8s-master1 ~]# kubectl delete pod/kube-scheduler-k8s-master1 -n kube-system
[root@k8s-master1 ~]# kubectl delete pod/etcd-k8s-master1 -n kube-system
(4) 再次查看證書有效期限
[root@k8s-master1 ~]# kubeadm certs check-expiration
注: 由於ca證書有效期為10年,所以客戶端證書續簽最長有效期也為10年。
(5) 注: 如果你運行了一個 HA 集群,以上操作需要在所有控制面板節點上執行。
5.3 二進制部署k8s環境下kubelet證書自動續簽
二進制部署etcd、k8s組件的ca證書時間為10年,由於cfssl工具的限制,ca證書只有5年的期限
,相應簽發的客戶端證書也只有5年期限,所以在5年之前不會出現證書過期的問題。
查看節點證書:
[root@k8s-node2 ~]# cd /opt/kubernetes/ssl
[root@k8s-node2 ssl]# openssl x509 -in kubelet-client-current.pem -noout -dates