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 级别权限控制 不涉及网络身份
Namespace 软隔离与硬隔离协同架构 租户A Namespace (tenant=alpha) Pod A1 app=frontend Pod A2 app=backend ResourceQuota: CPU 4核 / 内存 8Gi / Pod 20 NetworkPolicy: 允许同租户,拒绝跨租户 租户B Namespace (tenant=beta) Pod B1 app=web Pod B2 app=db ResourceQuota: CPU 2核 / 内存 4Gi / Pod 10 NetworkPolicy: 允许同租户,拒绝跨租户 CiliumNetworkPolicy 阻断 允许 软隔离:Namespace 逻辑分组 + ResourceQuota 资源限制 硬隔离:CiliumNetworkPolicy 基于身份的网络零信任策略 协同效果:租户A与租户B在资源与网络层面完全隔离

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
租户资源配额策略分层模型 集群资源池(CPU / 内存 / 存储 / 网络) 总容量:64核CPU / 256Gi内存 / 1Ti存储 ResourceQuota 租户配额分配 租户A: CPU 8核 / 内存16Gi Pod 20 / PVC 5 租户B: CPU 4核 / 内存8Gi Pod 10 / PVC 3 租户C: CPU 2核 / 内存4Gi Pod 5 / PVC 2 LimitRange Pod 级别默认限制 默认 request: CPU 200m / 内存256Mi | 默认 limit: CPU 500m / 内存512Mi 防止单个 Pod 过度占用租户配额

3.4 隔离模型综合设计清单

在实际工程中,多租户隔离模型的落地需要遵循以下步骤:

  1. 租户身份定义:为每个租户分配唯一标签(如 tenant=alpha),并创建对应 Namespace。
  2. 全局默认拒绝策略:部署 CiliumClusterwideNetworkPolicy,默认拒绝所有跨 Namespace 流量。
  3. 租户内部策略:为每个租户创建 CiliumNetworkPolicy,允许同标签 Pod 通信,并显式允许共享服务。
  4. 资源配额配置:根据租户 SLA 设置 ResourceQuota 和 LimitRange,确保资源公平分配。
  5. 网络带宽限制(可选):使用 Cilium Bandwidth Manager 或 Egress Gateway 策略,限制租户出站带宽。
  6. 策略验证与监控:使用 cilium connectivity test 验证隔离效果,通过 Hubble 监控流量合规性。
最佳实践:建议将隔离策略与租户生命周期管理集成,在租户创建时自动生成 Namespace、ResourceQuota、LimitRange 和基础 CiliumNetworkPolicy,减少人工配置错误。