設定檔適用性:等級 1
啟用使用憑證的 Kubelet 驗證。
從 apiserver 到 kubelet 的連線用於擷取 pod 的日誌、透過 kubectl 附加到正在運行的 pod,以及使用 kubelet 的端口轉發功能。這些連線終止於
kubelet 的 HTTPS 端點。預設情況下,apiserver 不會驗證 kubelet 的服務憑證,這使得連線容易受到中間人攻擊,並且在不受信任和/或公共網路上運行不安全。啟用
Kubelet 憑證驗證可確保 apiserver 在提交任何請求之前能夠驗證 Kubelet。
注意請參閱 EKS 文件以了解預設值。
|
影響
您需要在 apiserver 和 kubelets 上配置 TLS。
稽核
稽核方法 1:
Kubelet 可以透過配置檔案接受配置,在某些情況下也可以透過命令列參數接受配置。需要注意的是,作為命令列參數提供的參數將會覆蓋配置檔案中的對應參數。(請參閱 Kubelet CLI 參考 中的
-- config 詳細資訊,您也可以在那裡找到哪些配置參數可以作為命令列參數提供的更多資訊)。考慮到這一點,在審核 Kubelet 配置時,檢查命令行參數和配置文件條目的存在是很重要的。
-
SSH 到每個節點並執行以下命令以查找 Kubelet 進程:
ps -ef | grep kubelet
上述指令的輸出提供了活躍的 Kubelet 程序的詳細資訊,從中我們可以看到提供給該程序的命令行參數。還請注意配置檔案的位置資訊,這是通過--config參數提供的,因為這將需要用來驗證配置。 -
該檔案可以使用類似
more或less的命令來查看,如下所示:sudo less /path/to/kubelet-config.json
-
驗證是否已配置用戶端憑證授權機構檔案。這可以使用命令列參數
--client-ca-file來配置,或在 kubelet 配置檔中透過"authentication": { "x509": {"clientCAFile": <path/to/client-ca-file> } }來配置。
稽核方法 2:
也可以透過 Kubernetes API 的 /configz 端點檢視 Kubelet 的執行配置。這可以使用
kubectl 來 Proxy 您的請求到 API。-
發現您叢集中的所有節點:
kubectl get nodes
-
使用
kubectl在您選擇的本地端口上啟動 Proxy。在此範例中,我們將使用 8080:kubectl proxy --port=8080
-
在另一個終端中,為每個節點執行以下命令:
export NODE_NAME=my-node-name curl http://localhost:8080/api/v1/nodes/${NODE_NAME}/proxy/configzcurl 命令將返回 API 回應,這將是一個 JSON 格式的字串,代表 Kubelet 配置。 -
確認在 API 回應中已配置用戶端憑證授權機構檔案,格式為
"authentication": { "x509": {"clientCAFile": <path/to/client-ca-file> } }。
補救
修復方法 1:
-
如果通過 Kubelet 配置檔進行配置,請 SSH 到每個節點並找到 kubelet 進程:
ps -ef | grep kubelet
上述命令的輸出提供了有關活動 kubelet 進程的詳細資訊,從中我們可以看到使用--config參數提供給 kubelet 服務的配置檔案的位置資訊。 -
該檔案可以使用類似
more或less的命令來查看,如下所示:sudo less /path/to/kubelet-config.json
-
通過適當設置以下參數來配置用戶端憑證授權檔案:
"authentication": { "x509": {"clientCAFile": <path/to/client-ca-file> } }
修復方法 2:
如果使用可執行參數,請編輯每個工作節點上的 kubelet 服務檔案,並確保以下參數是
KUBELET_ARGS 變數字串的一部分。對於使用 systemd 的系統,此檔案可以在
/etc/systemd/system/kubelet.service.d/10-kubelet-args.conf 找到。否則,您可能需要查閱您選擇的作業系統的文件,以確定配置了哪個服務管理器:--client-ca-file=<path/to/client-ca-file>
針對兩種修復步驟:
根據您的系統,重新啟動
kubelet服務並檢查服務狀態:以下範例適用於使用
systemd的作業系統,例如 Amazon EKS 優化的 Amazon Linux 或 Bottlerocket AMI,並調用systemctl命令。如果systemctl不可用,則您需要查閱您所選作業系統的文件,以確定配置了哪個服務管理器:systemctl daemon-reload systemctl restart kubelet.service systemctl status kubelet -l
