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 的默认值是否合理,从而提升缓存命中预测的准确性。
4.6 配额优先级与作用域选择策略
在实际生产环境中,推荐按以下优先级顺序配置资源配额:
- 全局基础配额:为每个命名空间设置基础 ResourceQuota,保障集群整体资源不超卖。
- 优先级配额:为关键业务设置高优先级配额,使用
scopeSelector绑定 PriorityClass。 - BestEffort 隔离:单独设置 BestEffort 作用域配额,防止低优先级任务抢占资源。
- LimitRange 兜底:为每个命名空间配置 LimitRange,确保未设置资源请求的容器有默认值。
巡检策略提示:Kyverno 策略应检查命名空间是否同时存在 ResourceQuota 和 LimitRange,以及配额使用率是否超过 80%。缺少任一对象都应触发告警。
4.7 本章小结
- ResourceQuota 提供命名空间级别的资源总量硬约束,支持按作用域精细化控制。
- LimitRange 提供 Pod/容器级别的资源默认值与边界约束,弥补 ResourceQuota 的粒度不足。
- 配额作用域(BestEffort、Terminating、PriorityClass 等)允许针对不同工作负载类型设置差异化配额。
- 优先级配额通过
scopeSelector与 PriorityClass 绑定,实现关键业务的资源保障。 - Kyverno 策略巡检应关注配额使用率、LimitRange 完整性以及作用域配置的正确性,为缓存命中优化提供数据基础。