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 特性门控
注意:软限制目前仍处于 Alpha 阶段,不建议在生产环境的滚动升级流程中依赖软限制。硬限制是资源配额校准的基石。

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 对象数量上限
滚动升级校准要点:在升级前,必须检查 Namespace 内 requests.cpu 和 requests.memory 的已使用量是否接近硬限制。如果剩余配额小于新 Pod 的 requests,升级将阻塞。建议使用 kubectl describe quota <quota-name> -n <ns> 查看当前使用量。

2.5 ResourceQuota 生命周期与校验流程

下图展示了 ResourceQuota 在 Pod 创建时的校验流程,帮助理解配额如何影响滚动升级:

ResourceQuota 校验流程(Pod 创建时) 用户提交 Pod API Server 准入 ResourceQuota 控制器 配额是否充足? 是 Pod 创建成功 否 Pod 创建被拒绝 滚动升级中,新 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。如果两个配额对象对同一资源设置了不同值,则 取最大值 作为有效限制。

设计建议:将计算资源、存储资源、对象计数分别定义在不同的 ResourceQuota 对象中,便于独立管理和审计。滚动升级前,只需关注 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 必须 ≤ 剩余量,否则升级失败。
自动化校准建议:在 CI/CD 流水线中,在触发滚动升级前自动执行 kubectl get quota -n <ns> -o json 并解析剩余量,与待升级 Deployment 的 spec.template.spec.containers[].resources.requests 做比较。若剩余量不足,则阻止升级并告警。

2.8 配额与滚动升级的冲突场景

以下 SVG 图展示了滚动升级中因配额不足导致升级阻塞的典型场景:

滚动升级配额冲突场景 初始 Pod 副本数:5 已用 CPU:2.5 核 滚动升级触发 新 Pod requests.cpu: 0.6 配额检查 剩余 CPU:1.5 核 冲突:新 Pod 需 0.6 核 但升级期间新旧 Pod 共存需 3.1 核 滚动升级策略:先创建新 Pod,再删除旧 Pod 升级期间峰值 = 旧 Pod + 新 Pod 需确保峰值 ≤ 配额硬限制 解决方案:升级前校准配额 1. 计算升级期间最大资源需求 = 旧 Pod 总 requests + 新 Pod 总 requests 2. 确保该值 ≤ ResourceQuota 硬限制;否则需调整升级策略或临时提升配额