资源配额(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 如何介入并决定允许或拒绝:

ResourceQuota 准入校验流程 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 被纳入配额管理,避免“漏网之鱼”造成成本黑洞。