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