节点授权(Node authorization)是一种特殊用途的授权模式,专门用于授权 kubelet 发出的 API 请求。
节点授权器允许 kubelet 执行 API 操作。这包括:
读取操作
Kubernetes v1.34 [稳定版](默认启用)kubelet 仅限于读取其自身的 Node 对象,并且只能读取绑定到其所在节点的 Pod。
写入操作
NodeRestriction 准入插件以限制 kubelet 仅能修改其自身节点)NodeRestriction 准入插件以限制 kubelet 仅能修改绑定到自身的 Pod)认证相关的操作
在未来的版本中,节点授权器可能会增加或删除权限,以确保 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 server 时将 --authorization-config 标志设置为包含 Node 授权器的文件;例如:
apiVersion: apiserver.config.k8s.io/v1
kind: AuthorizationConfiguration
authorizers:
...
- type: Node
...
或者,在启动 API server 时,将 --authorization-mode 标志设置为包含 Node 的逗号分隔列表;例如:
kube-apiserver --authorization-mode=...,Node --other-options --more-options
要限制 kubelet 能够写入的 API 对象,请通过在启动 apiserver 时添加 --enable-admission-plugins=...,NodeRestriction,... 来启用 NodeRestriction 准入插件。
system:nodes 组之外的 kubeletsystem:nodes 组之外的 kubelet 将不会被 Node 授权模式授权,并且需要继续通过当前用于授权它们的任何机制进行授权。节点准入插件不会限制来自这些 kubelet 的请求。
在某些部署中,kubelet 拥有将其置于 system:nodes 组中的凭证,但由于它们没有 system:node:... 格式的用户名,因此无法标识与其关联的特定节点。这些 kubelet 将不会被 Node 授权模式授权,并且需要继续通过当前用于授权它们的任何机制进行授权。
NodeRestriction 准入插件将忽略来自这些 kubelet 的请求,因为默认的节点标识符实现不会将其视为节点身份。