使用节点授权
节点授权是一种特殊用途的授权模式,它专门授权由 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 的请求,因为默认的节点标识符实现不会将其视为节点身份。