2、多租户架构基础:Kubernetes多租户模型与CAPI隔离设计

多租户架构是云原生平台实现资源隔离、安全管控与成本分摊的核心能力。在CAPI(Cluster API)管理环境中,租户隔离不仅涉及Kubernetes原生的Namespaces、RBAC与NetworkPolicy,还需要在集群生命周期管理层面贯彻隔离设计原则。本节将系统梳理Kubernetes多租户模型的关键组件,并提炼CAPI场景下的租户隔离设计原则。

2.1 Kubernetes多租户模型三大支柱

Kubernetes本身并未提供“租户”这一原生对象,而是通过以下三种机制的组合来实现多租户隔离:

机制 作用层次 核心能力 隔离粒度
Namespaces 资源对象 逻辑分组、资源配额(ResourceQuota)、LimitRange 软隔离(共享网络)
RBAC 身份与权限 Role/ClusterRole、RoleBinding/ClusterRoleBinding 细粒度操作授权
NetworkPolicy 网络通信 入站/出站规则、标签选择器、CIDR限制 硬隔离(网络层)

2.2 Namespaces:逻辑租户边界

Namespaces是Kubernetes中最基础的多租户隔离单元。每个Namespace可以包含独立的Pod、Service、ConfigMap、Secret等资源,并通过ResourceQuota对象限制租户的资源消耗上限。

关键实践:在CAPI管理的工作集群中,建议为每个租户分配独立的Namespace,并预先绑定ResourceQuota与LimitRange,防止单个租户的资源滥用影响其他租户。
apiVersion: v1
kind: ResourceQuota
metadata:
  name: tenant-quota
  namespace: tenant-a
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    persistentvolumeclaims: "5"
    pods: "20"
---
apiVersion: v1
kind: LimitRange
metadata:
  name: tenant-limits
  namespace: tenant-a
spec:
  limits:
  - default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "200m"
      memory: "256Mi"
    type: Container

2.3 RBAC:细粒度权限控制

RBAC(基于角色的访问控制)是Kubernetes多租户安全的核心。通过Role与RoleBinding的组合,可以实现Namespace级别的权限隔离;ClusterRole与ClusterRoleBinding则用于集群级别的权限管理。

  • Role:定义在特定Namespace内的操作权限(如get、list、create、delete)。
  • ClusterRole:定义集群范围内的操作权限,或跨Namespace的资源访问。
  • RoleBinding:将Role绑定到用户、组或ServiceAccount,作用域限定在Namespace内。
  • ClusterRoleBinding:将ClusterRole绑定到主体,作用域为整个集群。
设计建议:在CAPI多租户场景中,应为每个租户创建独立的ServiceAccount,并通过RoleBinding授予其仅操作自身Namespace的权限。避免使用ClusterRoleBinding,除非租户需要管理集群级别的资源(如节点、StorageClass)。

2.4 NetworkPolicy:网络层硬隔离

NetworkPolicy通过标签选择器和IP段规则,控制Pod之间的网络通信。默认情况下,Kubernetes集群允许所有Pod互相通信;启用NetworkPolicy后,未显式允许的流量将被拒绝。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-ingress
  namespace: tenant-a
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress: []
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-monitoring
  namespace: tenant-a
spec:
  podSelector:
    matchLabels:
      app: web
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          purpose: monitoring
      podSelector:
        matchLabels:
          app: prometheus
注意:NetworkPolicy依赖于CNI插件的支持(如Calico、Cilium、Weave Net)。在CAPI创建的工作集群中,务必在Cluster manifest中指定支持NetworkPolicy的CNI,否则策略将不会生效。

2.5 CAPI中的租户隔离设计原则

在CAPI管理环境下,租户隔离需要从集群生命周期、资源分配、安全边界三个维度进行设计。以下为五大核心原则:

  1. 集群级隔离优先:对于安全要求高的租户,应分配独立的CAPI工作集群(Cluster对象),而非共享集群内的Namespace。CAPI的Cluster API支持快速创建和销毁集群,适合租户级硬隔离。
  2. Namespace配额标准化:在共享集群场景中,通过ClusterResourceQuota或ResourceQuota模板,确保每个租户的Namespace创建时自动绑定资源上限。
  3. RBAC最小权限原则:CAPI的Cluster API本身需要较高的集群管理权限,但租户对工作集群的操作应严格限制在自身Namespace内。使用CAPI的RBAC代理或OIDC集成实现身份映射。
  4. 网络策略默认拒绝:在CAPI Cluster manifest中,通过ClusterResourceSet或ConfigMap预置默认的NetworkPolicy,实现租户间网络隔离。
  5. 审计与监控隔离:每个租户的审计日志、监控指标应独立存储,避免跨租户数据泄露。CAPI的Cluster API支持为每个集群配置独立的Prometheus实例或日志收集器。
架构决策:在CAPI多租户架构中,推荐采用“混合隔离”策略——高安全租户使用独立集群(Cluster对象),普通租户共享集群但通过Namespace+NetworkPolicy隔离。这种策略在资源利用率和安全等级之间取得平衡。

2.6 CAPI多租户隔离架构图

下图展示了CAPI管理平面与工作集群之间的多租户隔离关系:

CAPI多租户隔离架构 CAPI多租户隔离架构 CAPI 管理集群 Cluster API Controller 租户A 工作集群 独立Cluster对象 租户B 工作集群 独立Cluster对象 共享工作集群 单个Cluster对象 Namespace: tenant-c Namespace: tenant-d Namespace: tenant-e 隔离机制 • ResourceQuota 资源上限 • RBAC RoleBinding 权限隔离 • NetworkPolicy 网络隔离 • LimitRange 容器资源约束 • 独立ServiceAccount 图例说明 管理集群 独立租户集群 共享集群 租户Namespace 隔离策略说明

2.7 租户隔离策略对比

隔离策略 资源利用率 安全等级 管理复杂度 CAPI适用场景
独立集群 低(每个集群有控制面开销) 高(完全隔离) 中(CAPI自动化创建) 金融、医疗等合规要求高的租户
共享集群+Namespace 高(共享控制面) 中(依赖NetworkPolicy) 低(原生Kubernetes机制) 开发测试环境、内部团队
混合策略 中(按需分配) 高(分级隔离) 中高(需策略编排) 生产环境多租户平台

2.8 租户资源配额调优前置检查清单

在进入具体的配额调优之前,建议完成以下检查项,确保多租户基础架构就绪:

  • Namespace规划:是否已为每个租户创建独立的Namespace?命名规范是否统一(如 tenant-{id})?
  • ResourceQuota绑定:每个Namespace是否已绑定ResourceQuota?配额值是否基于租户SLA设定?
  • RBAC配置:租户的ServiceAccount是否仅拥有自身Namespace的操作权限?是否禁用了集群级别的ClusterRole?
  • NetworkPolicy生效:是否已部署默认拒绝所有入站流量的NetworkPolicy?是否允许监控系统跨Namespace访问?
  • CAPI Cluster manifest:Cluster对象的spec中是否指定了支持NetworkPolicy的CNI?是否通过ClusterResourceSet预置了配额模板?
调优起点:完成上述检查后,即可进入下一节——基于CAPI的ResourceQuota动态调整策略。建议先使用 kubectl describe resourcequota -n {tenant-namespace} 查看当前配额使用率,作为调优的基线数据。