3、多租户架构模式:Namespace隔离、资源配额、网络策略基础

在Kubernetes中实现多租户故障域隔离,核心依赖三大基础模式:Namespace(命名空间)作为租户边界、ResourceQuota(资源配额)作为容量边界、NetworkPolicy(网络策略)作为通信边界。三者共同构成租户隔离的“铁三角”,是滚动更新期间防止租户间相互干扰的前提条件。

3.1 Namespace隔离:租户的逻辑边界

Namespace是Kubernetes多租户的第一道防线。每个租户拥有独立的Namespace,其内的Pod、Service、ConfigMap等资源天然与其它Namespace隔离。滚动更新时,Namespace确保一个租户的Deployment变更不会误操作或误删除另一个租户的资源。

隔离维度 Namespace级别效果 滚动更新相关性
资源命名 不同Namespace允许同名Deployment 避免租户间资源名冲突导致的更新失败
API访问 RBAC可精确到Namespace级别 租户只能操作自己的Deployment,无法影响其他租户的滚动更新
资源生命周期 删除Namespace即清理所有下属资源 故障恢复时可快速重置整个租户环境
最佳实践:每个租户的Deployment、Service、HPA等资源必须全部归属到该租户专属Namespace。不要在default Namespace中混用多租户资源,否则滚动更新时的故障域会完全失效。

3.2 资源配额:防止租户资源抢占

ResourceQuota为每个Namespace设置资源上限,包括CPU、内存、Pod数量、PVC存储等。滚动更新期间,ReplicaSet会临时创建新Pod、销毁旧Pod,资源配额确保这一过程不会超出租户的容量边界,从而避免一个租户的更新操作“挤占”其他租户的资源。

apiVersion: v1
kind: ResourceQuota
metadata:
  name: tenant-quota
  namespace: tenant-a
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    pods: "20"
    persistentvolumeclaims: "5"
    services: "10"
关键指标:滚动更新时,旧Pod终止与新Pod启动之间存在短暂重叠。ResourceQuota的pods上限必须大于maxSurge + 当前副本数,否则更新会因配额不足而阻塞。建议将Pod配额设置为副本数的1.5倍以上。

3.3 网络策略:租户通信的防火墙

NetworkPolicy通过标签选择器和CIDR规则控制Pod之间的流量。在多租户场景下,默认策略应拒绝所有跨Namespace的入站流量,仅允许同一租户内的Pod互相通信。滚动更新时,新Pod的IP会变化,NetworkPolicy基于标签而非IP,因此无需调整策略即可保持隔离。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-cross-tenant
  namespace: tenant-a
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          tenant: tenant-a
常见陷阱:NetworkPolicy默认是“允许所有”的,必须显式创建拒绝策略。如果忘记为租户Namespace设置网络策略,滚动更新期间新Pod可能被其他租户的恶意Pod直接访问,导致数据泄露或故障扩散。

3.4 三种模式的协同关系

下图展示了Namespace、ResourceQuota、NetworkPolicy在多租户故障域中的协同工作方式:

多租户故障域隔离铁三角 租户A Namespace Deployment (滚动更新中) 新ReplicaSet (启动中) 旧ReplicaSet (终止中) ResourceQuota: CPU 8 / Mem 16Gi NetworkPolicy: 仅允许同Namespace 租户B Namespace Deployment (稳定运行) ReplicaSet (3副本) Service (ClusterIP) ResourceQuota: CPU 4 / Mem 8Gi NetworkPolicy: 仅允许同Namespace 隔离 Namespace提供逻辑边界 → ResourceQuota防止资源抢占 → NetworkPolicy阻断跨租户流量

3.5 三种模式的配置清单对比

模式 API资源 作用范围 滚动更新故障域价值
Namespace隔离 Namespace 整个集群 资源命名隔离、RBAC权限隔离、生命周期独立
资源配额 ResourceQuota 单个Namespace 防止更新时资源超限导致其他租户Pod被驱逐
网络策略 NetworkPolicy 单个Namespace(可跨) 阻断跨租户流量,防止故障扩散

3.6 实施检查清单

  1. Namespace规划:每个租户一个Namespace,命名规范如tenant-{id},并打上tenant: {id}标签供NetworkPolicy引用。
  2. ResourceQuota配置:为每个Namespace设置CPU/Memory/Pod配额,Pod配额需考虑滚动更新的maxSurge余量。
  3. NetworkPolicy部署:创建默认拒绝入站策略,再按需开放同Namespace内通信或特定服务端口。
  4. 验证测试:模拟滚动更新,确认跨Namespace的Pod无法互相访问,且资源配额不足时更新会优雅阻塞而非崩溃。
生产建议:使用kubectl describe quota -n tenant-a定期检查配额使用率。当配额使用率超过80%时,应提前扩容或调整租户资源限制,避免滚动更新因资源不足而中断。