4. 多租户 RBAC 策略设计
在多租户 Kubernetes 集群中,RBAC(基于角色的访问控制)是隔离租户权限的核心机制。本章将指导你为不同租户创建独立的 ServiceAccount、定义租户管理员与只读角色,并将资源配额与角色绑定,实现细粒度的权限隔离。
4.1 多租户 RBAC 设计原则
设计多租户 RBAC 策略时,应遵循以下原则:
- 最小权限原则:每个租户只获得完成其任务所需的最小权限集。
- 命名空间隔离:每个租户拥有独立的命名空间,RBAC 角色作用域限定在命名空间内。
- 角色分层:为不同职责的用户创建不同层级的角色(管理员、开发者、只读用户)。
- 配额关联:将 ResourceQuota 与命名空间绑定,防止租户资源滥用。
最佳实践:始终使用命名空间级别的 Role 和 RoleBinding,而非集群级别的 ClusterRole 和 ClusterRoleBinding,除非需要跨命名空间的管理权限。
4.2 租户 ServiceAccount 与角色定义
以下示例为租户 "alpha" 创建独立的 ServiceAccount、管理员角色和只读角色。
4.2.1 创建命名空间与 ServiceAccount
# 创建租户命名空间
kubectl create namespace tenant-alpha
# 创建租户专用的 ServiceAccount
kubectl create serviceaccount alpha-sa -n tenant-alpha
4.2.2 定义租户管理员角色
租户管理员角色拥有命名空间内除 RBAC 和配额管理外的全部资源操作权限。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: tenant-alpha
name: alpha-admin
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps", "secrets", "persistentvolumeclaims"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "statefulsets", "daemonsets"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["batch"]
resources: ["jobs", "cronjobs"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["networking.k8s.io"]
resources: ["networkpolicies"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
4.2.3 定义只读角色
只读角色仅允许查看命名空间内的资源,适用于审计或监控用户。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: tenant-alpha
name: alpha-reader
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps", "secrets", "persistentvolumeclaims"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
resources: ["deployments", "statefulsets", "daemonsets"]
verbs: ["get", "list", "watch"]
- apiGroups: ["batch"]
resources: ["jobs", "cronjobs"]
verbs: ["get", "list", "watch"]
- apiGroups: ["networking.k8s.io"]
resources: ["networkpolicies"]
verbs: ["get", "list", "watch"]
4.3 角色绑定与资源配额关联
将角色绑定到 ServiceAccount,并为命名空间设置资源配额。
4.3.1 创建 RoleBinding
# 将管理员角色绑定到 alpha-sa
kubectl create rolebinding alpha-admin-binding \
--role=alpha-admin \
--serviceaccount=tenant-alpha:alpha-sa \
-n tenant-alpha
# 将只读角色绑定到只读用户(假设有另一个 ServiceAccount)
kubectl create rolebinding alpha-reader-binding \
--role=alpha-reader \
--serviceaccount=tenant-alpha:alpha-reader-sa \
-n tenant-alpha
4.3.2 关联资源配额
为租户命名空间设置资源配额,限制其资源使用上限。
apiVersion: v1
kind: ResourceQuota
metadata:
name: alpha-quota
namespace: tenant-alpha
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
persistentvolumeclaims: "5"
pods: "20"
services: "10"
configmaps: "10"
注意:ResourceQuota 必须在创建任何工作负载之前应用到命名空间,否则已运行的 Pod 可能不会受到配额限制。建议在创建命名空间后立即应用配额。
4.4 多租户 RBAC 架构图
下图展示了多租户 RBAC 策略的整体架构,包括命名空间隔离、角色绑定和配额关联。
4.5 角色与权限对比表
下表对比了不同角色的权限范围,帮助你根据实际需求选择合适的角色类型。
| 角色类型 | 权限范围 | 适用场景 | 典型操作 |
|---|---|---|---|
| 租户管理员 | 命名空间内全部资源(除 RBAC 自身) | 租户团队负责人、DevOps 工程师 | 创建/删除 Pod、Service、Deployment、NetworkPolicy |
| 开发者 | 命名空间内工作负载资源(不含 NetworkPolicy) | 应用开发人员 | 创建/更新 Pod、Deployment、ConfigMap |
| 只读用户 | 命名空间内所有资源的查看权限 | 审计人员、监控系统、业务方 | 查看 Pod 状态、日志、Service 信息 |
| 集群管理员 | 整个集群所有资源 | 平台运维团队 | 管理节点、命名空间、RBAC 策略、配额 |
4.6 多租户 RBAC 策略实施流程
以下是实施多租户 RBAC 策略的完整步骤,确保每个租户的权限隔离和资源控制。
- 创建命名空间:为每个租户创建独立的命名空间,命名规范建议使用
tenant-{租户名称}。 - 创建 ServiceAccount:为租户内的不同用户组创建独立的 ServiceAccount。
- 定义 Role:根据职责创建管理员、开发者、只读等角色,精确控制权限范围。
- 创建 RoleBinding:将 Role 绑定到对应的 ServiceAccount,完成权限授予。
- 应用 ResourceQuota:为命名空间设置资源配额,防止资源争抢。
- 验证权限:使用
kubectl auth can-i命令验证权限配置是否正确。
验证命令示例:
# 验证 alpha-sa 是否可以创建 Pod
kubectl auth can-i create pods \
--namespace=tenant-alpha \
--as=system:serviceaccount:tenant-alpha:alpha-sa
# 验证只读用户是否可以删除 Service
kubectl auth can-i delete services \
--namespace=tenant-alpha \
--as=system:serviceaccount:tenant-alpha:alpha-reader-sa
4.7 多租户 RBAC 策略实施流程图
下图展示了从创建命名空间到验证权限的完整实施流程,帮助你快速掌握操作顺序。
自动化建议:对于大规模多租户集群,建议使用 GitOps 工具(如 ArgoCD)或自定义 Operator 来管理 RBAC 策略和资源配额,避免手动操作带来的配置漂移风险。