# 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 的访问,则执行:

  1. 启用 Node 授权模式(--authorization-mode=Node,RBAC)和 NodeRestriction 准入插件
  2. 确保所有 kubelet 的证书符合 group/username 要求
  3. 检查 apiserver 日志,确保 Node 授权器接受 kubelets 的请求(不 NODE DENY 记录持久性消息)
  4. 删除 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 绑定到集群角色的方法。

Last Updated: 4/15/2023, 8:33:17 PM