使用 Node 鉴权

节点鉴权是一种特殊用途的鉴权模式,专门对 kubelet 发出的 API 请求进行鉴权。

概述

节点鉴权器允许 kubelet 执行 API 操作。包括:

读取操作:

  • services
  • endpoints
  • nodes
  • pods
  • secrets、configmaps、以及绑定到 kubelet 的节点的 pod 的持久卷申领和持久卷<!—–
  • services
  • endpoints
  • nodes
  • pods
  • secrets, configmaps, persistent volume claims and persistent volumes related to pods bound to the kubelet’s node–—>

写入操作:

  • 节点和节点状态(启用 NodeRestriction 准入插件以限制 kubelet 只能修改自己的节点)
  • Pod 和 Pod 状态 (启用 NodeRestriction 准入插件以限制 kubelet 只能修改绑定到自身的 Pod)
  • 事件<!—–
  • nodes and node status (enable the NodeRestriction admission plugin to limit a kubelet to modify its own node)
  • pods and pod status (enable the NodeRestriction admission plugin to limit a kubelet to modify pods bound to itself)
  • events–—>

鉴权相关操作:

  • 对于基于 TLS 的启动引导过程时使用的 certificationsigningrequests API 的读/写权限
  • 为委派的身份验证/授权检查创建 tokenreviews 和 subjectaccessreviews 的能力<!—–
  • read/write access to the certificationsigningrequests API for TLS bootstrapping
  • the ability to create tokenreviews and subjectaccessreviews for delegated authentication/authorization checks–—>

在将来的版本中,节点鉴权器可能会添加或删除权限,以确保 kubelet 具有正确操作所需的最小权限集。

为了获得节点鉴权器的授权,kubelet 必须使用一个凭证以表示它在 system:nodes 组中,用户名为 system:node:<nodeName>。上述的组名和用户名格式要与 kubelet TLS 启动引导过程中为每个 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 的请求。

相对于以前使用 RBAC 的版本的更新

升级的 1.7 之前的使用 RBAC 的集群将继续按原样运行,因为 system:nodes 组绑定已经存在。

如果集群管理员希望开始使用 Node 鉴权器和 NodeRestriction 准入插件来限制节点对 API 的访问,这一需求可以通过下列操作来完成且不会影响已部署的应用:

  • 启用 Node 鉴权模式 (—authorization-mode=Node,RBAC) 和 NodeRestriction 准入插件
  • 确保所有 kubelet 的凭据符合组/用户名要求
  • 审核 apiserver 日志以确保 Node 鉴权器不会拒绝来自 kubelet 的请求(日志中没有持续的 NODE DENY 消息)
  • 删除 system:node 集群角色绑定<!—–
  • Enable the Node authorization mode (—authorization-mode=Node,RBAC) and the NodeRestriction admission plugin
  • Ensure all kubelets’ credentials conform to the group/username requirements
  • Audit apiserver logs to ensure the Node authorizer is not rejecting requests from kubelets (no persistent NODE DENY messages logged)
  • Delete the system:node cluster role binding–—>

RBAC 节点权限

在 1.6 版本中,当使用 RBAC 鉴权模式 时,system:nodes 集群角色会被自动绑定到 system:node 组。

在 1.7 版本中,不再推荐将 system:nodes 组自动绑定到 system:node 角色,因为节点鉴权器通过对 secret 和 configmap 访问的额外限制完成了相同的任务。如果同时启用了 NodeRBAC 授权模式,1.7 版本则不会创建 system:nodes 组到 system:node 角色的自动绑定。

在 1.8 版本中,绑定将根本不会被创建。

使用 RBAC 时,将继续创建 system:node 集群角色,以便与将其他用户或组绑定到该角色的部署方法兼容。