4. 资源配额模型(Resource Quota Model)基础:Kubernetes ResourceQuota 对象、命名空间级别配额、配额范围与作用域

资源配额模型是 Kubernetes 多租户与资源治理的基石。通过 ResourceQuota 对象,平台团队可以在命名空间级别设定资源消耗的硬性上限,防止单个团队或应用“资源饥饿”导致集群不稳定。在 Admission Policy 校验发布包完整性的场景中,ResourceQuota 是策略即代码必须验证的“前置条件”——只有配额模型正确配置,后续的资源声明(如 Pod 的 requests/limits)才有合规基准。

4.1 ResourceQuota 对象核心结构

ResourceQuota 是一个命名空间作用域的 Kubernetes 原生对象,其核心由 spec.hard 字段定义资源上限。以下是一个典型的 ResourceQuota YAML 定义:

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"
    persistentvolumeclaims: "5"
    pods: "20"
    configmaps: "10"
    services: "10"
    secrets: "10"

该对象同时限制了计算资源(CPU/内存)和对象数量(Pod、PVC、ConfigMap 等)。当命名空间内资源总和超过 hard 阈值时,API Server 会拒绝后续创建请求。

4.2 命名空间级别配额:隔离与共享的边界

ResourceQuota 的生效范围严格限定在单个命名空间内。这种设计实现了以下目标:

  • 租户隔离:每个团队或项目拥有独立的命名空间,配额互不干扰。
  • 公平调度:避免某个命名空间耗尽集群全部资源。
  • 成本核算:通过配额使用量可量化每个命名空间的资源消耗。
最佳实践:为每个命名空间至少配置一个 ResourceQuota,即使初始值较大。这为后续策略即代码的“配额合规性校验”提供了可枚举的检查对象。

4.3 配额范围与作用域

ResourceQuota 支持通过 spec.scopes 字段限定配额生效的 Pod 状态或 QoS 类别,从而实现更精细的资源控制。下表列出了 Kubernetes 支持的配额范围:

范围(Scope) 描述 典型使用场景
BestEffort 仅统计 QoS 类别为 BestEffort 的 Pod 限制“尽力而为”类 Pod 的总数或内存上限
NotBestEffort 排除 BestEffort 的 Pod(即 Burstable 和 Guaranteed) 为生产级 Pod 预留资源池
Terminating Pod 设置了 activeDeadlineSeconds 限制批处理或临时任务的资源消耗
NotTerminating Pod 未设置 activeDeadlineSeconds 守护型服务(Deployment、StatefulSet)的配额
PriorityClass 按 PriorityClass 名称匹配(需指定 scopeSelector) 为高优先级工作负载分配独立配额

使用范围时,ResourceQuota 的 hard 字段只能包含与该范围兼容的资源类型。例如,BestEffort 范围下不能设置 requests.cpu,因为 BestEffort Pod 不设置 requests。

4.4 配额作用域选择器(ScopeSelector)

对于 PriorityClass 等更灵活的范围匹配,Kubernetes 提供了 scopeSelector 机制。以下示例为高优先级 Pod 单独设置配额:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: high-priority-quota
  namespace: team-alpha
spec:
  hard:
    pods: "10"
    requests.cpu: "8"
    requests.memory: "16Gi"
  scopeSelector:
    matchExpressions:
      - operator: In
        scopeName: PriorityClass
        values:
          - high-priority
注意:当使用 scopeSelector 时,spec.scopes 字段必须为空。两者是互斥的配置方式。

4.5 资源配额模型与 Admission Policy 的关联

在策略即代码的发布包完整性校验中,ResourceQuota 模型是以下策略规则的输入源:

  • 配额存在性校验:目标命名空间是否已创建 ResourceQuota?
  • 配额覆盖度校验:ResourceQuota 是否覆盖了发布包中所有声明的资源类型(如 CPU、内存、PVC)?
  • 配额阈值合理性校验:发布包中 Pod 的 requests/limits 总和是否超过配额上限?

下图展示了 ResourceQuota 在 Kubernetes 资源治理中的位置及其与 Admission Policy 的交互关系:

ResourceQuota 模型与 Admission Policy 交互架构 Kubernetes 集群 命名空间(Namespace) ResourceQuota spec.hard: 资源上限 工作负载(Pod/Deployment) requests / limits Admission Policy(策略即代码校验) 校验结果:通过 / 拒绝

4.6 配额模型设计原则

在构建资源配额模型时,应遵循以下原则以确保与策略即代码的兼容性:

  1. 全覆盖原则:每个命名空间至少有一个 ResourceQuota,覆盖所有可计费资源类型。
  2. 分层配额原则:使用 scopeSelector 为不同优先级或生命周期的工作负载设置独立配额池。
  3. 预留缓冲原则:配额上限应略高于预期使用量(通常 110%~120%),避免因微小的资源波动导致 Pod 创建失败。
  4. 审计可追溯原则:ResourceQuota 的 metadata.annotations 中记录配额审批人、有效期等元数据,供策略引擎审计。
关键指标:在大型集群中,建议将 ResourceQuota 的创建与命名空间生命周期绑定,通过 GitOps 或 Admission Policy 自动生成,确保“无配额,不部署”。

4.7 常见配置陷阱与避坑指南

陷阱 现象 解决方案
未配置 limits 配额 Pod 可以设置无限大的 limits,导致节点资源耗尽 始终同时配置 limits.cpu 和 limits.memory
范围与资源类型不匹配 API Server 拒绝创建 ResourceQuota 查阅官方文档,确认每个 scope 支持的资源类型列表
多个 ResourceQuota 冲突 Pod 创建时被多个配额同时限制,难以排查 每个命名空间只保留一个通用配额 + 按需的 scopeSelector 配额
忽略 count/persistentvolumeclaims PVC 数量无限制,导致存储后端压力 在 hard 中显式设置 persistentvolumeclaims 上限