4、资源配额(ResourceQuota)原理与配置

ResourceQuota 是 Kubernetes 内置的准入控制机制,用于限制命名空间(Namespace)级别的聚合资源消耗。在集群升级场景中,资源配额的校准直接关系到升级后工作负载的调度成功率与稳定性。若配额设置过紧,升级过程中新 Pod 可能因资源不足无法启动;若设置过松,则可能引发资源争抢,导致关键组件性能下降。

4.1 ResourceQuota 对象详解

ResourceQuota 是一个作用于 Namespace 的 API 对象,通过准入控制器 ResourceQuota 在 Pod 创建或更新时进行校验。其核心数据结构包含 spec.hard(硬限制)和 spec.scopes(作用域)两个关键字段。

核心字段说明:
  • spec.hard:定义该 Namespace 内所有 Pod 的资源使用上限,包括 CPU、内存、存储卷声明(PVC)数量、Service 数量等。
  • spec.scopes:限定配额生效的 Pod 生命周期阶段,如 BestEffort、NotBestEffort、Terminating、NotTerminating。
  • status.hard:当前生效的硬限制值(与 spec.hard 一致)。
  • status.used:当前 Namespace 内已使用的资源量,由 kube-controller-manager 中的 ResourceQuota 控制器定期计算。
ResourceQuota 对象结构图 ResourceQuota spec.hard 资源上限定义 spec.scopes 作用域过滤 status hard + used 资源类型示例 requests.cpu / limits.memory persistentvolumeclaims / services 作用域取值 BestEffort / NotBestEffort Terminating / NotTerminating 状态字段 status.hard: 当前硬限制 status.used: 当前已用量

4.2 作用域(Scopes)详解

作用域允许管理员针对不同 QoS 类或生命周期状态的 Pod 设置差异化的配额。在升级过程中,合理使用作用域可以避免突发性驱逐或临时 Pod 占用过多资源。

作用域 匹配条件 升级场景用途
BestEffort Pod 未设置任何 CPU/内存 requests 和 limits 限制低优先级测试 Pod 的资源占用
NotBestEffort Pod 设置了至少一个 requests 或 limits 保障生产工作负载的资源配额
Terminating Pod 设置了 activeDeadlineSeconds 限制批处理任务在升级期间的并发量
NotTerminating Pod 未设置 activeDeadlineSeconds 保护常驻服务(Deployment/StatefulSet)
升级最佳实践:在集群升级前,建议为 NotTerminating 作用域设置独立的配额,确保核心服务在升级过程中有充足的资源余量。同时为 BestEffort 作用域设置较低的配额上限,防止低优先级 Pod 影响升级稳定性。

4.3 硬限制与软限制

ResourceQuota 支持两种限制模式:硬限制(Hard)和软限制(Soft)。硬限制是强制性的准入控制边界,一旦超过则拒绝创建新资源;软限制则用于监控和告警,不阻断资源创建。

4.3.1 硬限制(Hard Limit)

硬限制是 ResourceQuota 的默认行为。当 Namespace 内资源使用量达到 spec.hard 中定义的上限时,Kubernetes API Server 会拒绝任何导致超额的资源创建请求,并返回 403 Forbidden 错误。

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: production
spec:
  hard:
    requests.cpu: "20"
    requests.memory: "40Gi"
    limits.cpu: "40"
    limits.memory: "80Gi"
    persistentvolumeclaims: "10"
    services: "20"

4.3.2 软限制(Soft Limit)

软限制通过 spec.scopeSelector 中的 matchExpressions 实现,配合 status.used 的监控数据触发告警。Kubernetes 本身不提供内置的软限制告警机制,通常需要结合 Prometheus + Alertmanager 实现。

软限制配置示例(通过 Prometheus 告警规则实现):
groups:
- name: resourcequota-soft-limit
  rules:
  - alert: ResourceQuotaSoftLimit
    expr: |
      kube_resourcequota{type="used"}
      / ignoring(type)
      kube_resourcequota{type="hard"}
      > 0.8
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Namespace {{ $labels.namespace }} 资源使用率超过 80%"
对比维度 硬限制 软限制
准入控制 拒绝超额请求 仅告警,不拒绝
配置位置 spec.hard 外部监控系统
升级场景 防止资源耗尽导致升级失败 提前预警,预留扩容时间
推荐阈值 集群总容量的 70%~80% 硬限制的 80%~90%

4.4 跨 Namespace 的配额管理

在大型集群中,单一 Namespace 的配额管理往往不足以应对复杂的多团队、多环境场景。跨 Namespace 的配额管理通常通过以下三种模式实现:

  1. 层级配额(Hierarchical Quota):借助 kubectl-配额 插件或自定义控制器,在父 Namespace 设置总配额,子 Namespace 继承并分配子配额。
  2. 配额池(Quota Pool):通过 Admission Webhook 动态调整 ResourceQuota,实现 Namespace 间的配额借用与回收。
  3. 全局配额聚合监控:使用 Prometheus 聚合所有 Namespace 的 kube_resourcequota 指标,实现跨 Namespace 的资源使用视图。
跨 Namespace 配额管理架构 集群总资源池 生产 Namespace 预发 Namespace 测试 Namespace ResourceQuota A ResourceQuota B ResourceQuota C ResourceQuota D 跨 Namespace 配额管理关键点 父 Namespace 配额 = 子 Namespace 配额之和 + 预留缓冲

4.5 升级场景中的配额校准策略

在集群升级前,建议执行以下配额校准步骤:

注意:升级过程中,kube-controller-manager 会重启,ResourceQuota 控制器可能出现短暂的配额计算延迟。建议在升级窗口前 30 分钟完成配额调整,并预留 10%~15% 的缓冲资源。
  1. 基线采集:使用 kubectl get resourcequota -A -o json 导出所有 Namespace 的当前配额与使用量。
  2. 使用率分析:计算每个 Namespace 的 status.used / status.hard 比率,标记使用率超过 80% 的 Namespace。
  3. 缓冲预留:对使用率超过 70% 的 Namespace,将硬限制提升 20%~30%,确保升级期间有足够的资源用于 Pod 重建。
  4. 作用域拆分:将 BestEffort 和 NotTerminating 作用域的配额分离,避免临时 Pod 影响常驻服务。
  5. 验证生效:通过 kubectl describe resourcequota -n <namespace> 确认配额更新已生效。
校准阶段 操作命令 预期输出
基线采集 kubectl get quota -A -o wide 所有 Namespace 的配额与使用量列表
使用率分析 kubectl describe quota -n <ns> Used / Hard 详细对比
配额调整 kubectl apply -f quota-update.yaml resourcequota/xxx configured
验证生效 kubectl get quota -n <ns> -o yaml status.hard 与 status.used 更新
性能调优建议:对于大规模集群(100+ 节点),ResourceQuota 控制器默认的同步周期为 5 分钟。在升级前可通过调整 kube-controller-manager 的 --resource-quota-sync-period 参数缩短至 1 分钟,以加快配额状态的更新速度。但需注意,过短的同步周期会增加 API Server 的负载。