RBAC 权限控制

集群是多人共用的基础设施,若人人都能 delete Pod、看 Secret,事故与泄密只是时间问题。RBAC(基于角色的访问控制)用「角色」定义权限、用「绑定」把角色授给主体,让每个用户或程序只拥有完成任务所需的最小权限。

核心概念与关系

RBAC 由四类对象组成:

  • 主体(Subject):User(人)、Group(用户组)或 ServiceAccount(Pod 内程序)。
  • Role / ClusterRole:一组权限规则,如「可 get/list pods」。
  • RoleBinding / ClusterRoleBinding:把角色授予主体。

关系可理解为「谁(主体) + 能做什么(角色) + 在哪(作用域)」:

RoleBinding(命名空间内) ──绑定──> Role(限某命名空间)
       │                        ClusterRole(全局)
ClusterRoleBinding(全局) ──绑定──> ClusterRole(全局)

Role 与 ClusterRole 的区别

  • Role 只作用于某个命名空间;ClusterRole 作用于整个集群(可用于所有命名空间或集群级资源)。
  • 跨命名空间复用角色、管理集群级资源(节点、PV、Namespace)时必须用 ClusterRole。

示例:只读 Pod 权限

先建一个可查看 Pod 的 ClusterRole,再通过 RoleBinding 授给某命名空间内的用户:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: pod-reader
rules:
  - apiGroups: [""]              # 核心组:Pod、Service 等
    resources: ["pods", "pods/log"]
    verbs: ["get", "list", "watch"]
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: alice-pod-read
  namespace: default             # 只对 default 生效
subjects:
  - kind: User
    name: alice                  # 主体:用户 alice
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

verbs 常用 get/list/watch/create/update/patch/delete;把 roleRef 换成 Role 即把命名空间内角色授给集群内所有用户。

验证权限

绑定完成后用 auth can-i 模拟检查某主体能否执行某操作:

kubectl auth can-i list pods --as=alice -n default
# 输出:yes
kubectl auth can-i delete pods --as=alice -n default
# 输出:no

ServiceAccount 与自动挂载 Token

ServiceAccount(SA)是 Pod 内程序访问 API 的身份,每个命名空间有默认的 default SA。Pod 创建时会自动挂载该 SA 的 Token 用于认证;若应用不需要访问 API,建议关闭自动挂载以减小泄露面:

apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  automountServiceAccountToken: false   # 不自动挂载 Token
  containers:
    - name: app
      image: nginx

需要访问 API 时再单独创建 SA、授予最小权限并显式引用。

最小权限建议

  • 只授予完成工作必需的最小 verbs 与 resources。
  • 能限定命名空间就用 Role + RoleBinding,确需全局才用 ClusterRole/ClusterRoleBinding。
  • 定期用 auth can-i 复核权限,清理闲置的绑定。
  • 注意 roleRef 一旦创建不可修改,调整角色只能删除重建绑定。

小结:RBAC 用 Role/ClusterRole 定义规则、RoleBinding/ClusterRoleBinding 把规则授给 User/ServiceAccount;先想清主体要对哪些资源做哪些操作,再按最小权限落地,并用 auth can-i 随时验证。

笔记加载中…