4. 资源配额基础:Kubernetes ResourceQuota 对象、LimitRange 对象、配额作用域与优先级

在 Kubernetes 多租户或团队共享集群场景中,资源配额是保障集群稳定性与公平性的第一道防线。本章将系统讲解 ResourceQuota 与 LimitRange 两个核心 API 对象,以及配额作用域与优先级机制,为后续 Kyverno 策略巡检打下基础。

4.1 ResourceQuota 对象:命名空间级资源硬约束

ResourceQuota 是一个命名空间级别的资源对象,用于限制该命名空间内所有 Pod、Service、PVC 等资源的累计使用上限。一旦配额被设置,任何超出配额的操作都会被 API Server 拒绝。

4.1.1 核心字段与示例

字段 类型 说明
spec.hard map[string]Quantity 定义资源硬限制,如 CPU、内存、Pod 数量、PVC 数量等
spec.scopes []ResourceQuotaScope 指定配额作用域,控制配额生效范围
status.hard map[string]Quantity 当前生效的硬限制(与 spec.hard 一致)
status.used map[string]Quantity 当前命名空间内已使用的资源量
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"
    pods: "10"
    persistentvolumeclaims: "5"
    services: "5"
巡检要点:Kyverno 策略巡检时,应检查 status.used 是否接近 status.hard 的 80% 阈值,提前预警资源耗尽风险。

4.2 LimitRange 对象:Pod 与容器级资源默认值及约束

LimitRange 同样作用于命名空间级别,但它关注的是单个 Pod 或容器的资源请求与限制。它主要完成三件事:

  • 为未显式设置资源请求/限制的容器提供默认值。
  • 限制容器资源请求/限制的最小/最大值。
  • 限制 Pod 内所有容器资源总和的上下界。

4.2.1 LimitRange 示例

apiVersion: v1
kind: LimitRange
metadata:
  name: container-limits
  namespace: team-alpha
spec:
  limits:
  - max:
      cpu: "2"
      memory: "2Gi"
    min:
      cpu: "100m"
      memory: "128Mi"
    default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "200m"
      memory: "256Mi"
    type: Container
关键区别:ResourceQuota 是“总量控制”,LimitRange 是“单体约束”。两者配合使用才能形成完整的资源治理体系。

4.3 配额作用域:精细化控制配额生效范围

ResourceQuota 支持通过 spec.scopes 字段限定配额仅对特定类型的 Pod 生效。常见作用域包括:

作用域 含义 典型场景
BestEffort 仅统计 QoS 为 BestEffort 的 Pod 限制低优先级任务的资源占用
NotBestEffort 排除 BestEffort 的 Pod 保障有 QoS 保证的工作负载
Terminating 仅统计设置了 activeDeadlineSeconds 的 Pod 批处理作业的资源管控
NotTerminating 排除设置了 activeDeadlineSeconds 的 Pod 守护进程或长期服务
PriorityClass 按 PriorityClass 名称匹配 按优先级隔离资源池
apiVersion: v1
kind: ResourceQuota
metadata:
  name: best-effort-quota
  namespace: team-alpha
spec:
  hard:
    pods: "5"
  scopes:
  - BestEffort
注意:当使用作用域时,配额中只能声明与该作用域兼容的资源类型。例如 BestEffort 作用域下不能设置 requests.cpu,因为 BestEffort Pod 不设置资源请求。

4.4 优先级与配额优先级类

Kubernetes 1.18+ 支持基于 PriorityClass 的配额管理。通过将 ResourceQuota 与 PriorityClass 绑定,可以实现不同优先级工作负载的资源隔离。

4.4.1 优先级配额配置示例

apiVersion: v1
kind: ResourceQuota
metadata:
  name: high-priority-quota
  namespace: team-alpha
spec:
  hard:
    pods: "20"
    requests.cpu: "8"
    requests.memory: "16Gi"
  scopeSelector:
    matchExpressions:
    - operator: In
      scopeName: PriorityClass
      values:
      - high-priority

上述配额仅对 priorityClassName: high-priority 的 Pod 生效,确保高优先级任务获得资源保障。

4.5 资源配额与 Kyverno 巡检的关联

在 Kyverno 策略引擎中,巡检 ResourceQuota 和 LimitRange 的配置状态是缓存命中率优化的前置条件:

  • 配额不足会导致 Pod 创建失败,Kyverno 缓存中的准入检查结果失效。
  • LimitRange 缺失会导致部分 Pod 没有资源约束,引发调度不均。
  • 作用域误配会使配额统计不完整,Kyverno 策略判断依据失真。
课程关联:后续章节将基于本章知识,开发 Kyverno 策略来巡检 ResourceQuota 的 status.used/status.hard 比率,以及 LimitRange 的默认值是否合理,从而提升缓存命中预测的准确性。
ResourceQuota 与 LimitRange 协同关系图 命名空间资源治理:ResourceQuota + LimitRange 协同 命名空间:team-alpha ResourceQuota 总量硬约束 pods: 10 requests.cpu: 4 requests.memory: 8Gi limits.cpu: 8 LimitRange 单体默认值与约束 default: cpu 500m defaultRequest: cpu 200m max: cpu 2 / mem 2Gi min: cpu 100m / mem 128Mi Pod 工作负载 受 ResourceQuota 总量限制 受 LimitRange 单体约束 QoS 由资源请求/限制决定 配额作用域:BestEffort / PriorityClass

4.6 配额优先级与作用域选择策略

在实际生产环境中,推荐按以下优先级顺序配置资源配额:

  1. 全局基础配额:为每个命名空间设置基础 ResourceQuota,保障集群整体资源不超卖。
  2. 优先级配额:为关键业务设置高优先级配额,使用 scopeSelector 绑定 PriorityClass。
  3. BestEffort 隔离:单独设置 BestEffort 作用域配额,防止低优先级任务抢占资源。
  4. LimitRange 兜底:为每个命名空间配置 LimitRange,确保未设置资源请求的容器有默认值。
巡检策略提示:Kyverno 策略应检查命名空间是否同时存在 ResourceQuota 和 LimitRange,以及配额使用率是否超过 80%。缺少任一对象都应触发告警。
配额作用域与优先级决策流程 配额作用域与优先级决策流程 创建 Pod 请求 有 PriorityClass? 匹配优先级配额 检查 QoS 类型 应用对应配额作用域

4.7 本章小结

  • ResourceQuota 提供命名空间级别的资源总量硬约束,支持按作用域精细化控制。
  • LimitRange 提供 Pod/容器级别的资源默认值与边界约束,弥补 ResourceQuota 的粒度不足。
  • 配额作用域(BestEffort、Terminating、PriorityClass 等)允许针对不同工作负载类型设置差异化配额。
  • 优先级配额通过 scopeSelector 与 PriorityClass 绑定,实现关键业务的资源保障。
  • Kyverno 策略巡检应关注配额使用率、LimitRange 完整性以及作用域配置的正确性,为缓存命中优化提供数据基础。