使用節點授權

節點授權是一種特殊用途的授權模式,它專門授權由 kubelet 發出的 API 請求。

概述

節點授權器允許 kubelet 執行 API 操作。這包括:

讀取操作

  • 服務(services)
  • 端點(endpoints)
  • 節點(nodes)
  • Pod(pods)
  • 與繫結到 kubelet 節點的 Pod 相關的 Secret、ConfigMap、Persistent Volume Claim 和 Persistent Volume
特性狀態: Kubernetes v1.34 [穩定] (預設啟用:true)

Kubelet 僅限於讀取其自己的節點物件,並且只能讀取繫結到其節點的 Pod。

寫入操作

  • 節點和節點狀態(啟用 NodeRestriction 准入外掛以限制 kubelet 修改其自己的節點)
  • Pod 和 Pod 狀態(啟用 NodeRestriction 准入外掛以限制 kubelet 修改繫結到其自身的 Pod)
  • 事件(events)

與認證相關的操作

  • CertificateSigningRequests API 的讀寫訪問,用於 TLS 引導
  • 能夠建立 TokenReview 和 SubjectAccessReview 用於委託認證/授權檢查

在未來的版本中,節點授權器可能會增加或刪除許可權,以確保 kubelet 擁有正確執行所需的最小許可權集。

為了獲得節點授權器的授權,kubelet 必須使用一個憑據,該憑據將其標識為屬於 system:nodes 組,使用者名稱為 system:node:<nodeName>。此組和使用者名稱的格式與 kubelet TLS 引導中為每個 kubelet 建立的身份匹配。

<nodeName> 的值**必須**與 kubelet 註冊的節點名稱精確匹配。預設情況下,這是 hostname 提供的宿主機名,或透過 kubelet 選項 --hostname-override 覆蓋。但是,當使用 --cloud-provider kubelet 選項時,具體的宿主機名可能由雲提供商確定,忽略本地 hostname--hostname-override 選項。有關 kubelet 如何確定宿主機名的詳細資訊,請參見 kubelet 選項參考

要啟用節點授權器,請啟動 API 伺服器,並將 --authorization-config 標誌設定為包含 Node 授權器的檔案;例如

apiVersion: apiserver.config.k8s.io/v1
kind: AuthorizationConfiguration
authorizers:
  ...
  - type: Node
  ...

或者,啟動 API 伺服器,並將 --authorization-mode 標誌設定為包含 Node 的逗號分隔列表;例如

kube-apiserver --authorization-mode=...,Node --other-options --more-options

要限制 kubelet 可以寫入的 API 物件,請透過啟動 apiserver 並帶上 --enable-admission-plugins=...,NodeRestriction,... 來啟用 NodeRestriction 准入外掛

遷移注意事項

不在 system:nodes 組中的 Kubelet

不在 system:nodes 組中的 kubelet 將不會透過 Node 授權模式進行授權,並且需要繼續通過當前授權它們的任何機制進行授權。節點准入外掛不會限制來自這些 kubelet 的請求。

使用者名稱未區分的 Kubelet

在某些部署中,kubelet 具有將其置於 system:nodes 組中的憑據,但由於它們的使用者名稱欄位不符合 system:node:... 格式,因此未標識它們所關聯的特定節點。這些 kubelet 將不會透過 Node 授權模式進行授權,並且需要繼續通過當前授權它們的任何機制進行授權。

NodeRestriction 准入外掛將忽略來自這些 kubelet 的請求,因為預設的節點識別符號實現不會將其視為節點身份。

上次修改時間:2025 年 7 月 1 日下午 12:20 PST:KEP-4601:升級到穩定版 (31f23f14a7)