檢視次數:
設定檔適用性:等級 1
啟用 kubelet 伺服器憑證輪替。
RotateKubeletServerCertificate 使 kubelet 在啟動其客戶端憑證後請求服務憑證,並在現有憑證過期時旋轉憑證。這種自動定期旋轉確保不會因憑證過期而導致停機,從而解決 CIA(機密性、完整性和可用性)安全三元組中的可用性問題。
注意
注意
此建議僅適用於您讓 kubelet 從 API 伺服器獲取其憑證的情況。如果您的 kubelet 憑證來自外部授權機構/工具(例如密碼保險箱),則需要自行實施憑證輪替。
注意
注意
請參閱 Amazon EKS 文件以了解預設值。

稽核

稽核方法 1:
  1. SSH 到每個節點。
  2. 在每個節點上執行以下命令以找到 Kubelet 進程:
    ps -ef | grep kubelet
    如果輸出包含 --rotate-kubelet-server-certificate 可執行參數,請確認其設定為 true
    如果該程序沒有 --rotate-kubelet-server-certificate 可執行參數,請檢查 Kubelet 配置檔案。輸出應返回類似 --config /etc/kubernetes/kubelet/kubelet-config.json 的內容,這是 Kubelet 配置檔案的位置信息。
  3. 開啟 Kubelet 配置檔:
    cat /etc/kubernetes/kubelet/kubelet-config.json
  4. 確認 featureGates 區段中存在 RotateKubeletServerCertificate 參數,並且設定為 true
稽核方法 2:
如果使用 api configz 端點,請考慮透過從運行 kubelet 的節點中提取即時配置來搜尋 "RotateKubeletServerCertificate":true 的狀態。
設定本地 Proxy 通訊埠及以下變數,並提供 Proxy 通訊埠號碼及節點名稱:HOSTNAME_PORT="localhost-and-port-number" NODE_NAME="The-Name-Of-Node-To-Extract-Configuration" 從 "kubectl get nodes" 的輸出中獲取
kubectl proxy --port=8001 &
export HOSTNAME_PORT=localhost:8001 (example host and port number)
export NODE_NAME=ip-192.168.31.226.ec2.internal (example node name from
"kubectl get nodes")
curl -sSL "http://${HOSTNAME_PORT}/api/v1/nodes/${NODE_NAME}/proxy/configz"

補救

修復方法 1:
如果要修改 Kubelet 配置檔,請編輯 kubelet-config.json 檔案 /etc/kubernetes/kubelet/kubelet-config.json,並將以下參數設為 true:
"featureGates": { "RotateKubeletServerCertificate":true }
此外,請確保 kubelet 服務檔案 /etc/systemd/system/kubelet.service.d/10-kubelet-args.conf 未將 --rotate-kubelet-server-certificate 可執行參數設為 false,因為這會覆蓋 Kubelet 設定檔。
修復方法 2:
如果使用可執行參數,請在每個工作節點上編輯 kubelet 服務檔案 /etc/systemd/system/kubelet.service.d/10-kubelet-args.conf,並在 KUBELET_ARGS 變數字串的末尾添加以下參數。
--rotate-kubelet-server-certificate=true
修復方法 3:
如果使用 api configz 端點,請考慮透過從運行 kubelet 的節點中提取即時配置來搜尋 "RotateKubeletServerCertificate": 的狀態。
重新配置節點的 Kubelet 在即時叢集中查看詳細的逐步 configmap 程序,然後重新執行來自審核過程的 curl 語句以檢查 kubelet 配置變更:
kubectl proxy --port=8001 &
export HOSTNAME_PORT=localhost:8001 (example host and port number)
export NODE_NAME=ip-192.168.31.226.ec2.internal (example node name from
"kubectl get nodes")
curl -sSL "http://${HOSTNAME_PORT}/api/v1/nodes/${NODE_NAME}/proxy/configz"
對於所有三種修復方法:重新啟動 kubelet 服務並檢查狀態。以下範例是使用 systemctl 管理服務時的操作:
systemctl daemon-reload
systemctl restart kubelet.service
systemctl status kubelet -l