使用 Node 鉴权

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

概述

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

读取操作

  • 服务
  • 端点
  • 节点
  • Pods
  • 与绑定到 kubelet 节点的 Pod 相关的 secrets、configmaps、持久卷声明和持久卷
特性状态: Kubernetes v1.32 [beta] (默认启用:true)

AuthorizeNodeWithSelectors 特性被启用时(以及先决条件 AuthorizeWithSelectors 特性),kubelet 只被允许读取自己的 Node 对象,并且只被允许读取绑定到其节点的 Pods。

写入操作

  • 节点和节点状态(启用 NodeRestriction 准入插件以限制 kubelet 修改其自身节点)
  • Pods 和 Pod 状态(启用 NodeRestriction 准入插件以限制 kubelet 修改绑定到自身的 Pods)
  • 事件

认证/鉴权相关操作

  • 对于 TLS 引导,对 CertificateSigningRequests API 的读/写访问权限
  • 为委托认证/鉴权检查创建 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 鉴权器,启动 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 对象,启动 API 服务器时启用 NodeRestriction 准入插件,即设置 --enable-admission-plugins=...,NodeRestriction,...

迁移注意事项

不在 system:nodes 组中的 kubelet

不在 system:nodes 组中的 kubelet 不会获得 Node 鉴权模式的授权,需要继续通过当前授权它们的任何机制进行授权。Node 准入插件也不会限制来自这些 kubelet 的请求。

用户名未区分的 kubelet

在某些部署中,kubelet 具有的凭据将其归入 system:nodes 组,但未标识它们关联的特定节点,因为它们的用户名不是 system:node:... 格式。这些 kubelet 不会获得 Node 鉴权模式的授权,需要继续通过当前授权它们的任何机制进行授权。

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

最后修改于 2024 年 10 月 18 日下午 3:31 PST:KEP-3221: 将 StructuredAuthorizationConfiguration 提升至 GA (32aad9dd3f)