使用节点授权

Node 授权是一种特殊用途的授权模式,专门授权由 kubelet 发起的 API 请求。

概述

Node 授权器允许 kubelet 执行 API 操作。这包括

读取操作

  • services
  • endpoints
  • nodes
  • pods
  • 与绑定到 kubelet 节点的 Pod 相关的 secrets、configmaps、持久卷声明和持久卷
特性状态: Kubernetes v1.34 [稳定](默认启用)

Kubelet 仅限于读取自己的 Node 对象,并且仅读取绑定到其节点的 Pod。

写入操作

  • nodes 和 node 状态(启用 NodeRestriction 准入插件以限制 kubelet 修改自己的节点)
  • pods 和 pod 状态(启用 NodeRestriction 准入插件以限制 kubelet 修改绑定到自身的 Pod)
  • events

认证相关操作

  • 读取/写入对 CertificateSigningRequests API 的访问,用于 TLS 引导
  • 能够创建 TokenReviews 和 SubjectAccessReviews,用于委托身份验证/授权检查

在未来的发布版本中,Node 授权器可能会添加或删除权限,以确保 kubelet 拥有运行正确的最小权限集。

为了获得 Node 授权器的授权,kubelet 必须使用将它们标识为属于 system:nodes 组的凭证,用户名格式为 system:node:<nodeName>。此组和用户名格式与作为 kubelet TLS 引导 的一部分为每个 kubelet 创建的身份相匹配。

<nodeName> 的值 必须 与 kubelet 注册的节点名称完全匹配。默认情况下,这是由 hostname 提供的宿主机名,或者通过 kubelet 选项 --hostname-override 覆盖。但是,在使用 --cloud-provider kubelet 选项时,特定的宿主机名可能会由云提供商确定,忽略本地 hostname--hostname-override 选项。有关 kubelet 如何确定宿主机名的具体信息,请参阅 kubelet 选项参考

要启用 Node 授权器,请使用 --authorization-config 标志启动 API server,该标志指向包含 Node 授权器的文件;例如

apiVersion: apiserver.config.k8s.io/v1
kind: AuthorizationConfiguration
authorizers:
  ...
  - type: Node
  ...

或者,使用 --authorization-mode 标志启动 API server,该标志设置为包含 Node 的逗号分隔列表;例如

kube-apiserver --authorization-mode=...,Node --other-options --more-options

要限制 kubelet 能够写入的 API 对象,请通过使用 --enable-admission-plugins=...,NodeRestriction,... 启动 apiserver 来启用 NodeRestriction 准入插件

迁移注意事项

不在 system:nodes 组中的 Kubelet

不在 system:nodes 组中的 Kubelet 将不会被 Node 授权模式授权,并且需要继续通过当前授权它们的机制进行授权。Node 准入插件不会限制来自这些 kubelet 的请求。

用户名不明确的 Kubelet

在某些部署中,kubelet 具有将它们放置在 system:nodes 组中的凭证,但由于它们没有 system:node:... 格式的用户名,因此无法识别它们关联的特定节点。这些 kubelet 将不会被 Node 授权模式授权,并且需要继续通过当前授权它们的机制进行授权。

NodeRestriction 准入插件将忽略来自这些 kubelet 的请求,因为默认节点标识实现将不会认为这是一个节点身份。

最后修改时间:2025 年 7 月 1 日下午 12:20 PST:KEP-4601:提升至稳定版 (31f23f14a7)