背景
Kubelet 使用證書進行 Kubernetes API 的認證。 默認情況下,這些證書的簽發期限為一年,所以不需要太頻繁地進行更新。
kubernetes 1.8版本中包含beta特性kubelet證書輪換, 在當前證書即將過期時,將自動生成新的秘鑰,並從 Kubernetes API 申請新的證書。 一旦新的證書可用,它將被用於與 Kubernetes API 間的連接認證。
問題說明
kubelet證書默認有效期是一年,這樣一年之后我們的node節點就會處於not ready的狀態,為了避免這個問題就需要想一個解決方案。
curl -s -L -o /bin/cfssl-certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod a+x /bin/cfssl-certinfo
cfssl-certinfo -cert /etc/kubernetes/ssl/kubelet.crt
解決方案一
證書替換
使用admin證書替換kubelet證書。
備份 mkdir ~/sslback && mv /etc/kubernetes/kubelet.kubeconfig ~/sslback/
使用admin證書文件替換
cp ~/.kube/config /etc/kubernetes/kubelet.kubeconfig
systemctl restart kubelet && systemctl status kubelet
重新請求證書
手動簽發,在 kubelet 首次啟動后,如果用戶 Token 沒問題,並且 RBAC 也做了相應的設置,那么此時在集群內應該能看到 kubelet 發起的 CSR 請求 ,必須通過后kubernetes 系統才會將該 Node 加入到集群。
在證書過期node刪除kubelet相關證書文件
rm -rf /etc/kubernetes/kubelet.kubeconfig
rm -rf /etc/kubernetes/ssl/kubelet.*
systemctl restart kubelet && systemctl status kubelet
自動生成了kubelet kubeconfig 文件和公私鑰
查看未授權的CSR請求
kubectl get csr
通過CSR 請求:
kubectl certificate approve csr
查看重新生成的證書文件
ll /etc/kubernetes/ssl/kubelet.*
kubectl get nodes --show-labels
# 預防方案
kubelet 進程接收 --rotate-certificates 參數,該參數決定 kubelet 在當前使用的 證書即將到期時,是否會自動申請新的證書
kube-controller-manager 進程接收 --cluster-signing-duration 參數 (在 1.19 版本之前為 --experimental-cluster-signing-duration),用來 控制簽發證書的有效期限。
# 理解證書輪換配置
當 kubelet 啟動時,如被配置為自舉(使用--bootstrap-kubeconfig 參數),kubelet 會使用其初始證書連接到 Kubernetes API ,並發送證書簽名的請求。 可以通過以下方式查看證書簽名請求的狀態:
kubectl get csr
最初,來自節點上 kubelet 的證書簽名請求處於 Pending 狀態。 如果證書簽名請求滿足特定條件, 控制器管理器會自動批准,此時請求會處於 Approved 狀態。 接下來,控制器管理器會簽署證書, 證書的有效期限由 --cluster-signing-duration 參數指定,簽署的證書會被附加到證書簽名請求中。
Kubelet 會從 Kubernetes API 取回簽署的證書,並將其寫入磁盤,存儲位置通過 --cert-dir 參數指定。 然后 kubelet 會使用新的證書連接到 Kubernetes API。
當簽署的證書即將到期時,kubelet 會使用 Kubernetes API,發起新的證書簽名請求。 同樣地,控制器管理器會自動批准證書請求,並將簽署的證書附加到證書簽名請求中。 Kubelet 會從 Kubernetes API 取回簽署的證書,並將其寫入磁盤。 然后它會更新與 Kubernetes API 的連接,使用新的證書重新連接到 Kubernetes API。