3. RBAC 基础概念:Role、ClusterRole、RoleBinding、ClusterRoleBinding 的定义与区别

在 Kubernetes 中,RBAC(基于角色的访问控制)是管理集群权限的核心机制。理解 Role、ClusterRole、RoleBinding 和 ClusterRoleBinding 这四个基本对象,是排查因权限不足导致镜像拉取失败的前提。

3.1 核心概念定义

对象 作用域 定义 典型用途
Role 命名空间(Namespace) 定义一组权限规则,仅作用于特定命名空间内的资源(如 Pod、Secret、Service) 限制某个应用只能读取本命名空间的 Secret
ClusterRole 集群级别(Cluster-wide) 定义一组权限规则,作用于整个集群,包括所有命名空间、节点、PV 等集群级资源 授予管理员查看所有 Pod 的权限,或允许 ServiceAccount 访问集群范围的资源
RoleBinding 命名空间(Namespace) 将 Role 或 ClusterRole 绑定到用户、组或 ServiceAccount,且绑定效果仅限于该命名空间 将“读取 Secret”的 Role 绑定给某个 Pod 的 ServiceAccount
ClusterRoleBinding 集群级别(Cluster-wide) 将 ClusterRole 绑定到用户、组或 ServiceAccount,绑定效果作用于整个集群 将“集群管理员”权限绑定给运维人员

3.2 关键区别

  • 作用域不同:Role 和 RoleBinding 受命名空间限制;ClusterRole 和 ClusterRoleBinding 不受命名空间限制。
  • 资源类型覆盖:ClusterRole 可以控制节点、PV、Namespace 等集群级资源,而 Role 不能。
  • 绑定组合灵活性:RoleBinding 可以引用同一命名空间的 Role,也可以引用 ClusterRole(此时仅继承该 ClusterRole 中与命名空间资源相关的权限)。
  • 使用场景差异:多租户隔离场景优先使用 Role + RoleBinding;集群管理或跨命名空间权限场景使用 ClusterRole + ClusterRoleBinding。

3.3 权限作用域对比图

RBAC 权限作用域对比 集群边界(Cluster) 命名空间 A 命名空间 B Role A (命名空间级) RoleBinding A (命名空间级) ClusterRole (集群级) RoleBinding B (命名空间级) ClusterRoleBinding (集群级) 关键规则 RoleBinding 可引用 ClusterRole 但仅继承命名空间资源权限

3.4 权限组合矩阵

绑定对象 引用的权限对象 生效范围 能否控制集群级资源 典型示例
RoleBinding Role(同命名空间) 仅该命名空间 否 允许 Pod 读取本命名空间的 Secret
RoleBinding ClusterRole 仅该命名空间 否(仅继承命名空间资源权限) 允许 Pod 读取所有命名空间的 Secret(需配合 ClusterRole 定义)
ClusterRoleBinding ClusterRole 整个集群 是 允许 ServiceAccount 查看所有节点状态

3.5 与镜像拉取相关的权限场景

当 Pod 需要从私有镜像仓库拉取镜像时,kubelet 会使用 Pod 的 ServiceAccount 来获取 imagePullSecrets。如果 ServiceAccount 没有通过 RBAC 获得读取该 Secret 的权限,镜像拉取就会失败。以下是与该场景直接相关的权限配置示例:

正确配置示例:为 ServiceAccount 授予读取 Secret 的权限

# 1. 创建 Role,允许读取 Secret
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: production
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "list"]
---
# 2. 创建 RoleBinding,将 Role 绑定到 ServiceAccount
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: production
  name: read-secrets-binding
subjects:
- kind: ServiceAccount
  name: default
  namespace: production
roleRef:
  kind: Role
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io

常见误区:如果使用 ClusterRoleBinding 将 ClusterRole 绑定到 ServiceAccount,但 ClusterRole 中定义的权限仅针对命名空间资源(如 Secret),则绑定效果仍然只作用于单个命名空间。不要误以为 ClusterRoleBinding 会自动将权限扩展到所有命名空间——它只扩展了绑定的作用域,但权限的具体范围仍由 ClusterRole 的规则定义决定。

3.6 排查权限问题的快速检查清单

  • 确认 ServiceAccount:Pod 使用的 ServiceAccount 是否正确?是否显式指定了 serviceAccountName?
  • 确认 Secret 所在命名空间:imagePullSecrets 引用的 Secret 是否与 Pod 在同一命名空间?
  • 确认 Role 或 ClusterRole 定义:是否包含了 secrets 资源,且 verbs 包含 get?
  • 确认绑定关系:RoleBinding 或 ClusterRoleBinding 是否正确地引用了目标 ServiceAccount?
  • 验证权限:使用 kubectl auth can-i 命令验证 ServiceAccount 是否有权限读取目标 Secret。