RBAC相关规则

1. 核心规则

  • 一个 RoleBinding 只能绑定 1个 Role1个或多个 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-readerconfigmap-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-readerconfigmap-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 更合适:

  1. 这些权限总是同时需要(如 get podsget configmaps 是同一功能依赖)。
  2. 不需要对其中部分权限单独调整。
  3. 权限逻辑高度内聚(例如同属于“监控只读权限”)。

决策流程图

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
posted on 2025-05-09 09:02  Leo-Yide  阅读(50)  评论(0)    收藏  举报