3. 多租户架构基础:租户隔离模型与控制面节点策略

在 Cluster API 驱动的多租户环境中,租户隔离模型与控制面节点策略是决定集群安全性、资源效率和运维复杂度的核心设计决策。本章从隔离模型(软隔离 vs 硬隔离)和控制面节点共享/专用两个维度展开,并引入资源配额与网络策略作为落地手段。

3.1 租户隔离模型:软隔离 vs 硬隔离

租户隔离模型定义了不同租户工作负载之间的边界强度。根据安全等级、合规要求和资源共享程度,分为软隔离(Soft Multi-Tenancy)和硬隔离(Hard Multi-Tenancy)两种模式。

维度 软隔离(Soft Multi-Tenancy) 硬隔离(Hard Multi-Tenancy)
共享边界 同一集群内通过 Namespace 隔离 每个租户拥有独立集群或独立节点
安全等级 中等,依赖 RBAC / NetworkPolicy / ResourceQuota 高,物理或虚拟化边界,无共享内核
资源效率 高,节点和网络资源充分复用 低,每个租户需预留独立资源池
运维复杂度 低,单集群管理,统一升级 高,多集群生命周期管理,Cluster API 可降低此成本
适用场景 开发/测试环境、内部团队、信任度较高的租户 生产环境、金融/医疗合规、不可信第三方租户
Cluster API 适配 单 Cluster 资源 + 多 Tenant Namespace 多 Cluster 资源,每个 Cluster 对应一个 Tenant
关键决策点: 软隔离适合资源利用率优先的场景,但需警惕容器逃逸和 Sidecar 攻击面;硬隔离提供最强安全边界,但会引入集群数量膨胀和 etcd 开销。Cluster API 的 Cluster 和 MachineDeployment 资源可以快速创建/销毁硬隔离集群,使硬隔离的运维成本大幅降低。

3.2 控制面节点:共享 vs 专用

控制面节点(Control Plane Nodes)承载 kube-apiserver、etcd、controller-manager 和 scheduler。在多租户架构中,控制面节点的部署模式直接影响租户隔离强度和集群稳定性。

3.2.1 共享控制面模式

所有租户共享同一组控制面节点。租户工作负载运行在独立的 Worker 节点上,但 API Server 和 etcd 是公共的。

  • 优点: 控制面资源利用率高,etcd 统一管理,升级维护简单。
  • 缺点: 租户间的 API 请求相互影响(如大流量租户导致 API Server 过载);etcd 数据隔离仅依赖 Namespace + RBAC,存在信息泄露风险。
  • Cluster API 实现: 使用单个 Cluster 资源,通过 KubeadmControlPlane 管理共享控制面,Worker 节点通过 MachineDeployment 按租户分组。

3.2.2 专用控制面模式

每个租户拥有独立的控制面节点组,包括独立的 etcd 实例和 API Server。

  • 优点: 完全隔离,一个租户的控制面故障不影响其他租户;可针对租户定制控制面版本和配置。
  • 缺点: 资源开销大(每个控制面至少 3 节点),etcd 集群数量多,运维成本高。
  • Cluster API 实现: 每个租户对应一个独立的 Cluster 资源,每个 Cluster 包含独立的 KubeadmControlPlane 和 MachineDeployment。Cluster API 的 ClusterResourceSet 可批量注入租户专属配置。
推荐策略: 在 Cluster API 多租户实践中,建议采用混合模式:核心基础设施租户(如平台团队、监控、日志)使用共享控制面;外部业务租户或高安全需求租户使用专用控制面。通过 Cluster API 的 ClusterClass 和 Topology 特性,可以模板化定义两种模式,实现按需创建。
控制面节点共享 vs 专用模式对比 共享控制面模式 共享 Control Plane (3节点) kube-apiserver / etcd / controller-manager / scheduler 租户A Worker Namespace: tenant-a 租户B Worker Namespace: tenant-b 租户C Worker Namespace: tenant-c 租户D Worker Namespace: tenant-d 专用控制面模式 租户A CP (3节点) 独立 etcd + API 租户A Worker 租户B CP (3节点) 独立 etcd + API 租户B Worker 租户C CP (3节点) 独立 etcd + API 租户C Worker 租户D CP (3节点) 独立 etcd + API 租户D Worker

3.3 资源配额(ResourceQuota)

资源配额是软隔离模式下控制租户资源消耗的核心机制。通过 ResourceQuota 对象,平台管理员可以为每个租户 Namespace 设置 CPU、内存、存储和对象数量的上限。

3.3.1 关键配额维度

配额类型 资源字段 说明
计算资源 requests.cpu / requests.memory
limits.cpu / limits.memory
限制租户 Pod 的请求和限制总量,防止单个租户耗尽节点资源
存储资源 requests.storage
persistentvolumeclaims
限制 PVC 总容量和数量,避免存储池被单个租户占满
对象数量 pods / services / configmaps / secrets 限制 Kubernetes 对象数量,防止 etcd 和 API Server 过载
扩展资源 nvidia.com/gpu / hugepages-* 限制租户对特殊硬件资源的访问

