多租户集群NetworkPolicy故障诊断与修复 - 第2节

2. 集群蓝图设计原则:命名空间作为租户边界

在多租户 Kubernetes 集群中,命名空间(Namespace)是隔离的第一道防线。每个租户对应一个独立的命名空间,所有资源(Pod、Service、ConfigMap、Secret 等)都归属于该命名空间。这种设计天然提供了资源命名隔离、权限隔离和策略隔离的基础。

2.1 命名空间作为租户边界的核心原则

  • 唯一性:每个租户拥有且仅拥有一个命名空间,命名空间名称与租户标识一一对应。
  • 最小权限:通过 RBAC 将命名空间的操作权限限制给租户管理员,租户无法访问其他命名空间。
  • 资源自管理:租户在其命名空间内可自由创建、修改、删除资源,但受 ResourceQuota 和 LimitRange 约束。
  • 网络隔离:默认拒绝跨命名空间流量,通过 NetworkPolicy 显式放行必要通信。
关键设计决策:不要将多个租户共享同一个命名空间,也不要将单个租户分散到多个命名空间。一个租户一个命名空间,是蓝图的最简最优解。

2.2 命名空间设计示例

租户 命名空间名称 标签 说明
金融事业部 tenant-finance tenant: finance 核心交易系统,高隔离要求
电商平台 tenant-ecommerce tenant: ecommerce Web 服务 + 缓存,中等隔离
数据分析组 tenant-data tenant: data 批处理作业,资源消耗大
共享基础设施 infra-shared tenant: infra 监控、日志、Ingress 控制器
命名空间作为租户边界 — 集群蓝图 Kubernetes 集群 tenant-finance 金融事业部 标签: tenant: finance 高隔离 · 交易系统 tenant-ecommerce 电商平台 标签: tenant: ecommerce Web 服务 · 缓存 tenant-data 数据分析组 标签: tenant: data 批处理 · 高资源消耗 infra-shared(共享基础设施) 监控 · 日志 · Ingress 控制器 每个租户拥有独立命名空间,通过 RBAC + ResourceQuota + NetworkPolicy 实现完全隔离

3. 资源配额(ResourceQuota)与限制范围(LimitRange)设计

仅有命名空间隔离还不够,必须通过 ResourceQuota 和 LimitRange 来防止单个租户耗尽集群资源,或创建不合理规格的 Pod。

3.1 ResourceQuota:总量控制

ResourceQuota 限制命名空间内所有 Pod 的资源总和上限,包括 CPU、内存、存储卷数量、Service 数量等。每个租户命名空间必须绑定一个 ResourceQuota 对象。

最佳实践:为每个租户分配一个“资源池”,配额 = 预留资源 + 弹性缓冲区。例如,租户承诺使用 8 核 16Gi,则配额设为 10 核 20Gi,预留 20% 弹性。

ResourceQuota 示例

apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota-tenant-finance
  namespace: tenant-finance
spec:
  hard:
    requests.cpu: "10"
    requests.memory: "20Gi"
    limits.cpu: "20"
    limits.memory: "40Gi"
    persistentvolumeclaims: "10"
    services: "20"
    count/ingresses.extensions: "5"

3.2 LimitRange:单 Pod 规格约束

LimitRange 限制命名空间内每个 Pod 或容器的资源请求/限制范围,防止租户创建过小或过大的 Pod。它与 ResourceQuota 配合使用,形成“总量 + 单实例”的双重控制。

控制维度 ResourceQuota LimitRange
作用范围 命名空间内所有 Pod 总和 单个 Pod 或容器
控制目标 防止资源被单个租户耗尽 防止 Pod 规格不合理
典型配置 CPU/Memory 总量上限 min/max/default 值
是否必须 强烈建议 强烈建议

LimitRange 示例

apiVersion: v1
kind: LimitRange
metadata:
  name: limits-tenant-finance
  namespace: tenant-finance
spec:
  limits:
  - max:
      cpu: "4"
      memory: "8Gi"
    min:
      cpu: "100m"
      memory: "128Mi"
    default:
      cpu: "500m"
      memory: "1Gi"
    defaultRequest:
      cpu: "200m"
      memory: "512Mi"
    type: Container
常见陷阱:如果只设置 ResourceQuota 而不设置 LimitRange,租户可能创建大量小 Pod 占满配额,或创建超大 Pod 导致调度失败。两者必须成对配置。

3.3 配额设计矩阵

以下矩阵展示了不同租户类型的典型配额配置,供蓝图设计时参考:

租户类型 CPU 请求配额 内存请求配额 单 Pod 最大 CPU 单 Pod 最大内存 存储卷数
核心交易 10 核 20 Gi 4 核 8 Gi 10
Web 服务 8 核 16 Gi 2 核 4 Gi 5
数据分析 20 核 64 Gi 8 核 32 Gi 20
共享基础设施 4 核 8 Gi 1 核 2 Gi 3
ResourceQuota + LimitRange 双重控制模型 ResourceQuota — 命名空间总量上限 LimitRange — 单 Pod 规格约束 Pod A CPU: 200m~2 Mem: 512Mi~4Gi Pod B CPU: 100m~1 Mem: 256Mi~2Gi Pod C CPU: 500m~4 Mem: 1Gi~8Gi 所有 Pod 的 CPU 请求总和 ≤ 10 核,内存请求总和 ≤ 20 Gi(由 ResourceQuota 强制)

3.4 部署检查清单

  1. 创建命名空间:为每个租户创建独立命名空间,并添加 tenant 标签。
  2. 绑定 ResourceQuota:根据租户 SLA 设置 CPU、内存、存储、Service 数量上限。
  3. 绑定 LimitRange:设置单 Pod 的 min/max/default 值,防止规格越界。
  4. 配置 RBAC:将命名空间的管理权限授予租户管理员,只读权限授予审计人员。
  5. 部署 NetworkPolicy:默认拒绝入站/出站流量,按需放行(后续章节详解)。
  6. 验证隔离:使用 kubectl auth can-i 和 kubectl describe quota 确认隔离生效。
核心结论:命名空间 + ResourceQuota + LimitRange 构成了多租户集群的“铁三角”。命名空间划定边界,ResourceQuota 控制总量,LimitRange 约束单实例。三者缺一不可,共同保障集群的稳定性和公平性。