2. ResourceQuota 入门:对象定义、作用域与生效范围、多租户资源隔离基础

ResourceQuota 是 Kubernetes 内置的准入控制机制,用于限制命名空间(Namespace)级别的聚合资源消耗。它不直接管理单个 Pod,而是对命名空间内所有 Pod 的 资源总和 进行硬性约束。理解 ResourceQuota 的对象定义、作用域与生效范围,是实现多租户资源隔离的第一步。

2.1 ResourceQuota 对象定义

一个标准的 ResourceQuota 资源清单包含 apiVersion、kind、metadata 和 spec 四个核心字段。spec.hard 字段定义资源上限,spec.scopes 字段定义配额的作用域。

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: team-alpha
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    pods: "10"
    persistentvolumeclaims: "5"
    requests.storage: "50Gi"
  scopes:
  - NotTerminating
  - BestEffort
关键字段说明:
  • requests.cpu / requests.memory:所有 Pod 的 request 总和上限。
  • limits.cpu / limits.memory:所有 Pod 的 limit 总和上限。
  • pods:命名空间内允许运行的 Pod 最大数量。
  • persistentvolumeclaims / requests.storage:PVC 数量及存储总量上限。
  • scopes:可选字段,用于限定配额只对特定类别的 Pod 生效。

2.2 作用域与生效范围

ResourceQuota 的生效范围由 scopes 字段控制。如果不指定 scopes,则配额对命名空间内 所有 Pod 生效。Kubernetes 内置了四种作用域,用于精细化控制配额覆盖的 Pod 类别:

作用域(Scope) 含义 匹配的 Pod 特征
Terminating 终止中 Pod spec.activeDeadlineSeconds >= 0
NotTerminating 非终止中 Pod spec.activeDeadlineSeconds 未设置或为 nil
BestEffort 尽力而为 Pod 未设置 requests 和 limits(QoS 等级为 BestEffort)
NotBestEffort 非尽力而为 Pod 设置了 requests 或 limits(QoS 等级为 Burstable 或 Guaranteed)
作用域组合规则: 一个 ResourceQuota 可以同时指定多个作用域,此时配额只对 同时满足所有作用域 的 Pod 生效。例如 scopes: [NotTerminating, BestEffort] 只限制非终止且尽力而为的 Pod。

2.3 多租户资源隔离基础

在 Kubernetes 中,多租户资源隔离的基石是 命名空间 + ResourceQuota + LimitRange 的组合。ResourceQuota 负责总量控制,LimitRange 负责单个 Pod 的边界约束。两者配合,可以防止租户(团队)之间互相抢占资源。

多租户资源隔离架构 Namespace: team-alpha ResourceQuota: compute-quota CPU: 4 req / 8 lim | Mem: 8Gi req / 16Gi lim LimitRange: default-limits min: 0.1c/128Mi | max: 2c/4Gi Pod: app-v1 Pod: app-v2 Namespace: team-beta ResourceQuota: beta-quota CPU: 2 req / 4 lim | Mem: 4Gi req / 8Gi lim LimitRange: beta-limits min: 0.2c/256Mi | max: 1c/2Gi Pod: web-1 Pod: web-2 集群资源池(Cluster Resource Pool) 总 CPU: 32 核 | 总内存: 128Gi 每个命名空间独立配额,互不干扰;LimitRange 约束单个 Pod 边界,防止极端资源申请

2.4 多租户隔离最佳实践

  • 命名空间隔离: 每个租户(团队、项目)使用独立的 Namespace,配合 RBAC 控制访问权限。
  • ResourceQuota 总量控制: 为每个 Namespace 设置 CPU、内存、存储、Pod 数量的硬上限,防止单个租户耗尽集群资源。
  • LimitRange 边界约束: 设置单个 Pod 的最小/最大资源请求,避免租户内部出现极端资源申请。
  • 作用域精细化: 使用 BestEffort 和 NotBestEffort 作用域,对离线任务和在线服务分别设置配额。
  • 监控与告警: 定期检查 kubectl describe quota 输出的 Used 字段,当使用率超过 80% 时触发告警。
实战检查命令:
# 查看命名空间内的所有 ResourceQuota
kubectl get resourcequota -n team-alpha

# 查看配额使用详情(Used / Hard)
kubectl describe quota compute-quota -n team-alpha

# 输出示例:
# Name:            compute-quota
# Namespace:       team-alpha
# Resource         Used  Hard
# --------         ---   ----
# requests.cpu     2.5   4
# requests.memory  5Gi   8Gi
# limits.cpu       4     8
# limits.memory    10Gi  16Gi
# pods             6     10

2.5 常见误区与避坑

误区 正确理解
ResourceQuota 可以限制单个 Pod 的资源 ResourceQuota 只限制 总和,单个 Pod 的边界由 LimitRange 控制
不指定 scopes 时配额对所有资源生效 不指定 scopes 时对 所有 Pod 生效,但不会影响 PVC、ConfigMap 等非 Pod 资源
配额只限制 CPU 和内存 配额还可以限制 pods、persistentvolumeclaims、requests.storage、configmaps、secrets 等
多个 ResourceQuota 可以叠加 同一命名空间可以创建多个 ResourceQuota,但 取最严格约束(所有配额的交集)
核心原则: ResourceQuota 是 准入控制 机制,在 Pod 创建时检查配额是否超限。如果超限,API Server 会直接拒绝创建请求,并返回 403 Forbidden 错误。因此,配额变更不会影响已运行的 Pod,只影响后续的创建操作。