ClusterRole 和 ClusterRoleBinding 是 Kubernetes 中用于控制集群范围权限的两个重要资源,它们共同构成了 Kubernetes RBAC (基于角色的访问控制) 系统的核心部分。
两者的关系
-
ClusterRole 定义了一组权限规则,指定了可以对哪些资源执行哪些操作
-
ClusterRoleBinding 将这些权限授予特定的用户、组或服务账户
简单来说:ClusterRole 是"什么能做",ClusterRoleBinding 是"谁可以做"。
ClusterRole 详解
ClusterRole 是集群级别的角色,定义了一组权限规则:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pod-reader
rules:
- apiGroups: [""] # 空字符串表示核心 API 组
resources: ["pods"]
verbs: ["get", "watch", "list"]
特点:
-
适用于整个集群,而不仅限于特定命名空间
-
可以授权访问:
-
集群范围的资源(如节点)
-
非资源端点(如 /healthz)
-
跨所有命名空间的命名空间资源(如 pods)
-
ClusterRoleBinding 详解
ClusterRoleBinding 将 ClusterRole 绑定到主体(用户、组或服务账户):
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-pods-global
subjects:
- kind: User
name: alice
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: pod-reader
apiGroup: rbac.authorization.k8s.io
特点:
-
将集群范围的权限授予主体
-
绑定的主体可以在所有命名空间中行使权限
使用场景
-
集群管理员权限:
# 创建集群管理员 ClusterRole apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cluster-admin rules: - apiGroups: ["*"] resources: ["*"] verbs: ["*"] - nonResourceURLs: ["*"] verbs: ["*"] # 绑定到用户 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cluster-admin-binding subjects: - kind: User name: admin-user apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io
-
跨命名空间只读权限:
# 创建只读 ClusterRole apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: global-reader rules: - apiGroups: [""] resources: ["pods", "services", "nodes"] verbs: ["get", "list", "watch"] # 绑定到服务账户 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: monitoring-reader subjects: - kind: ServiceAccount name: monitoring-service namespace: monitoring roleRef: kind: ClusterRole name: global-reader apiGroup: rbac.authorization.k8s.io
与 Role/RoleBinding 的区别
特性 | ClusterRole/ClusterRoleBinding | Role/RoleBinding |
---|---|---|
作用范围 | 集群级别 | 命名空间级别 |
资源类型 | 集群资源和所有命名空间资源 | 仅限命名空间内资源 |
绑定目标 | 用户、组或任何命名空间的服务账户 | 仅限同一命名空间的用户、组和服务账户 |
典型用途 | 集群管理员、跨命名空间访问权限 | 命名空间内特定应用的权限 |
最佳实践
-
遵循最小权限原则,只授予必要的权限
-
为不同的职责创建专门的 ClusterRole
-
使用有意义的名称,如
cluster-admin
,node-viewer
,namespace-creator
等 -
定期审计 ClusterRole 和 ClusterRoleBinding
-
对于命名空间特定的权限,优先使用 Role 和 RoleBinding
通过合理使用 ClusterRole 和 ClusterRoleBinding,可以实现精细化的集群权限管理。