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在多租户故障域中的协同工作方式:
3.5 三种模式的配置清单对比
| 模式 | API资源 | 作用范围 | 滚动更新故障域价值 |
|---|---|---|---|
| Namespace隔离 | Namespace | 整个集群 | 资源命名隔离、RBAC权限隔离、生命周期独立 |
| 资源配额 | ResourceQuota | 单个Namespace | 防止更新时资源超限导致其他租户Pod被驱逐 |
| 网络策略 | NetworkPolicy | 单个Namespace(可跨) | 阻断跨租户流量,防止故障扩散 |
3.6 实施检查清单
- Namespace规划:每个租户一个Namespace,命名规范如
tenant-{id},并打上tenant: {id}标签供NetworkPolicy引用。 - ResourceQuota配置:为每个Namespace设置CPU/Memory/Pod配额,Pod配额需考虑滚动更新的
maxSurge余量。 - NetworkPolicy部署:创建默认拒绝入站策略,再按需开放同Namespace内通信或特定服务端口。
- 验证测试:模拟滚动更新,确认跨Namespace的Pod无法互相访问,且资源配额不足时更新会优雅阻塞而非崩溃。
生产建议:使用
kubectl describe quota -n tenant-a定期检查配额使用率。当配额使用率超过80%时,应提前扩容或调整租户资源限制,避免滚动更新因资源不足而中断。