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 策略的整体架构,包括命名空间隔离、角色绑定和配额关联。

多租户 RBAC 策略架构图 Kubernetes 集群 租户 Alpha 命名空间 alpha-sa (ServiceAccount) alpha-admin (Role) alpha-reader (Role) alpha-quota (ResourceQuota: CPU 4, Mem 8Gi) 工作负载 Pods / Deployments / Services NetworkPolicies 租户 Beta 命名空间 beta-sa (ServiceAccount) beta-admin (Role) beta-reader (Role) beta-quota (ResourceQuota: CPU 8, Mem 16Gi) 工作负载 Pods / Deployments / Services NetworkPolicies

4.5 角色与权限对比表

下表对比了不同角色的权限范围,帮助你根据实际需求选择合适的角色类型。

角色类型 权限范围 适用场景 典型操作
租户管理员 命名空间内全部资源(除 RBAC 自身) 租户团队负责人、DevOps 工程师 创建/删除 Pod、Service、Deployment、NetworkPolicy
开发者 命名空间内工作负载资源(不含 NetworkPolicy) 应用开发人员 创建/更新 Pod、Deployment、ConfigMap
只读用户 命名空间内所有资源的查看权限 审计人员、监控系统、业务方 查看 Pod 状态、日志、Service 信息
集群管理员 整个集群所有资源 平台运维团队 管理节点、命名空间、RBAC 策略、配额

4.6 多租户 RBAC 策略实施流程

以下是实施多租户 RBAC 策略的完整步骤,确保每个租户的权限隔离和资源控制。

  1. 创建命名空间:为每个租户创建独立的命名空间,命名规范建议使用 tenant-{租户名称}。
  2. 创建 ServiceAccount:为租户内的不同用户组创建独立的 ServiceAccount。
  3. 定义 Role:根据职责创建管理员、开发者、只读等角色,精确控制权限范围。
  4. 创建 RoleBinding:将 Role 绑定到对应的 ServiceAccount,完成权限授予。
  5. 应用 ResourceQuota:为命名空间设置资源配额,防止资源争抢。
  6. 验证权限:使用 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 策略实施流程图

下图展示了从创建命名空间到验证权限的完整实施流程,帮助你快速掌握操作顺序。

多租户 RBAC 策略实施流程图 1. 创建命名空间 2. 创建 ServiceAccount 3. 定义 Role 4. 创建 RoleBinding 5. 应用 ResourceQuota 6. 验证权限 前置条件 • 集群管理员权限 • 租户信息已确认 • 资源配额已规划
自动化建议:对于大规模多租户集群,建议使用 GitOps 工具(如 ArgoCD)或自定义 Operator 来管理 RBAC 策略和资源配额,避免手动操作带来的配置漂移风险。