使用 Node 鉴权
节点鉴权器允许 kubelet 执行 API 操作。包括:
读取操作:
- endpoints
- nodes
- pods
- secrets、configmaps、pvcs 以及绑定到 kubelet 节点的与 pod 相关的持久卷
写入操作:
- 节点和节点状态(启用
NodeRestriction
准入插件以限制 kubelet 只能修改自己的节点) - Pod 和 Pod 状态 (启用
NodeRestriction
准入插件以限制 kubelet 只能修改绑定到自身的 Pod)
鉴权相关操作:
- 对于基于 TLS 的启动引导过程时使用的 certificationsigningrequests API 的读/写权限
- 为委派的身份验证/授权检查创建 TokenReview 和 SubjectAccessReview 的能力
在将来的版本中,节点鉴权器可能会添加或删除权限,以确保 kubelet 具有正确操作所需的最小权限集。
要启用节点授权器,请使用 --authorization-mode = Node
启动 apiserver。
要限制 kubelet 具有写入权限的 API 对象,请使用 --enable-admission-plugins=...,NodeRestriction,...
启动 apiserver,从而启用 准入插件。
迁移考虑因素
system:nodes
组之外的 kubelet 不会被 Node
鉴权模式授权,并且需要继续通过当前授权它们的机制来授权。 节点准入插件不会限制来自这些 kubelet 的请求。
在一些部署中,kubelet 具有 组的凭证,但是无法给出它们所关联的节点的标识,因为它们没有 system:node:...
格式的用户名。 这些 kubelet 不会被 Node
授权模式授权,并且需要继续通过当前授权它们的任何机制来授权。
因为默认的节点标识符实现不会把它当作节点身份标识,NodeRestriction
准入插件会忽略来自这些 kubelet 的请求。
如果集群管理员希望开始使用 Node
鉴权器和 NodeRestriction
准入插件来限制节点对 API 的访问,这一需求可以通过下列操作来完成且不会影响已部署的应用:
- 启用
Node
鉴权模式 (--authorization-mode=Node,RBAC
) 和NodeRestriction
准入插件 - 确保所有 kubelet 的凭据符合组/用户名要求
- 审核 apiserver 日志以确保 鉴权器不会拒绝来自 kubelet 的请求(日志中没有持续的
NODE DENY
消息) - 删除
system:node
集群角色绑定
在 1.6 版本中,当使用 时,system:nodes
集群角色会被自动绑定到 system:node
组。
在 1.7 版本中,不再推荐将 system:nodes
组自动绑定到 system:node
角色,因为节点鉴权器通过对 secret 和 configmap 访问的额外限制完成了相同的任务。 如果同时启用了 Node
和 RBAC
授权模式,1.7 版本则不会创建 system:nodes
组到 角色的自动绑定。
在 1.8 版本中,绑定将根本不会被创建。
使用 RBAC 时,将继续创建 system:node
集群角色,以便与将其他用户或组绑定到该角色的部署方法兼容。