3. 多租户模型:Kubernetes Namespace 与租户隔离、资源配额(ResourceQuota)、网络策略(NetworkPolicy)
在云原生灾备场景中,多租户隔离是保障故障窗口不扩散的核心防线。Kubernetes 原生提供的 Namespace、ResourceQuota 与 NetworkPolicy 三者共同构成了租户隔离的“铁三角”。本章将深入剖析这三者的协同机制,并给出面向灾备镜像拉取加速场景的最佳实践。
3.1 租户隔离模型:从逻辑边界到故障边界
Kubernetes 的 Namespace 是租户隔离的基本单元。每个 Namespace 可以视为一个虚拟集群,拥有独立的资源视图、访问控制和策略边界。在灾备场景下,Namespace 的隔离能力直接决定了故障窗口的半径。
核心原则: 一个租户 = 一个或多个 Namespace。租户的故障窗口应被严格限制在其所属 Namespace 集合内,不得跨 Namespace 扩散。
3.2 ResourceQuota:硬性资源边界与故障窗口控制
ResourceQuota 是 Namespace 级别的资源配额控制器。它定义了 Namespace 内所有 Pod 可消耗的 CPU、内存、存储等资源上限。在灾备场景下,ResourceQuota 是防止“租户 A 的故障导致租户 B 资源枯竭”的关键手段。
| 资源类型 |
配额字段 |
灾备场景推荐值 |
故障窗口影响 |
| CPU |
requests.cpu / limits.cpu |
生产 Namespace: 8C / 16C;灾备 Namespace: 4C / 8C |
防止 CPU 饥饿导致其他租户 Pod 被驱逐 |
| 内存 |
requests.memory / limits.memory |
生产 Namespace: 16Gi / 32Gi;灾备 Namespace: 8Gi / 16Gi |
防止 OOM 风暴扩散至节点级 |
| 存储 |
requests.storage |
按租户业务数据量 + 20% 冗余 |
防止 PV 创建失败导致镜像拉取中断 |
| 对象数 |
count/pods / count/services |
生产: 200 Pods;灾备: 100 Pods |
防止 etcd 压力过大导致控制面故障 |
最佳实践: 为每个租户的灾备 Namespace 设置独立的 ResourceQuota,且配额应小于生产 Namespace 的 50%。这样即使灾备 Namespace 发生资源泄漏,也不会影响生产 Namespace 的稳定性。
3.3 NetworkPolicy:网络级故障隔离
NetworkPolicy 是 Kubernetes 中实现网络层隔离的原生机制。它基于标签选择器定义 Pod 之间的通信规则。在灾备场景下,NetworkPolicy 是阻断“跨租户网络风暴”的最后一道防线。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tenant-isolation
namespace: prod-a
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
tenant: tenant-a
- podSelector:
matchLabels:
app: dr-sync
egress:
- to:
- namespaceSelector:
matchLabels:
tenant: tenant-a
ports:
- protocol: TCP
port: 443
- protocol: TCP
port: 6443
| 策略类型 |
作用 |
灾备场景关键配置 |
| Ingress(入站) |
控制哪些流量可以进入 Pod |
仅允许同租户 Namespace 的 Pod 和灾备同步组件访问 |
| Egress(出站) |
控制 Pod 可以访问哪些目标 |
仅允许访问同租户 Namespace 的 Service 和镜像仓库 |
| 默认拒绝 |
未显式允许的流量全部拒绝 |
每个 Namespace 必须配置默认拒绝策略,防止遗漏 |
常见陷阱: 仅配置 NetworkPolicy 而不配置 ResourceQuota,会导致网络隔离但资源仍可被耗尽。两者必须同时启用,才能实现真正的故障窗口隔离。
3.4 多租户隔离策略的协同工作流
在灾备镜像拉取加速场景中,三个隔离机制按以下顺序协同工作:
- Namespace 划分: 每个租户至少分配一个生产 Namespace 和一个灾备 Namespace,通过标签
tenant: <租户ID> 标识。
- ResourceQuota 绑定: 为每个 Namespace 创建独立的 ResourceQuota,确保资源上限可控。
- NetworkPolicy 锁定: 在每个 Namespace 中应用默认拒绝策略,然后显式允许同租户 Namespace 之间的灾备同步流量。
- 镜像拉取加速适配: 在灾备 Namespace 中部署镜像缓存 DaemonSet,并通过 NetworkPolicy 允许其访问镜像仓库,但禁止跨租户访问。
3.5 故障窗口隔离的验证清单
部署完成后,建议按以下清单进行验证:
- 资源隔离验证: 在租户 A 的 Namespace 中创建大量 Pod 直至触发 ResourceQuota 上限,确认租户 B 的 Pod 不受影响。
- 网络隔离验证: 从租户 A 的 Pod 尝试访问租户 B 的 Service IP,确认连接被 NetworkPolicy 拒绝。
- 镜像拉取隔离验证: 模拟租户 A 的镜像仓库故障,确认租户 B 的镜像拉取不受影响(依赖独立的镜像缓存或仓库端点)。
- 灾备切换隔离验证: 触发租户 A 的灾备切换,确认切换过程中租户 B 的 Namespace 无任何资源或网络波动。
关键指标: 多租户隔离的故障窗口半径应控制在 单个 Namespace 级别。如果故障影响跨越了 Namespace 边界,说明隔离策略存在漏洞,需要立即修复。