Kubelet 認證/授權

概述

kubelet 的 HTTPS 端點公開了對不同敏感度資料進行訪問的 API,並允許你在節點和容器中執行不同許可權級別的操作。

本文件描述瞭如何認證和授權對 kubelet HTTPS 端點的訪問。

Kubelet 認證

預設情況下,對 kubelet HTTPS 端點的請求,如果未被其他已配置的認證方法拒絕,則視為匿名請求,並獲得使用者名稱為 system:anonymous 和組 system:unauthenticated

停用匿名訪問並將 401 Unauthorized 響應傳送給未經認證的請求:

  • 使用 --anonymous-auth=false 標誌啟動 kubelet。

啟用 X509 客戶端證書認證到 kubelet 的 HTTPS 端點:

  • 使用 --client-ca-file 標誌啟動 kubelet,提供 CA 證書包以驗證客戶端證書。
  • 使用 --kubelet-client-certificate--kubelet-client-key 標誌啟動 apiserver。
  • 有關更多詳細資訊,請參閱 apiserver 認證文件

啟用 API 持有者令牌(包括服務帳戶令牌)用於認證到 kubelet 的 HTTPS 端點:

  • 確保 API 伺服器中啟用了 authentication.k8s.io/v1beta1 API 組。
  • 使用 --authentication-token-webhook--kubeconfig 標誌啟動 kubelet。
  • kubelet 在配置的 API 伺服器上呼叫 TokenReview API,以從持有者令牌中確定使用者資訊。

Kubelet 授權

任何成功認證的請求(包括匿名請求)都會被授權。預設的授權模式是 AlwaysAllow,它允許所有請求。

有許多可能的原因需要細分對 kubelet API 的訪問:

  • 匿名認證已啟用,但匿名使用者呼叫 kubelet API 的能力應受限制。
  • 持有者令牌認證已啟用,但任意 API 使用者(如服務帳戶)呼叫 kubelet API 的能力應受限制。
  • 客戶端證書認證已啟用,但只允許由配置的 CA 簽名的部分客戶端證書使用 kubelet API。

要細分對 kubelet API 的訪問,請將授權委託給 API 伺服器:

  • 確保 API 伺服器中啟用了 authorization.k8s.io/v1beta1 API 組。
  • 使用 --authorization-mode=Webhook--kubeconfig 標誌啟動 kubelet。
  • kubelet 在配置的 API 伺服器上呼叫 SubjectAccessReview API,以確定每個請求是否已授權。

kubelet 使用與 apiserver 相同的請求屬性方法來授權 API 請求。

動詞是從傳入請求的 HTTP 動詞中確定的

HTTP 動詞請求動詞
POSTcreate
GET, HEADget
PUTupdate
PATCHpatch
DELETEdelete

資源和子資源根據傳入請求的路徑確定:

Kubelet API資源子資源
/stats/*節點(nodes)stats
/metrics/*節點(nodes)metrics
/logs/*節點(nodes)log
/spec/*節點(nodes)spec
/checkpoint/*節點(nodes)checkpoint
所有其他節點(nodes)proxy

名稱空間和 API 組屬性始終為空字串,資源名稱始終是 kubelet 的 Node API 物件的名稱。

以這種模式執行時,請確保透過 apiserver 傳遞的 --kubelet-client-certificate--kubelet-client-key 標誌所標識的使用者已獲得以下屬性的授權:

  • verb=*, resource=nodes, subresource=proxy
  • verb=*, resource=nodes, subresource=stats
  • verb=*, resource=nodes, subresource=log
  • verb=*, resource=nodes, subresource=spec
  • verb=*, resource=nodes, subresource=metrics

細粒度授權

功能狀態: Kubernetes v1.33 [beta] (預設啟用:true)

當特性門控 KubeletFineGrainedAuthz 被啟用時,kubelet 會在回退到 /pods/runningPods/configz/healthz 端點的 proxy 子資源之前執行細粒度檢查。資源和子資源根據傳入請求的路徑確定:

Kubelet API資源子資源
/stats/*節點(nodes)stats
/metrics/*節點(nodes)metrics
/logs/*節點(nodes)log
/pods節點(nodes)pods, proxy
/runningPods/節點(nodes)pods, proxy
/healthz節點(nodes)healthz, proxy
/configz節點(nodes)configz, proxy
所有其他節點(nodes)proxy

當特性門控 KubeletFineGrainedAuthz 被啟用時,請確保透過 API 伺服器傳遞的 --kubelet-client-certificate--kubelet-client-key 標誌所標識的使用者已獲得以下屬性的授權:

  • verb=*, resource=nodes, subresource=proxy
  • verb=*, resource=nodes, subresource=stats
  • verb=*, resource=nodes, subresource=log
  • verb=*, resource=nodes, subresource=metrics
  • verb=*, resource=nodes, subresource=configz
  • verb=*, resource=nodes, subresource=healthz
  • verb=*, resource=nodes, subresource=pods

如果使用 RBAC 授權,啟用此門控還會確保內建的 system:kubelet-api-admin ClusterRole 許可權已更新,可以訪問上述所有子資源。

最後修改時間:2025 年 3 月 19 日太平洋標準時間下午 4:53:在 kubelet 授權中提及內建的 clusterrole (5bfcf81227)