3. 多租户模型设计:Namespace隔离、RBAC策略、ResourceQuota、LimitRange在CAPI中的应用

在CAPI(Cluster API)管理的大规模多租户环境中,租户之间的资源隔离、权限控制和配额管理是保障集群稳定性和安全性的基石。Kubernetes原生的Namespace、RBAC、ResourceQuota和LimitRange机制,结合CAPI的声明式集群管理能力,能够构建出自动化、可扩展的多租户模型。本章将深入剖析这四大核心组件在CAPI场景下的设计原则与实现路径。

3.1 多租户隔离层次模型

多租户隔离并非单一维度的操作,而是从集群、命名空间到资源对象的层层递进。在CAPI工作流中,每个租户通常对应一个或多个Namespace,并通过RBAC策略限定其操作边界,再通过ResourceQuota和LimitRange控制资源消耗。下图展示了CAPI多租户模型的核心层次结构:

CAPI多租户隔离层次模型 CAPI多租户隔离层次模型 集群层(Cluster Layer) CAPI管理集群 / 租户共享控制平面 / 节点池隔离 命名空间层(Namespace Layer) 每个租户独占一个或多个Namespace / 逻辑隔离边界 权限层(RBAC Layer) Role / ClusterRole / RoleBinding / ClusterRoleBinding 资源约束层(Resource Constraint Layer) ResourceQuota / LimitRange / 优先级与抢占
设计要点:在CAPI多租户架构中,建议将租户的Namespace创建、RBAC绑定、配额初始化封装为CAPI ClusterClass的附加组件(ClusterResourceSet),实现租户创建时的自动化策略注入。

3.2 Namespace隔离策略

Namespace是Kubernetes多租户隔离的基本单元。在CAPI场景下,每个租户的工作负载、ConfigMap、Secret等资源都应归属于独立的Namespace。CAPI本身也利用Namespace来隔离不同集群的Cluster、Machine、MachineDeployment等资源对象。

3.2.1 租户Namespace命名规范

建议采用统一的命名模式,便于自动化管理和策略匹配:

命名模式 示例 适用场景
tenant-{tenantID} tenant-001 单租户单Namespace
tenant-{tenantID}-{env} tenant-001-prod 租户多环境(dev/staging/prod)
team-{teamName} team-platform 内部团队隔离

3.2.2 CAPI资源与租户Namespace的映射

CAPI管理的集群资源(Cluster、Machine等)通常位于管理集群的特定Namespace中。租户工作负载则位于目标集群的租户Namespace中。这种双层Namespace结构需要清晰的映射关系:

# 管理集群侧:CAPI资源位于 tenant-clusters 命名空间
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
  name: tenant-001-cluster
  namespace: tenant-clusters
spec:
  clusterNetwork:
    pods:
      cidrBlocks: ["10.96.0.0/12"]
    serviceDomain: "cluster.local"
  # ... 其他配置

---
# 目标集群侧:租户工作负载位于 tenant-001 命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: tenant-001
  labels:
    tenant-id: "001"
    environment: "production"
注意:不要将CAPI管理资源与租户工作负载混用同一个Namespace。管理集群的Namespace应严格控制访问权限,仅允许平台管理员操作。

3.3 RBAC策略设计

RBAC(基于角色的访问控制)是Kubernetes中实现细粒度权限管理的核心机制。在多租户CAPI环境中,RBAC策略需要覆盖两个层面:管理集群层面的CAPI资源访问控制,以及目标集群层面的租户资源访问控制。

3.3.1 管理集群RBAC:CAPI资源访问

平台管理员需要创建针对CAPI资源的ClusterRole,并绑定到不同的租户管理员或运维人员:

