3. 核心RBAC对象:Role、ClusterRole、RoleBinding、ClusterRoleBinding的定义与关系

Kubernetes RBAC 的权限模型由四个核心 API 对象构成,它们两两配对,分别解决“授予什么权限”和“授予给谁”的问题。理解这四个对象的定义及其关系,是掌握 RBAC 配置的基础。

3.1 对象定义与职责

对象名称 作用域 核心职责 典型用途
Role 命名空间(Namespace) 定义一组权限规则,指定可以对哪些资源(如 Pod、Service)执行哪些操作(如 get、list、create) 授予某个命名空间内的应用或用户特定操作权限
ClusterRole 集群(Cluster) 定义一组权限规则,作用范围可以是整个集群、所有命名空间,或非命名空间资源(如 Node、PersistentVolume) 授予集群管理员权限、查看所有命名空间 Pod 的权限
RoleBinding 命名空间(Namespace) 将 Role 或 ClusterRole 绑定到一个或多个主体(User、Group、ServiceAccount),且绑定仅在当前命名空间生效 将某个命名空间的 Role 授予给该命名空间内的 ServiceAccount
ClusterRoleBinding 集群(Cluster) 将 ClusterRole 绑定到一个或多个主体,绑定在整个集群范围内生效 将集群管理员权限授予给某个用户或 ServiceAccount
关键区分:Role 和 RoleBinding 是命名空间级别的,ClusterRole 和 ClusterRoleBinding 是集群级别的。一个 ClusterRole 可以被 RoleBinding 引用,从而实现跨命名空间的权限复用,但绑定效果仍局限于该 RoleBinding 所在的命名空间。

3.2 对象关系与绑定逻辑

四个对象通过“绑定”操作形成权限链路。下图展示了 Role 与 ClusterRole 如何通过不同的 Binding 对象作用于主体。

RBAC核心对象关系图 RBAC 核心对象关系与绑定链路 主体 (Subject) User / Group / ServiceAccount Role 命名空间级别 ClusterRole 集群级别 RoleBinding 命名空间级别 ClusterRoleBinding 集群级别 说明: • 实线箭头表示标准绑定关系:Role 只能被 RoleBinding 引用,ClusterRole 只能被 ClusterRoleBinding 引用。 • 虚线箭头表示跨级别引用:ClusterRole 可以被 RoleBinding 引用,从而在特定命名空间内生效。 • 主体可以是 User、Group 或 ServiceAccount,一个 Binding 可以绑定多个主体。

3.3 权限聚合与生效规则

当一个主体(如 ServiceAccount)被多个 RoleBinding 或 ClusterRoleBinding 绑定时,其最终权限是所有绑定权限的并集。Kubernetes RBAC 遵循“默认拒绝,显式允许”的原则,不存在“否定权限”的概念。

权限聚合规则:
  • 同一命名空间内多个 RoleBinding 授予的权限自动合并。
  • ClusterRoleBinding 授予的权限与命名空间内的 RoleBinding 权限合并。
  • 如果多个 Role 或 ClusterRole 对同一资源定义了不同操作,所有操作均被允许。
  • 不存在“优先级”或“覆盖”关系,所有有效绑定都会增加权限。

3.4 典型配置示例

以下示例展示如何创建一个 Role 并将其绑定到 ServiceAccount。

# 1. 创建一个 Role,允许对 Pod 执行 get、list、watch 操作
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
---
# 2. 创建一个 RoleBinding,将 pod-reader Role 绑定到 my-sa ServiceAccount
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: default
  name: read-pods
subjects:
- kind: ServiceAccount
  name: my-sa
  namespace: default
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
注意:roleRef 字段一旦创建即不可修改。如果需要更改绑定的 Role,必须删除并重新创建 RoleBinding。这是 Kubernetes 的安全设计,防止权限被意外篡改。

3.5 对象选择决策矩阵

在实际配置中,选择使用哪种对象组合取决于权限的作用范围和复用需求。下表总结了常见场景下的推荐选择。

场景 权限定义 绑定方式 说明
仅需访问单个命名空间内的资源 Role RoleBinding 最常用组合,权限隔离在命名空间内
需要访问所有命名空间的同一类资源 ClusterRole ClusterRoleBinding 例如:集群范围的 Pod 查看者
需要访问非命名空间资源(如 Node) ClusterRole ClusterRoleBinding 非命名空间资源只能由 ClusterRole 授权
复用同一套权限到多个命名空间 ClusterRole RoleBinding(每个命名空间一个) 避免在每个命名空间重复定义相同的权限规则
授予集群管理员权限 ClusterRole(如 cluster-admin) ClusterRoleBinding 系统预置的 cluster-admin ClusterRole 拥有最高权限

3.6 对象关系总结

四个核心 RBAC 对象构成了一个清晰的权限模型:Role/ClusterRole 定义“能做什么”,RoleBinding/ClusterRoleBinding 定义“谁能做”。通过灵活组合,可以实现从细粒度命名空间隔离到全局集群管理的完整权限控制。

RBAC对象选择流程图 RBAC 对象选择决策流程 确定权限需求 作用范围? 命名空间 / 集群 使用 Role 使用 ClusterRole RoleBinding ClusterRoleBinding