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 特性,可以模板化定义两种模式,实现按需创建。
3.3 资源配额(ResourceQuota)
资源配额是软隔离模式下控制租户资源消耗的核心机制。通过 ResourceQuota 对象,平台管理员可以为每个租户 Namespace 设置 CPU、内存、存储和对象数量的上限。
3.3.1 关键配额维度
| 配额类型 | 资源字段 | 说明 |
|---|---|---|
| 计算资源 | requests.cpu / requests.memorylimits.cpu / limits.memory |
限制租户 Pod 的请求和限制总量,防止单个租户耗尽节点资源 |
| 存储资源 | requests.storagepersistentvolumeclaims |
限制 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、节点池大小),实现一键创建隔离集群。