# 租户管理员角色:允许管理自己的Cluster和Machine资源
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: tenant-admin
rules:
- apiGroups: ["cluster.x-k8s.io"]
  resources: ["clusters", "machines", "machinedeployments"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["infrastructure.cluster.x-k8s.io"]
  resources: ["awsclusters", "awsclustertemplates"]
  verbs: ["get", "list", "watch"]

---
# 绑定到特定租户的ServiceAccount
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: tenant-001-admin-binding
  namespace: tenant-clusters
subjects:
- kind: ServiceAccount
  name: tenant-001-sa
  namespace: tenant-clusters
roleRef:
  kind: ClusterRole
  name: tenant-admin
  apiGroup: rbac.authorization.k8s.io

3.3.2 目标集群RBAC:租户工作负载访问

在目标集群中,每个租户应拥有独立的ServiceAccount和Role,限定其只能操作自己Namespace内的资源:

# 目标集群中的租户角色
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: tenant-role
  namespace: tenant-001
rules:
- apiGroups: [""]
  resources: ["pods", "services", "configmaps", "secrets"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
  resources: ["deployments", "statefulsets"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["autoscaling"]
  resources: ["horizontalpodautoscalers"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
最佳实践:使用CAPI的ClusterResourceSet功能,在目标集群创建时自动应用RBAC配置。将RBAC YAML清单打包为ConfigMap,通过ClusterResourceSet关联到对应的Cluster对象,实现租户权限的自动化注入。

3.4 ResourceQuota与LimitRange配置

ResourceQuota和LimitRange是防止租户资源滥用、保障集群公平性的关键工具。在CAPI多租户模型中,这两个资源需要在目标集群创建时自动部署到每个租户Namespace中。

3.4.1 ResourceQuota:总量控制

ResourceQuota限制租户在Namespace级别可以消耗的资源总量。以下是一个典型的租户配额配置:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: tenant-quota
  namespace: tenant-001
spec:
  hard:
    requests.cpu: "10"
    requests.memory: "20Gi"
    limits.cpu: "20"
    limits.memory: "40Gi"
    persistentvolumeclaims: "5"
    pods: "50"
    services: "10"
    configmaps: "20"
    secrets: "20"

3.4.2 LimitRange:单个Pod约束

LimitRange定义Namespace内单个Pod或容器的资源默认值和上下限,防止单个Pod占用过多资源:

apiVersion: v1
kind: LimitRange
metadata:
  name: tenant-limits
  namespace: tenant-001
spec:
  limits:
  - max:
      cpu: "2"
      memory: "4Gi"
    min:
      cpu: "100m"
      memory: "128Mi"
    default:
      cpu: "500m"
      memory: "1Gi"
    defaultRequest:
      cpu: "200m"
      memory: "512Mi"
    type: Container

3.4.3 配额与限制的对比

特性 ResourceQuota LimitRange
作用范围 Namespace级别 Namespace级别(作用于Pod/Container)
控制目标 资源总量(CPU/内存/存储/对象数) 单个Pod/Container的资源上下限
默认值 不支持 支持设置default和defaultRequest
典型用途 防止租户过度使用集群资源 防止单个Pod资源异常
CAPI自动化 通过ClusterResourceSet注入 通过ClusterResourceSet注入

3.5 CAPI中的自动化策略注入

CAPI的ClusterResourceSet机制是实现多租户策略自动化的核心。它允许在目标集群创建或更新时,自动应用一组预定义的Kubernetes资源。下图展示了自动化策略注入的完整流程:

CAPI自动化策略注入流程 CAPI ClusterResourceSet 自动化策略注入流程 租户创建请求 (API / GitOps) 创建Cluster对象 (管理集群) ClusterResourceSet匹配 (标签/Selector) 策略资源注入 (Namespace/RBAC/Quota) 目标集群就绪 (多租户策略已生效) 策略资源清单示例 • Namespace定义 • RBAC Role/Binding • ResourceQuota • LimitRange

3.5.1 ClusterResourceSet配置示例

以下是一个完整的ClusterResourceSet配置,它会在匹配标签的Cluster创建时,自动注入租户策略:

apiVersion: addons.cluster.x-k8s.io/v1beta1
kind: ClusterResourceSet
metadata:
  name: tenant-policy-set
  namespace: tenant-clusters
spec:
  clusterSelector:
    matchLabels:
      tenant-type: "multi-tenant"
  resources:
  - kind: ConfigMap
    name: tenant-namespace-template
  - kind: ConfigMap
    name: tenant-rbac-template
  - kind: ConfigMap
    name: tenant-quota-template
  - kind: ConfigMap
    name: tenant-limits-template
  strategy: ApplyOnce

3.5.2 策略模板ConfigMap示例

将策略资源定义为ConfigMap,支持模板化变量替换:

apiVersion: v1
kind: ConfigMap
metadata:
  name: tenant-namespace-template
  namespace: tenant-clusters
data:
  namespace.yaml: |
    apiVersion: v1
    kind: Namespace
    metadata:
      name: ${TENANT_NAMESPACE}
      labels:
        tenant-id: ${TENANT_ID}
        environment: ${TENANT_ENV}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: tenant-quota-template
  namespace: tenant-clusters
data:
  quota.yaml: |
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: tenant-quota
      namespace: ${TENANT_NAMESPACE}
    spec:
      hard:
        requests.cpu: "${QUOTA_CPU}"
        requests.memory: "${QUOTA_MEMORY}"
        pods: "${QUOTA_PODS}"
自动化扩展:结合CAPI的ClusterClass和ClusterTopology功能,可以将租户策略参数(如配额大小、环境标签)定义为Cluster对象的变量,在创建时动态注入,实现真正的参数化多租户管理。

3.6 多租户性能调优考量

在CAPI多租户环境中,性能调优需要关注以下关键点:

  • API Server负载:大量租户Namespace和RBAC对象会增加API Server的存储和响应压力。建议使用etcd压缩和API优先级与公平性(APF)进行优化。
  • 资源配额粒度:ResourceQuota的硬限制可能导致租户Pod调度失败。建议结合Cluster Autoscaler动态扩缩节点池,避免配额成为瓶颈。
  • RBAC缓存:频繁的RBAC评估会影响API Server性能。合理使用ClusterRoleBinding(而非大量RoleBinding)可以减少授权检查开销。
  • LimitRange默认值:合理的默认值可以减少Pod因缺少资源声明而被拒绝的概率。建议根据历史监控数据动态调整默认值。
性能调优指标:在CAPI多租户集群中,建议监控以下关键指标:API Server请求延迟(P99 < 1s)、etcd存储增长率(< 100MB/天)、RBAC评估耗时(< 5ms/请求)、ResourceQuota拒绝率(< 1%)。通过Prometheus + Grafana建立租户级别的性能看板。

3.7 本章小结