资源配额(ResourceQuota)入门:定义、作用范围与核心字段
ResourceQuota 是 Kubernetes 内置的准入控制机制,用于限制 命名空间(Namespace) 级别的资源消耗总量。它像一个“资源预算上限”,确保单个团队或项目不会过度占用集群资源,从而保障多租户环境下的公平调度与成本可控。
1. ResourceQuota 定义
ResourceQuota 是一个 Kubernetes API 对象(v1 核心 API),通过声明式 YAML 定义。一旦创建,Kubernetes 的准入控制器会在每次 Pod、PersistentVolumeClaim(PVC)等资源创建或更新时进行校验:如果操作会导致命名空间内资源总量超出配额,则请求被拒绝。
核心原则:ResourceQuota 是“硬限制”(Hard Limit),不是“请求/限制”的软指导。超出即拒绝,不触发驱逐或自动扩缩。
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"
services: "5"
persistentvolumeclaims: "3"
requests.storage: "50Gi"
2. 作用范围
ResourceQuota 的作用范围严格限定在 单个命名空间 内。它无法跨命名空间生效,也无法限制集群级别的资源(如 Node、ClusterRole)。其作用对象包括:
- 计算资源:CPU、内存(以
requests和limits维度分别统计) - 存储资源:PVC 请求的存储总量(
requests.storage)、特定 StorageClass 的存储量 - 对象计数:Pod、Service、ConfigMap、Secret、PVC、ReplicationController 等 API 对象的数量
- 扩展资源:如 GPU、FPGA 等自定义资源(需集群支持)
注意:ResourceQuota 不限制 NodePort、LoadBalancer 类型的 Service 端口数量,也不限制 Ingress 规则数量。这些需要结合 NetworkPolicy 或准入控制器(如 OPA/Gatekeeper)实现。
3. 核心字段详解
下表列出 ResourceQuota 最常用的核心字段及其含义:
| 字段 | 类型 | 说明 | 示例值 |
|---|---|---|---|
requests.cpu |
字符串(Kubernetes 资源量) | 所有 Pod 的 CPU request 总和上限 | "4"(4 核) |
requests.memory |
字符串 | 所有 Pod 的内存 request 总和上限 | "8Gi" |
limits.cpu |
字符串 | 所有 Pod 的 CPU limit 总和上限 | "8" |
limits.memory |
字符串 | 所有 Pod 的内存 limit 总和上限 | "16Gi" |
pods |
整数 | 命名空间内允许的最大 Pod 数量(含所有状态) | 10 |
services |
整数 | 最大 Service 数量 | 5 |
persistentvolumeclaims |
整数 | 最大 PVC 数量 | 3 |
requests.storage |
字符串 | 所有 PVC 请求的存储总量上限 | "50Gi" |
count/configmaps |
整数 | 最大 ConfigMap 数量 | 10 |
count/secrets |
整数 | 最大 Secret 数量 | 10 |
4. ResourceQuota 校验流程
下图展示当用户创建 Pod 时,ResourceQuota 如何介入并决定允许或拒绝:
5. 多维度配额组合示例
实际生产环境中,通常需要同时设置计算、存储和对象计数配额。以下是一个综合示例:
apiVersion: v1
kind: ResourceQuota
metadata:
name: full-quota
namespace: team-beta
spec:
hard:
# 计算资源
requests.cpu: "8"
requests.memory: "16Gi"
limits.cpu: "16"
limits.memory: "32Gi"
# 存储资源
requests.storage: "100Gi"
persistentvolumeclaims: "10"
# 对象计数
pods: "20"
services: "10"
count/configmaps: "15"
count/secrets: "15"
count/replicationcontrollers: "5"
count/services.loadbalancers: "3"
常见陷阱:如果只设置
limits.cpu 而不设置 requests.cpu,Pod 可能因 request 未定义而绕过配额检查。建议始终成对设置 requests 和 limits,或使用 LimitRange 为未显式设置 request/limit 的 Pod 提供默认值。
6. 查看配额使用状态
创建 ResourceQuota 后,可以通过以下命令查看当前使用量和剩余量:
# 查看命名空间内的所有 ResourceQuota
kubectl get resourcequota -n team-alpha
# 查看详细使用情况
kubectl describe resourcequota compute-quota -n team-alpha
# 输出示例(部分):
# Name: compute-quota
# Namespace: team-alpha
# Resource Used Hard
# -------- --- ----
# requests.cpu 2 4
# requests.memory 4Gi 8Gi
# limits.cpu 4 8
# limits.memory 8Gi 16Gi
# pods 5 10
通过 Used 列可以实时了解命名空间的资源消耗,为后续的成本调优和发布包校验提供数据基础。
7. 与成本调优的关系
ResourceQuota 是成本调优的 第一道防线:
- 防止资源浪费:限制单个命名空间可使用的最大资源量,避免“无上限”导致的集群成本失控。
- 驱动精细化配置:当配额紧张时,团队会主动优化 Pod 的 request/limit 设置,减少资源碎片。
- 发布包校验前置:在 CI/CD 流水线中,可以预先检查待发布 YAML 是否会导致配额超限,提前拦截不合规的发布包。
最佳实践:为每个命名空间设置 ResourceQuota,并配合
LimitRange 设置默认 request/limit。这样即使开发者忘记设置资源约束,也能保证 Pod 被纳入配额管理,避免“漏网之鱼”造成成本黑洞。