使用節點授權
節點授權是一種特殊用途的授權模式,專門授權由 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 的請求,因為預設節點識別符實作不會將其視為節點身分。