2、Resource Quota 核心概念:Namespace 隔离、资源类型与配额作用域

Resource Quota 是 Kubernetes 实现多租户资源治理的声明式策略引擎。其核心设计围绕三个维度展开:Namespace 隔离边界、可量化的资源类型以及配额生效的作用域。理解这三层结构,是正确编写 Quota 清单、避免资源争抢与调度失败的前提。

2.1 Namespace 隔离:配额的最小作用单元

Resource Quota 始终绑定在 Namespace 级别。每个 Namespace 可以拥有多个 Quota 对象,但同一 Namespace 内的所有 Quota 共同约束该命名空间下的资源总和。隔离机制遵循以下原则:

  • 硬边界:Quota 一旦创建,超出配额的新 Pod 或 PVC 会被 API Server 直接拒绝,不会进入调度队列。
  • 累加性:同一 Namespace 下多个 Quota 对象作用于同一资源类型时,以 最大值 为准(非累加)。
  • 跨 Namespace 无影响:Namespace A 的 Quota 不会限制 Namespace B 的资源使用。
最佳实践:为每个 Namespace 只创建一个 Quota 对象,避免多个 Quota 因作用域重叠导致预期外的“宽松”效果。

2.2 资源类型:三类可配额资源

Kubernetes 将可配额资源分为三大类,每一类对应不同的资源维度和计量单位。下表列出最常用的资源类型及其 YAML 字段名:

资源类别 资源类型(YAML 字段) 单位/示例 说明
计算资源 requests.cpu m(毫核),如 100m 所有容器 CPU request 总和上限
requests.memory Mi/Gi,如 512Mi 所有容器 Memory request 总和上限
存储资源 requests.storage Gi,如 10Gi 所有 PVC 存储声明总和上限
persistentvolumeclaims 整数,如 5 PVC 对象数量上限
对象数量 pods 整数,如 50 Active Pod 数量上限(不含终止中)
services 整数,如 10 Service 对象数量上限
configmaps 整数,如 20 ConfigMap 对象数量上限
注意:limits.cpu 和 limits.memory 属于独立配额维度,与 requests.* 分开计数。如果只配了 requests.* 而未配 limits.*,Pod 的 limits 字段不受 Quota 约束,可能导致节点资源过载。

2.3 配额作用域(Scope):精细化控制生效条件

Resource Quota 支持通过 spec.scopes 字段限定配额仅对特定状态的 Pod 生效。作用域解决了“Terminating Pod 是否占用配额”等实际问题。常用作用域包括:

  • Terminating:仅统计 activeDeadlineSeconds >= 0 的 Pod(通常为 Job 类 Pod)。
  • NotTerminating:仅统计 activeDeadlineSeconds 未设置或为 nil 的 Pod(长期运行 Pod)。
  • BestEffort:仅统计 QoS 等级为 BestEffort 的 Pod(未设置任何 request/limit)。
  • NotBestEffort:仅统计 QoS 等级为 Burstable 或 Guaranteed 的 Pod。
  • CrossNamespacePodAffinity:仅统计使用了跨 Namespace Pod 亲和性的 Pod(K8s v1.22+)。

通过组合作用域,可以实现“BestEffort Pod 最多 10 个,Guaranteed Pod 最多 50 个”的差异化配额策略。

典型组合示例:
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: team-a
spec:
  hard:
    pods: "50"
    requests.cpu: "10"
    requests.memory: "20Gi"
  scopes:
    - NotTerminating
    - NotBestEffort

上述 Quota 仅对 长期运行且非 BestEffort 的 Pod 生效,Job 类 Pod 和 BestEffort Pod 不受此配额限制。

2.4 核心概念关系图

下图展示了 Namespace、Resource Quota、资源类型与作用域之间的层级关系:

Resource Quota 核心概念关系图 Namespace ResourceQuota 对象 计算资源 存储资源 对象数量 requests.cpu requests.memory requests.storage persistentvolumeclaims pods services 配额作用域(Scope) Terminating NotTerminating BestEffort NotBestEffort CrossNamespace

2.5 作用域组合与配额冲突处理

当同一 Namespace 下存在多个 Quota 对象且作用域不同时,Kubernetes 采用 AND 逻辑 合并约束。例如:

  • Quota A:pods: 10,作用域 BestEffort
  • Quota B:pods: 50,作用域 NotBestEffort
  • 实际效果:BestEffort Pod 最多 10 个,NotBestEffort Pod 最多 50 个,互不干扰。
常见陷阱:如果两个 Quota 的作用域有重叠(例如一个无作用域,另一个指定 NotTerminating),则无作用域的 Quota 会覆盖所有 Pod,导致 NotTerminating 作用域的 Quota 实际上被忽略。始终建议为每个 Namespace 只维护一个 Quota 对象,并通过作用域字段做内部细分。

2.6 配额生效的完整流程

下图展示了从 Pod 创建请求到 Quota 校验的完整链路:

Resource Quota 校验流程 用户提交 Pod API Server 准入 ResourceQuota 校验 通过 拒绝 校验逻辑说明 1. 提取 Pod 所属 Namespace 的所有 ResourceQuota 对象 2. 根据 Pod 的 QoS 等级和 activeDeadlineSeconds 匹配作用域 3. 累加当前 Namespace 下已使用的资源(仅统计匹配作用域的 Pod) 4. 判断 已使用 + 新请求 ≤ 配额上限 → 通过/拒绝

2.7 关键设计原则总结

原则 说明 影响
Namespace 级绑定 Quota 不能跨 Namespace,也不能作用于集群级别 每个 Namespace 必须独立规划配额
资源类型独立计数 CPU request、Memory request、存储、对象数各自独立 需分别配置,避免遗漏关键维度
作用域过滤 通过 Scope 区分 Terminating/NotTerminating/BestEffort 等 可实现差异化配额策略
硬拒绝机制 超出配额立即拒绝,不重试、不排队 必须提前规划资源容量
累加非叠加 同一 Namespace 多 Quota 取最大值 推荐单 Namespace 单 Quota