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 权限作用域对比图
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。