使用節點授權

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

總覽

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

讀取操作

  • 服務
  • 端點
  • 節點
  • Pod
  • 與繫結到 kubelet 節點的 Pod 相關的密碼、ConfigMap、永久磁碟區宣告和永久磁碟區
功能狀態: Kubernetes v1.32 [beta] (預設啟用:true)

AuthorizeNodeWithSelectors 功能啟用時(連同先決條件 AuthorizeWithSelectors 功能),kubelet 僅被允許讀取它們自己的節點物件,並且僅被允許讀取繫結到它們節點的 Pod。

寫入操作

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

與身分驗證相關的操作

  • 讀取/寫入存取 CertificateSigningRequests API 以進行 TLS 啟動程序
  • 建立 TokenReviews 和 SubjectAccessReviews 以進行委派身分驗證/授權檢查的能力

在未來的版本中,節點授權器可能會新增或移除權限,以確保 kubelet 擁有正確運作所需的最小權限集。

為了通過節點授權器的授權,kubelet 必須使用憑證來識別它們屬於 system:nodes 群組,使用者名稱為 system:node:<nodeName>。此群組和使用者名稱格式與為每個 kubelet 建立的身分相符,作為 kubelet TLS 啟動程序 的一部分。

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

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

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

或者,使用設定為包含 Node 的逗號分隔清單來啟動 API 伺服器--authorization-mode 旗標;例如

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

若要限制 kubelet 可以寫入的 API 物件,請透過使用 --enable-admission-plugins=...,NodeRestriction,... 啟動 apiserver 來啟用 NodeRestriction 許可外掛程式

遷移考量

system:nodes 群組之外的 Kubelet

system:nodes 群組之外的 Kubelet 將不會通過 Node 授權模式的授權,並且需要繼續透過目前授權它們的任何機制進行授權。節點許可外掛程式將不會限制來自這些 kubelet 的請求。

具有未區分使用者名稱的 Kubelet

在某些部署中,kubelet 具有將它們置於 system:nodes 群組中的憑證,但未識別與它們關聯的特定節點,因為它們沒有 system:node:... 格式的使用者名稱。這些 kubelet 將不會通過 Node 授權模式的授權,並且需要繼續透過目前授權它們的任何機制進行授權。

NodeRestriction 許可外掛程式將忽略來自這些 kubelet 的請求,因為預設節點識別符實作不會將其視為節點身分。

上次修改時間:2024 年 10 月 18 日下午 3:31 PST:KEP-3221:將 StructuredAuthorizationConfiguration 升級到 GA (32aad9dd3f)