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