3. 多租户模型:Kubernetes Namespace 与租户隔离、资源配额(ResourceQuota)、网络策略(NetworkPolicy)

在云原生灾备场景中,多租户隔离是保障故障窗口不扩散的核心防线。Kubernetes 原生提供的 Namespace、ResourceQuota 与 NetworkPolicy 三者共同构成了租户隔离的“铁三角”。本章将深入剖析这三者的协同机制,并给出面向灾备镜像拉取加速场景的最佳实践。

3.1 租户隔离模型:从逻辑边界到故障边界

Kubernetes 的 Namespace 是租户隔离的基本单元。每个 Namespace 可以视为一个虚拟集群,拥有独立的资源视图、访问控制和策略边界。在灾备场景下,Namespace 的隔离能力直接决定了故障窗口的半径。

核心原则: 一个租户 = 一个或多个 Namespace。租户的故障窗口应被严格限制在其所属 Namespace 集合内,不得跨 Namespace 扩散。
Kubernetes 多租户隔离模型(灾备视角) 租户 A(生产) Namespace: prod-a Pod / Service ResourceQuota: 8C/16G Namespace: dr-a Pod / Service ResourceQuota: 4C/8G NetworkPolicy: 允许 prod-a ↔ dr-a 禁止跨租户访问 租户 B(生产) Namespace: prod-b Pod / Service ResourceQuota: 6C/12G Namespace: dr-b Pod / Service ResourceQuota: 3C/6G NetworkPolicy: 允许 prod-b ↔ dr-b 禁止跨租户访问 租户隔离边界(故障窗口不可跨越)

3.2 ResourceQuota:硬性资源边界与故障窗口控制

ResourceQuota 是 Namespace 级别的资源配额控制器。它定义了 Namespace 内所有 Pod 可消耗的 CPU、内存、存储等资源上限。在灾备场景下,ResourceQuota 是防止“租户 A 的故障导致租户 B 资源枯竭”的关键手段。

最佳实践: 为每个租户的灾备 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
资源类型 配额字段 灾备场景推荐值 故障窗口影响
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 压力过大导致控制面故障
常见陷阱: 仅配置 NetworkPolicy 而不配置 ResourceQuota,会导致网络隔离但资源仍可被耗尽。两者必须同时启用,才能实现真正的故障窗口隔离。

3.4 多租户隔离策略的协同工作流

在灾备镜像拉取加速场景中,三个隔离机制按以下顺序协同工作:

  1. Namespace 划分: 每个租户至少分配一个生产 Namespace 和一个灾备 Namespace,通过标签 tenant: <租户ID> 标识。
  2. ResourceQuota 绑定: 为每个 Namespace 创建独立的 ResourceQuota,确保资源上限可控。
  3. NetworkPolicy 锁定: 在每个 Namespace 中应用默认拒绝策略,然后显式允许同租户 Namespace 之间的灾备同步流量。
  4. 镜像拉取加速适配: 在灾备 Namespace 中部署镜像缓存 DaemonSet,并通过 NetworkPolicy 允许其访问镜像仓库,但禁止跨租户访问。
多租户隔离策略协同工作流 步骤 1 Namespace 划分 租户标签绑定 步骤 2 ResourceQuota 资源上限绑定 步骤 3 NetworkPolicy 网络隔离锁定 步骤 4 镜像加速 缓存部署 最终效果 每个租户拥有独立的资源边界 + 网络边界 + 镜像缓存 故障窗口被严格限制在租户内部,无法跨租户扩散

3.5 故障窗口隔离的验证清单

部署完成后,建议按以下清单进行验证:

  • 资源隔离验证: 在租户 A 的 Namespace 中创建大量 Pod 直至触发 ResourceQuota 上限,确认租户 B 的 Pod 不受影响。
  • 网络隔离验证: 从租户 A 的 Pod 尝试访问租户 B 的 Service IP,确认连接被 NetworkPolicy 拒绝。
  • 镜像拉取隔离验证: 模拟租户 A 的镜像仓库故障,确认租户 B 的镜像拉取不受影响(依赖独立的镜像缓存或仓库端点)。
  • 灾备切换隔离验证: 触发租户 A 的灾备切换,确认切换过程中租户 B 的 Namespace 无任何资源或网络波动。
关键指标: 多租户隔离的故障窗口半径应控制在 单个 Namespace 级别。如果故障影响跨越了 Namespace 边界,说明隔离策略存在漏洞,需要立即修复。
策略类型 作用 灾备场景关键配置
Ingress(入站) 控制哪些流量可以进入 Pod 仅允许同租户 Namespace 的 Pod 和灾备同步组件访问
Egress(出站) 控制 Pod 可以访问哪些目标 仅允许访问同租户 Namespace 的 Service 和镜像仓库
默认拒绝 未显式允许的流量全部拒绝 每个 Namespace 必须配置默认拒绝策略,防止遗漏