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 動詞 | 請求動詞 |
---|---|
POST | create |
GET, HEAD | get |
PUT | update |
PATCH | patch |
DELETE | delete |
資源和子資源根據傳入請求的路徑確定:
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 許可權已更新,可以訪問上述所有子資源。