3.3.2 Cluster API 中的配额注入策略

在 Cluster API 工作流中,推荐使用 ClusterResourceSet 自动将 ResourceQuota 配置注入到每个租户的 Namespace 中。示例配置如下:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: tenant-quota
  namespace: tenant-a
spec:
  hard:
    requests.cpu: "8"
    requests.memory: "32Gi"
    limits.cpu: "16"
    limits.memory: "64Gi"
    pods: "50"
    persistentvolumeclaims: "10"
    requests.storage: "500Gi"
    services: "20"
    secrets: "50"
    configmaps: "50"
---
apiVersion: addons.cluster.x-k8s.io/v1beta1
kind: ClusterResourceSet
metadata:
  name: tenant-a-resourceset
spec:
  clusterSelector:
    matchLabels:
      tenant: tenant-a
  resources:
    - kind: ConfigMap
      name: tenant-a-quota
  strategy: ApplyOnce
注意: ResourceQuota 仅限制资源总量,不限制单个 Pod 的资源分配。建议配合 LimitRange 设置 Pod 级别的默认请求/限制,防止租户创建超大 Pod 导致调度失败。

3.4 网络策略(NetworkPolicy)

网络策略是软隔离模式下实现租户网络隔离的关键手段。通过 NetworkPolicy 对象,可以控制 Pod 之间的流量、Pod 与外部服务的流量,以及租户 Namespace 之间的访问。

3.4.1 多租户网络策略设计原则

  • 默认拒绝(Default Deny): 每个租户 Namespace 默认拒绝所有入站和出站流量,仅允许显式声明的策略。
  • 租户内全通: 允许同一租户 Namespace 内的 Pod 互相通信,便于微服务架构。
  • 跨租户隔离: 禁止不同租户 Namespace 之间的直接通信,除非通过显式的 API Gateway 或 Service Mesh。
  • 控制面访问: 允许租户 Pod 访问 kube-dns 和 kube-apiserver(通过 Service 或 Cluster IP),但限制对 etcd 和 kubelet 的直接访问。

3.4.2 典型租户网络策略示例

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: tenant-a
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-tenant-internal
  namespace: tenant-a
spec:
  podSelector: {}
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: tenant-a
  egress:
    - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: tenant-a
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dns-and-api
  namespace: tenant-a
spec:
  podSelector: {}
  egress:
    - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system
      ports:
        - protocol: UDP
          port: 53
        - protocol: TCP
          port: 53
    - to:
        - ipBlock:
            cidr: 10.96.0.0/12  # Service CIDR
      ports:
        - protocol: TCP
          port: 6443  # kube-apiserver

3.4.3 网络策略与 CNI 插件兼容性

CNI 插件 NetworkPolicy 支持 多租户注意事项
Calico 完全支持,支持全局网络策略(GlobalNetworkPolicy) 推荐用于硬隔离场景,支持 eBPF 加速和 WireGuard 加密
Cilium 完全支持,支持 L7 策略和 DNS 策略 适合需要细粒度 API 级隔离的租户,支持 Hubble 可观测性
Flannel 不支持原生 NetworkPolicy 需配合 Calico 策略控制器或使用 Canal 组合方案
Weave Net 支持基本 NetworkPolicy 适合中小规模多租户,性能不如 Calico/Cilium

3.5 隔离模型选择矩阵

以下矩阵帮助你在不同场景下快速选择隔离模型和控制面策略:

场景 推荐隔离模型 控制面策略 关键配置
内部开发团队(信任度高) 软隔离 共享控制面 ResourceQuota + NetworkPolicy + RBAC
SaaS 多租户(不可信租户) 硬隔离 专用控制面 独立 Cluster + ClusterResourceSet + 节点隔离
混合工作负载(部分敏感) 软隔离 + 硬隔离混合 共享控制面(基础)+ 专用控制面(敏感) ClusterClass 模板 + 租户标签选择器
合规审计(金融/医疗) 硬隔离 专用控制面 + 专用节点 独立 etcd 加密 + 节点 Taint/Toleration + 审计日志
边缘计算(资源受限) 软隔离 共享控制面 轻量 CNI + 精简 ResourceQuota + 节点污点
Cluster API 最佳实践: 使用 ClusterClass 定义软隔离和硬隔离两种模板。软隔离模板使用 KubeadmControlPlane 单控制面组 + 多个 MachineDeployment;硬隔离模板使用 Cluster 资源 + KubeadmControlPlane 独立控制面。通过 Topology 变量控制租户专属参数(如 CIDR、节点池大小),实现一键创建隔离集群。