Kubernetes 资源配额基础:ResourceQuota 对象定义、作用域、硬限制与软限制、配额范围(Namespace 级别)
在 Kubernetes 集群中,资源配额(ResourceQuota)是保障多租户环境下资源公平性与稳定性的核心机制。它通过限制命名空间(Namespace)级别的聚合资源消耗,防止单个团队或应用“跑满”集群,从而为滚动升级等关键操作提供可预测的资源底座。本章将深入解析 ResourceQuota 的对象定义、作用域、硬限制与软限制,以及 Namespace 级别的配额范围。
2.1 ResourceQuota 对象定义与核心字段
ResourceQuota 是一个 Kubernetes API 对象,定义在 v1 API 组中。其核心结构包含 spec.hard(硬限制)和 spec.scopes(作用域)两个关键字段。以下是一个典型的 ResourceQuota YAML 定义:
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"
persistentvolumeclaims: "5"
pods: "20"
scopes:
- NotTerminating
- BestEffort
字段说明:
- hard:定义资源使用的上限阈值,一旦超出则 API Server 会拒绝创建新 Pod 或 PVC。
- scopes:限定配额生效的 Pod 生命周期或 QoS 类别范围,用于精细化控制。
- metadata.namespace:配额对象必须绑定到特定 Namespace,无法跨 Namespace 生效。
requests.cpu/memory 和 limits.cpu/memory 的硬限制,避免升级过程中因资源争抢导致 Pod 驱逐或调度失败。
2.2 硬限制(Hard)与软限制(Soft)
ResourceQuota 支持两种限制模式:硬限制和软限制。两者的核心差异在于是否允许临时超出以及是否触发告警。
| 特性 | 硬限制(Hard) | 软限制(Soft) |
|---|---|---|
| 定义位置 | spec.hard |
spec.soft(Kubernetes 1.30+ 实验特性) |
| 行为 | 超出后立即拒绝新资源创建 | 允许临时超出,但触发 ExceededGracePeriod 事件 |
| 适用场景 | 生产环境严格资源管控 | 开发/测试环境弹性缓冲 |
| 滚动升级影响 | 升级前必须校准配额,否则新 Pod 无法创建 | 允许短暂资源超分,但需配合监控告警 |
| 默认支持 | 所有 Kubernetes 版本 | 需启用 ResourceQuotaSoftLimits 特性门控 |
2.3 配额作用域(Scopes)
作用域允许将配额规则限定到特定类型的 Pod,避免“一刀切”。Kubernetes 内置了以下作用域:
- Terminating / NotTerminating:基于 Pod 是否设置了
activeDeadlineSeconds。滚动升级中的 Job 或批处理任务通常属于 Terminating 范围。 - BestEffort / NotBestEffort:基于 Pod 的 QoS 类别。BestEffort Pod(未设置 requests/limits)在资源紧张时最容易被驱逐。
- CrossNamespacePodAffinity:限制跨 Namespace Pod 亲和性调度。
- PriorityClass:基于 PriorityClass 名称(需启用
ResourceQuotaScopeSelectors特性门控)。
作用域组合示例:
spec:
hard:
pods: "10"
scopes:
- NotTerminating
- NotBestEffort
上述配额仅对 非终止型 且 非 BestEffort 的 Pod 生效,即只限制长期运行且有资源预留的 Pod。
2.4 Namespace 级别配额范围与资源类型
ResourceQuota 的作用范围始终是单个 Namespace。它支持对以下三类资源进行限制:
| 资源类别 | 示例资源名称 | 说明 |
|---|---|---|
| 计算资源 | requests.cpu, limits.memory, requests.ephemeral-storage |
CPU、内存、临时存储的请求与限制 |
| 存储资源 | persistentvolumeclaims, requests.storage, count/<storageclass>.storage.k8s.io/<size> |
PVC 数量、总存储容量、特定 StorageClass 的容量 |
| 对象计数 | pods, services, secrets, configmaps, count/<group>.<resource> |
Kubernetes 对象数量上限 |
requests.cpu 和 requests.memory 的已使用量是否接近硬限制。如果剩余配额小于新 Pod 的 requests,升级将阻塞。建议使用 kubectl describe quota <quota-name> -n <ns> 查看当前使用量。
2.5 ResourceQuota 生命周期与校验流程
下图展示了 ResourceQuota 在 Pod 创建时的校验流程,帮助理解配额如何影响滚动升级:
2.6 多配额对象与优先级
一个 Namespace 可以创建多个 ResourceQuota 对象,Kubernetes 会计算所有配额对象的 并集 作为最终限制。例如:
# quota-compute.yaml
spec:
hard:
requests.cpu: "4"
pods: "10"
# quota-storage.yaml
spec:
hard:
persistentvolumeclaims: "5"
requests.storage: "50Gi"
此时 Namespace 的总限制为:CPU 请求 ≤ 4 核,Pod 数量 ≤ 10,PVC 数量 ≤ 5,存储总量 ≤ 50Gi。如果两个配额对象对同一资源设置了不同值,则 取最大值 作为有效限制。
quota-compute 的 CPU/内存使用量。
2.7 配额状态查询与监控
使用 kubectl describe quota 可以查看当前使用量和硬限制:
kubectl describe quota compute-quota -n team-alpha
Name: compute-quota
Namespace: team-alpha
Resource Used Hard
-------- ---- ----
limits.cpu 3 8
limits.memory 6Gi 16Gi
pods 12 20
requests.cpu 2.5 4
requests.memory 5Gi 8Gi
关键指标解读:
- Used:当前 Namespace 内所有 Pod 的聚合资源使用量。
- Hard:配额上限。
- 剩余量 = Hard - Used:滚动升级时,新 Pod 的 requests 必须 ≤ 剩余量,否则升级失败。
kubectl get quota -n <ns> -o json 并解析剩余量,与待升级 Deployment 的 spec.template.spec.containers[].resources.requests 做比较。若剩余量不足,则阻止升级并告警。
2.8 配额与滚动升级的冲突场景
以下 SVG 图展示了滚动升级中因配额不足导致升级阻塞的典型场景: