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、安全上下文)实现资源与安全边界。
下图展示了虚拟集群的典型分层架构:
架构要点: 每个租户的 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 租户控制平面生命周期管理
租户控制平面的生命周期管理是虚拟集群运维的核心挑战。一个成熟的实现通常包含以下阶段:
- 预置(Provisioning): 租户注册后,控制平面 Operator 自动生成 CA 证书、etcd 前缀、RBAC 初始角色、网络策略和资源配额。整个过程应在 30 秒内完成。
- 启动(Startup): 依次启动 etcd 代理(或确认前缀可用)、API Server、Controller Manager。Scheduler 可选——租户可复用超级集群调度器,也可运行专属调度器。
- 运行(Runtime): 持续监控 API Server 健康状态、etcd 存储用量、请求延迟和错误率。自动扩缩容 API Server 副本数(HPA)。
- 升级(Upgrade): 支持滚动升级租户控制平面版本,不中断租户工作负载。升级顺序:etcd → API Server → Controller Manager。
- 回收(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 驱动模式下租户控制平面的完整生命周期状态机:
生产建议: 租户控制平面的健康检查不应仅依赖 API Server 的 /healthz 端点。建议增加端到端探测:创建临时 Namespace、部署测试 Pod、验证 API 响应时间。同时为每个租户控制平面配置独立的 Prometheus 监控和告警规则,指标包括:apiserver_request_total、etcd_db_total_size_in_bytes、apiserver_current_inflight_requests。