RBAC相关规则
1. 核心规则
- 一个
RoleBinding只能绑定1个 Role到1个或多个 ServiceAccounts
(不能在一个RoleBinding里绑定多个Roles)。 - 但一个
ServiceAccount可以通过多个 RoleBinding获得多个Roles的权限。
2. 具体实现方式
✅ 方法 1:一个 SA 绑定多个 Roles(通过多个 RoleBinding)
# Role 1:读取 Pod
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
# Role 2:读取 ConfigMap
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: configmap-reader
rules:
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get"]
# RoleBinding 1:绑定 pod-reader 到 app-account
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: binding1
subjects:
- kind: ServiceAccount
name: app-account
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
# RoleBinding 2:绑定 configmap-reader 到 app-account
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: binding2
subjects:
- kind: ServiceAccount
name: app-account
roleRef:
kind: Role
name: configmap-reader
apiGroup: rbac.authorization.k8s.io
效果:app-account 同时拥有 pod-reader 和 configmap-reader 的权限。
❌ 错误方法:一个 RoleBinding 绑定多个 Roles
# 错误示例!Kubernetes 不支持这种写法!
roleRef:
kind: Role
name: [pod-reader, configmap-reader] # 非法语法
3. 替代方案(如需简化管理)
如果觉得多个 RoleBinding 太繁琐,可以:
方案 1:合并权限到单个 Role
# 合并 pod-reader 和 configmap-reader 的权限
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: combined-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get"]
方案 2:使用 ClusterRole + ClusterRoleBinding
(如果是集群范围的权限)。
4. 验证权限
# 检查 SA 是否拥有多个 Roles 的权限
kubectl auth can-i get pods --as=system:serviceaccount:default:app-account # 返回 yes
kubectl auth can-i get configmaps --as=system:serviceaccount:default:app-account # 返回 yes
5. 总结
| 需求 | 实现方式 |
|---|---|
| 让 SA 拥有多个 Roles 的权限 | 创建多个 RoleBinding,每个绑定一个 Role 到同一个 SA |
| 减少 YAML 文件数量 | 合并权限到单个 Role,或使用 ClusterRole |
| 注意 | 一个 RoleBinding 只能绑定一个 Role,但可以绑定多个 Subjects(SAs) |
简记口诀:
- 一个任命书(RoleBinding)只能写一个职位(Role),但可以发给多个人(SAs)。
- 一个人(SA)可以拿多张任命书(通过多个 RoleBinding 获得多个 Roles)!
为什么有时需要将权限拆分成多个 Roles?
你的思路完全正确!如果 pod-reader 和 configmap-reader 的权限总是需要同时赋予同一个 SA,那么直接合并成一个 Role(如 combined-reader)是最简洁的做法。例如:
# 合并权限的 Role(推荐!)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: combined-reader
rules:
- apiGroups: [""]
resources: ["pods", "configmaps"] # 一次性定义所有资源
verbs: ["get", "list"]
但实际场景中,拆分权限(多个 Roles)通常基于以下考虑:
1. 权限复用性
如果某些 SA 只需要 pod-reader,而另一些 SA 需要 pod-reader + configmap-reader,拆分成两个 Roles 更灵活:
- Role 1:
pod-reader(被多个 RoleBinding 复用) - Role 2:
configmap-reader(按需绑定)
示例:
# SA1 只需要读取 Pod
subjects:
- kind: ServiceAccount
name: sa-monitor
roleRef:
kind: Role
name: pod-reader # 仅绑定 pod-reader
# SA2 需要读取 Pod 和 ConfigMap
subjects:
- kind: ServiceAccount
name: sa-full-access
roleRef:
kind: Role
name: combined-reader # 或通过两个 RoleBinding 分别绑定 pod-reader 和 configmap-reader
2. 权限粒度控制
- 审计与维护:拆分后可以更清晰地追踪哪个 Role 被修改(例如仅调整
configmap-reader的权限,不影响pod-reader)。 - 最小权限原则:避免过度授权。如果某个 SA 只需要
pod-reader,就不应意外获得configmap-reader的权限。
3. 动态权限组合
通过 多个 RoleBindings 可以动态组合权限,而无需修改 Role 定义:
# 初始只给 pod-reader
kubectl create rolebinding binding1 --role=pod-reader --serviceaccount=default:app-account
# 后续根据需要追加 configmap-reader
kubectl create rolebinding binding2 --role=configmap-reader --serviceaccount=default:app-account
4. 多团队协作
- 大型团队:不同团队可能管理不同的 Roles(如网络团队管理
network-role,存储团队管理storage-role)。 - 模块化权限:避免一个庞大的 Role 被多人频繁修改导致冲突。
何时应该合并权限?
如果以下条件满足,直接合并成一个 Role 更合适:
- 这些权限总是同时需要(如
get pods和get configmaps是同一功能依赖)。 - 不需要对其中部分权限单独调整。
- 权限逻辑高度内聚(例如同属于“监控只读权限”)。
决策流程图
graph TD
A[权限是否总是同时需要?] -->|是| B[合并成单个 Role]
A -->|否| C[拆分成多个 Roles]
C --> D[通过多个 RoleBindings 按需组合]
最终建议
- 简单场景:权限固定且组合单一 → 直接合并(如你的例子)。
- 复杂场景:需要灵活复用、动态调整或团队协作 → 拆分 Roles + 多 RoleBindings。
合并的 YAML 示例(推荐给你的案例):
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: app-reader
rules:
- apiGroups: [""]
resources: ["pods", "configmaps"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: app-reader-binding
subjects:
- kind: ServiceAccount
name: app-account
roleRef:
kind: Role
name: app-reader
apiGroup: rbac.authorization.k8s.io
浙公网安备 33010602011771号