使用节点授权
节点授权是一种特殊用途的授权模式,专门授权由 kubelets 发出的 API 请求。
概述
节点授权器允许 kubelet 执行 API 操作。这包括
读取操作
- 服务
- 端点
- 节点
- Pod
- 与绑定到 kubelet 节点的 Pod 相关的秘密、配置映射、持久卷声明和持久卷
Kubernetes v1.31 [alpha]
启用 AuthorizeNodeWithSelectors
功能(以及先决条件 AuthorizeWithSelectors
功能)后,kubelet 只能读取自己的节点对象,并且只能读取绑定到其节点的 Pod。
写入操作
- 节点和节点状态(启用
NodeRestriction
准入插件以限制 kubelet 修改其自己的节点) - Pod 和 Pod 状态(启用
NodeRestriction
准入插件以限制 kubelet 修改绑定到自身的 Pod) - 事件
与身份验证相关的操作
- 对 证书签名请求 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 选项参考。
要启用节点授权器,请使用 --authorization-mode=Node
启动 apiserver。
要限制 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 的请求,因为默认的节点标识符实现不会认为它们是节点标识。