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