3、多租户隔离模型设计:基于Namespace的软隔离、基于CiliumNetworkPolicy的硬隔离、租户资源配额策略
在多租户控制面架构中,隔离模型是保障租户安全与资源公平性的核心设计。本章围绕三种互补的隔离机制展开:Namespace 软隔离提供逻辑边界与资源命名空间;CiliumNetworkPolicy 硬隔离实现基于身份的网络零信任;资源配额策略确保租户间的资源竞争可控。三者共同构成“逻辑分域 + 网络强控 + 资源限界”的纵深隔离体系。
设计原则:隔离模型应遵循“默认拒绝、最小权限、显式允许”的安全基线。Namespace 负责租户身份与资源分组,Cilium 策略负责流量管控,配额负责资源上限,三者缺一不可。
3.1 基于Namespace的软隔离
Namespace 是 Kubernetes 原生的多租户逻辑隔离单元。在 Cilium 多租户架构中,Namespace 承担以下职责:
- 租户身份锚点:每个租户对应一个或多个 Namespace,通过标签(如
tenant=alpha)标识租户归属。 - 资源逻辑分组:Pod、Service、ConfigMap 等资源在 Namespace 内独立管理,避免命名冲突。
- 策略作用域:CiliumNetworkPolicy 可以基于 Namespace 标签选择器匹配目标租户,实现策略的租户级粒度。
- 软隔离局限:Namespace 本身不提供网络隔离,默认情况下不同 Namespace 的 Pod 可以互通,因此需要硬隔离策略补充。
| 隔离维度 | Namespace 软隔离能力 | 局限 |
|---|---|---|
| 资源命名 | 完全隔离,同名资源可共存于不同 Namespace | 无 |
| 网络通信 | 默认允许跨 Namespace 通信 | 需配合 NetworkPolicy 或 CiliumNetworkPolicy 实现隔离 |
| 资源配额 | 支持 ResourceQuota 限制 Namespace 级别资源 | 无法限制跨 Namespace 的流量带宽 |
| 身份认证 | 基于 RBAC 的 Namespace 级别权限控制 | 不涉及网络身份 |
3.2 基于CiliumNetworkPolicy的硬隔离
CiliumNetworkPolicy 提供比 Kubernetes NetworkPolicy 更强大的网络隔离能力,支持 L3/L4/L7 层策略、基于身份的安全组、以及租户级策略继承。在多租户场景中,硬隔离策略的设计要点如下:
- 默认拒绝所有入站和出站流量:每个租户的 Namespace 起始状态为完全隔离,仅显式允许的流量可以通过。
- 租户内允许:通过
fromEndpoints和toEndpoints选择器匹配同租户标签,允许内部通信。 - 跨租户拒绝:利用
fromRequirements或toRequirements排除其他租户标签,实现租户间隔离。 - 共享服务例外:对于 DNS、监控、日志等共享基础设施,通过独立策略显式允许特定流量。
关键策略模式:使用
namespace: tenant=alpha 标签选择器定义租户边界,配合 EndpointSelector 实现 Pod 级精细控制。策略生效顺序:先评估 CiliumClusterwideNetworkPolicy,再评估 CiliumNetworkPolicy。
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: tenant-alpha-isolation
namespace: tenant-alpha-ns
spec:
endpointSelector:
matchLabels:
tenant: alpha
ingress:
# 允许同租户 Pod 入站
- fromEndpoints:
- matchLabels:
tenant: alpha
# 允许集群 DNS 服务
- fromEndpoints:
- matchLabels:
k8s:io.kubernetes.pod.namespace: kube-system
matchExpressions:
- key: k8s-app
operator: In
values: ["kube-dns"]
egress:
# 允许同租户 Pod 出站
- toEndpoints:
- matchLabels:
tenant: alpha
# 允许访问集群 DNS
- toEndpoints:
- matchLabels:
k8s:io.kubernetes.pod.namespace: kube-system
k8s-app: kube-dns
# 允许访问外部 API(需显式定义)
- toCIDR:
- 0.0.0.0/0
toPorts:
- ports:
- port: "443"
protocol: TCP
| 策略类型 | 作用范围 | 多租户典型用途 |
|---|---|---|
| CiliumNetworkPolicy | 单个 Namespace | 租户内部隔离规则、允许同租户通信、拒绝跨租户 |
| CiliumClusterwideNetworkPolicy | 整个集群 | 全局默认拒绝策略、共享基础设施白名单、租户间互访规则 |
| CiliumNetworkPolicy (L7) | HTTP/gRPC 层 | 租户 API 网关限流、请求路径过滤、敏感操作审计 |
3.3 租户资源配额策略
资源配额(ResourceQuota)是防止租户资源滥用、保障公平性的关键机制。在多租户控制面中,配额策略需要与 Cilium 策略协同设计:
- 计算资源配额:限制每个租户 Namespace 的 CPU、内存、GPU 等计算资源总量。
- 存储资源配额:限制 PVC 数量及总存储容量,避免单个租户耗尽集群存储。
- 对象数量配额:限制 Pod、Service、ConfigMap 等 Kubernetes 对象数量,防止控制面过载。
- 网络带宽配额(Cilium 扩展):通过 Cilium 的 Bandwidth Manager 或 Egress Gateway 策略,限制租户出站带宽。
注意:ResourceQuota 仅限制资源创建,不限制已运行 Pod 的资源使用。建议结合 LimitRange 设置 Pod 级别的默认资源请求与限制,形成双层资源管控。
apiVersion: v1
kind: ResourceQuota
metadata:
name: tenant-alpha-quota
namespace: tenant-alpha-ns
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
persistentvolumeclaims: "5"
requests.storage: "50Gi"
pods: "20"
services: "10"
configmaps: "15"
---
apiVersion: v1
kind: LimitRange
metadata:
name: tenant-alpha-limits
namespace: tenant-alpha-ns
spec:
limits:
- default:
cpu: "500m"
memory: "512Mi"
defaultRequest:
cpu: "200m"
memory: "256Mi"
type: Container
3.4 隔离模型综合设计清单
在实际工程中,多租户隔离模型的落地需要遵循以下步骤:
- 租户身份定义:为每个租户分配唯一标签(如
tenant=alpha),并创建对应 Namespace。 - 全局默认拒绝策略:部署 CiliumClusterwideNetworkPolicy,默认拒绝所有跨 Namespace 流量。
- 租户内部策略:为每个租户创建 CiliumNetworkPolicy,允许同标签 Pod 通信,并显式允许共享服务。
- 资源配额配置:根据租户 SLA 设置 ResourceQuota 和 LimitRange,确保资源公平分配。
- 网络带宽限制(可选):使用 Cilium Bandwidth Manager 或 Egress Gateway 策略,限制租户出站带宽。
- 策略验证与监控:使用
cilium connectivity test验证隔离效果,通过 Hubble 监控流量合规性。
最佳实践:建议将隔离策略与租户生命周期管理集成,在租户创建时自动生成 Namespace、ResourceQuota、LimitRange 和基础 CiliumNetworkPolicy,减少人工配置错误。