3、虚拟集群与租户级控制平面

在传统多租户 Kubernetes 集群中,所有租户共享同一个控制平面(API Server、Controller Manager、Scheduler)。这种架构存在明显的隔离短板:租户间的 API 请求无法做到物理隔离,一个租户的异常流量或恶意操作可能影响整个集群的控制面稳定性。虚拟集群(Virtual Cluster)与租户级控制平面正是为解决这一痛点而生——每个租户获得一个逻辑上独立的控制平面,而底层计算资源仍共享同一个物理集群。

3.1 虚拟集群架构

虚拟集群并非创建完整的物理 Kubernetes 集群,而是在共享的“超级集群”(Super Cluster)之上,为每个租户实例化一套轻量级控制平面组件。租户的 API Server、Controller Manager 甚至 Scheduler 都以 Pod 形式运行在超级集群的命名空间中,但对外表现为一个独立的 Kubernetes 集群端点。

核心设计原则: 控制面隔离 + 数据面共享。租户拥有专属的 API Server 和存储(etcd 实例或租户前缀),但工作负载 Pod 仍调度在共享的节点池上,通过节点级隔离(如 Linux Namespace、cgroup、安全上下文)实现资源与安全边界。

下图展示了虚拟集群的典型分层架构:

虚拟集群分层架构 超级集群(Super Cluster) 物理节点池 · 共享 CNI/CSI · 集群级 RBAC · 节点级隔离 kubelet · kube-proxy · CoreDNS · 集群监控 租户控制平面层(Tenant Control Plane Layer) 租户 A 控制平面 API Server (Pod) etcd (租户前缀) Controller Manager 租户 B 控制平面 API Server (Pod) etcd (租户前缀) Controller Manager 租户 C 控制平面 API Server (Pod) etcd (租户前缀) Controller Manager 租户工作负载层(共享节点池) 租户 A Pod ns: tenant-a cgroup 隔离 租户 B Pod ns: tenant-b cgroup 隔离 租户 C Pod ns: tenant-c cgroup 隔离 系统 Pod ns: kube-system 监控/日志
架构要点: 每个租户的 API Server 以独立 Pod 运行,拥有独立的 TLS 证书、认证授权配置和审计日志。etcd 存储可采用“共享 etcd 集群 + 租户前缀”或“独立 etcd 实例”两种模式,前者节省资源,后者隔离性更强。

3.2 租户专属 API Server

租户专属 API Server 是虚拟集群的核心组件。它本质上是一个标准 kube-apiserver 进程,但通过以下定制实现租户隔离:

维度 实现方式 隔离效果
网络端点 每个租户 API Server 暴露独立的 ClusterIP Service,可绑定独立 Ingress/负载均衡器 租户通过专属 URL 访问,网络层面互不可见
认证与授权 独立 CA 证书、ServiceAccount、RBAC 配置;支持 OIDC、Webhook 等外部认证 租户 A 的 无法访问租户 B 的 API Server
存储隔离 etcd 使用租户前缀(如 /tenant-a/)或独立 etcd 集群 数据存储完全隔离,避免 key 冲突
资源配额 API Server Pod 设置 CPU/Memory 资源限制,配合 PriorityClass 保障 QoS 一个租户的 API 洪泛不会饿死其他租户
审计日志 每个 API Server 独立配置审计策略和输出后端 租户审计日志天然分离,满足合规要求

部署租户 API Server 时,通常使用 Helm Chart 或 Operator 自动生成以下核心资源:

# 租户 API Server 部署示例(简化)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube-apiserver-tenant-a
  namespace: tenant-control-planes
spec:
  replicas: 2
  selector:
    matchLabels:
      app: kube-apiserver
      tenant: tenant-a
  template:
    metadata:
      labels:
        app: kube-apiserver
        tenant: tenant-a
    spec:
      containers:
      - name: kube-apiserver
        image: registry.k8s.io/kube-apiserver:v1.28.0
        command:
        - kube-apiserver
        - --advertise-address=$(POD_IP)
        - --etcd-servers=https://etcd-cluster:2379
        - --etcd-prefix=/tenant-a/
        - --service-cluster-ip-range=10.96.0.0/16
        - --client-ca-file=/etc/kubernetes/pki/tenant-a/ca.crt
        - --tls-cert-file=/etc/kubernetes/pki/tenant-a/apiserver.crt
        - --tls-private-key-file=/etc/kubernetes/pki/tenant-a/apiserver.key
        - --authorization-mode=RBAC,Webhook
        - --audit-log-path=/var/log/audit/tenant-a.log
        resources:
          requests:
            cpu: 500m
            memory: 1Gi
          limits:
            cpu: 2
            memory: 4Gi
        volumeMounts:
        - name: tenant-certs
          mountPath: /etc/kubernetes/pki/tenant-a
      volumes:
      - name: tenant-certs
        secret:
          secretName: tenant-a-certs

3.3 租户控制平面生命周期管理

租户控制平面的生命周期管理是虚拟集群运维的核心挑战。一个成熟的实现通常包含以下阶段:

  1. 预置(Provisioning): 租户注册后,控制平面 Operator 自动生成 CA 证书、etcd 前缀、RBAC 初始角色、网络策略和资源配额。整个过程应在 30 秒内完成。
  2. 启动(Startup): 依次启动 etcd 代理(或确认前缀可用)、API Server、Controller Manager。Scheduler 可选——租户可复用超级集群调度器,也可运行专属调度器。
  3. 运行(Runtime): 持续监控 API Server 健康状态、etcd 存储用量、请求延迟和错误率。自动扩缩容 API Server 副本数(HPA)。
  4. 升级(Upgrade): 支持滚动升级租户控制平面版本,不中断租户工作负载。升级顺序:etcd → API Server → Controller Manager。
  5. 回收(Teardown): 租户退订时,优雅关闭 API Server,清理 etcd 数据、证书 Secret、Service 和关联资源。数据保留策略可配置(如保留 7 天)。
生命周期管理避坑: 租户控制平面回收时,务必先驱逐租户工作负载(通过超级集群的 API),再销毁控制平面组件。否则工作负载变成“孤儿”,无法被正常管理。建议使用 Finalizer 机制确保回收顺序。

下表对比了三种主流的租户控制平面生命周期管理方案:

方案 管理方式 启动速度 资源开销 隔离等级 典型项目
Operator 驱动 自定义 CRD + Controller,声明式管理租户控制平面 中等(10-30s) 中(每个租户 2-4 个 Pod) 高 vcluster (Loft)
Serverless 控制面 按需启动 API Server,空闲时缩零 慢(首次 30-60s) 低(空闲时无开销) 高 Kubeception (Custom)
Sidecar 代理模式 共享 API Server + 租户 Sidecar 代理做请求过滤和重写 快(<5s) 低(仅 Sidecar 开销) 中 Kiosk / Capsule

下图展示了 Operator 驱动模式下租户控制平面的完整生命周期状态机:

租户控制平面生命周期状态机 Pending Provisioning Running Upgrading Terminating Deleted 创建 就绪 触发升级 升级完成 删除请求 清理完成 重建
生产建议: 租户控制平面的健康检查不应仅依赖 API Server 的 /healthz 端点。建议增加端到端探测:创建临时 Namespace、部署测试 Pod、验证 API 响应时间。同时为每个租户控制平面配置独立的 Prometheus 监控和告警规则,指标包括:apiserver_request_total、etcd_db_total_size_in_bytes、apiserver_current_inflight_requests。