1、概述
Kubelet 使用證書進行 Kubernetes API 的認證。 預設情況下,這些證書的簽發期限為一年,所以不需要太頻繁地進行更新。Kubernetes 包含特性 Kubelet 證書輪換, 在當前證書即將過期時, 將自動生成新的秘鑰,並從 Kubernetes API 申請新的證書。 一旦新的證書可用,它將被用於與 Kubernetes API 間的連線認證。
注意: 要求 Kubernetes 1.8.0 或更高的版本。
2、啟用客戶端證書輪換
Kubelet 程序接收 --rotate-certificates 引數,該引數決定 Kubelet 在當前使用的 證書即將到期時,是否會自動申請新的證書。
kube-controller-manager 程序接收 --cluster-signing-duration 引數 (在 1.19 版本之前為 --experimental-cluster-signing-duration),用來控制簽發證書的有效期限。
- experimental-cluster-signing-duration=87600h0m0s # kubelet客戶端證書頒發有效期設定為10年
- feature-gates=RotateKubeletServerCertificate=true # 啟用server證書頒發
注意 1:當前環境是k8s 1.21.5,Kubelet客戶端證書輪換功能是預設開啟的。
3、理解證書輪換配置
當 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,自動發起新的證書籤名請求。 該請求會發生在證書的有效時間剩下 30% 到 10% 之間的任意時間點。 同樣地,控制器管理器會自動批准證書請求,並將簽署的證書附加到證書籤名請求中。 Kubelet 會從 Kubernetes API 取回簽署的證書,並將其寫入磁碟。 然後它會更新與 Kubernetes API 的連線,使用新的證書重新連線到 Kubernetes API。
在 Kubernetes 叢集的安全配置中,元件之間的通訊需要進行認證和授權,以確保叢集的安全。Kubelet 作為節點上的關鍵元件,需要與 Kubernetes API Server(API 伺服器)進行安全通訊。這種通訊通常透過 TLS 證書來實現加密和身份驗證。然而,在叢集初始化或節點加入叢集的過程中,Kubelet 可能還沒有被頒發有效的 TLS 證書。這時,Kubelet 可以採用自舉(Bootstrap)機制來獲取證書。自舉機制允許 Kubelet 使用一個臨時的、低許可權的證書(或引導令牌token;或 kubeconfig 檔案,其中包含了連線 API 伺服器的配置資訊,包括證書和金鑰)來啟動,並請求 API 伺服器為其頒發一個長期有效的、許可權更高的證書。
當 Kubelet 啟動時,如果它被配置為自舉(這通常透過 --bootstrap-kubeconfig 引數實現,該引數指定了包含臨時證書和 API 伺服器地址的 kubeconfig 檔案),它會使用這個檔案中的初始證書來連線到 Kubernetes API 伺服器。一旦連線成功,Kubelet 會向 API 伺服器傳送一個證書籤名請求(Certificate Signing Request, CSR)。這個 CSR 包含了 Kubelet 的身份資訊以及它希望獲得的證書的資訊(如有效期、用途等)。
API 伺服器收到這個 CSR 後,建立CSR資源物件,控制器會根據叢集的證書頒發策略(如是否允許自動批准來自特定節點的 CSR)來處理它。如果 CSR 被批准,控制器會使用叢集的證書頒發機構(Certificate Authority, CA)來簽署這個請求,生成一個新的證書,並將這個證書返回給 Kubelet。Kubelet 收到新證書後,會使用它來替換初始的臨時證書,從而以更高的許可權和安全性與 API 伺服器進行後續的通訊。
注意 2:Kubernetes使用CertificateSigningRequest方式簽發客戶端證書詳細步驟參見《Kubernetes客戶端認證(三)—— Kubernetes使用CertificateSigningRequest方式簽發客戶端證書》這篇博文。
4、測試
(1)找一臺測試node節點,檢視現有客戶端證書有效期
[root@member-cluster1-worker1 ~]# cd /var/lib/kubelet/pki/ [root@member-cluster1-worker1 pki]# ls kubelet-client-2024-07-01-12-00-25.pem kubelet-client-current.pem kubelet.crt kubelet.key [root@member-cluster1-worker1 pki]# openssl x509 -in kubelet-client-current.pem -noout -dates notBefore=Jul 1 03:55:22 2024 GMT notAfter=Jun 29 03:55:22 2034 GMT
(2)修改伺服器時間,模擬kubelet證書即將到期
[root@member-cluster1-worker1 pki]# date 2024年 09月 05日 星期四 18:35:40 CST [root@member-cluster1-worker1 pki]# date -s "2034-6-22" 2034年 06月 22日 星期四 00:00:00 CST
(3)重啟Kubelet服務
[root@member-cluster1-worker1 pki]# systemctl restart kubelet
(4)再次檢視證書有效期
注意 1: Kubelet證書的起始時間是由Kube-Controller-Manager所在伺服器時間決定的。
注意 2:Kubelet的證書輪換功能是自動的,這裡重啟Kubelet服務是為了立馬檢視證書輪換效果。