# k8s 中使用 Node 授权
Node 授权是一种特殊授权模式,专门授权由 kubelet 访问的 API 请求。
# 概述
Node 授权器允许 kubelet 执行的 API 操作包括:
读:
- services
- endpoints
- nodes
- pods
- secrets, configmaps, persistent volume claims and persistent volumes related to pods bound to the kubelet’s node
写:
- Node 和 Node status(启用 NodeRestriction 准入插件限制 kubelet 仅修改当前的 Node)
- Pod 和 Pod status(启用 NodeRestriction 准入插件限制 kubelet 仅修改与当前绑定的 pod)
- events
Auth-related:
- read/write access to the certificationsigningrequests API for TLS bootstrapping
- the ability to create tokenreviews and subjectaccessreviews for delegated authentication/authorization checks
在以后的版本中,Node 授权器支持添加或删除的权限。
为获得 Node 授权器的授权,kubelet 需要使用 system:nodes 组中的用户名system:node:<nodeName>
。
启用 Node 授权器方法:apiserver --authorization-mode=Node。
为了限制 kubelets 能够写入的 API 对象,可以启动--admission-control=...,NodeRestriction,...准入(admission)插件。
# Migration considerations
# 外部 Kubelets system:node 组
Node 授权模式不授权外部 Kubelets system:node 组。
# 使用 RBAC 来升级
使用 RBAC 升级,1.7 之前按原样运行,因为 system:nodes group binding 已经存在。
如果希望开始使用 Node 授权和 NodeRestriction 准入插件来限制对 API 的访问,则执行:
- 启用 Node 授权模式(--authorization-mode=Node,RBAC)和 NodeRestriction 准入插件
- 确保所有 kubelet 的证书符合 group/username 要求
- 检查 apiserver 日志,确保 Node 授权器接受 kubelets 的请求(不 NODE DENY 记录持久性消息)
- 删除 system:node 集群 role binding
# RBAC Node 权限
在 1.6 中,使用 RBAC 授权模式时,system:node 群集角色(role)自动绑定到该 system:nodes 组。
在 1.7 中,由于 Node 授权器实现了相同的目的,因此不再支持 system:nodes 组与 system:node 角色的自动绑定,从而有利于对 secret 和 configmap 访问的附加限制。
在 1.8 中,将不会创建 binding。
使用 RBAC 时,将继续创建 system:node 集群角色,以便兼容使用 deployment 将其他 users 或 groups 绑定到集群角色的方法。