2. 资源配额模型基础:Kubernetes 资源配额(ResourceQuota)的定义、字段解析与典型配置

在 Kubernetes 多租户或团队共享集群场景中,资源配额(ResourceQuota)是防止“吵闹邻居”效应、保障集群稳定性的第一道防线。ResourceQuota 通过声明式配置限制命名空间(Namespace)级别的聚合资源消耗,是 OPA 策略审计中衡量“配置漂移”的基准线之一。

2.1 ResourceQuota 核心定义与作用域

ResourceQuota 是 Kubernetes 内置的准入控制机制,作用于命名空间级别。它定义了一个命名空间内所有 Pod 可消耗的计算资源(CPU、内存)与对象数量(Pod、Service、PVC 等)的上限。一旦配额被创建,任何超出配额范围的创建或更新请求都会被 API Server 拒绝。

关键理解: ResourceQuota 是“硬限制”,而非“请求/限制”的默认值。它不修改 Pod 的 spec,只做准入校验。OPA 审计 ResourceQuota 时,重点在于检查其配置是否与安全基线一致,以及是否发生了未经授权的修改(漂移)。

2.2 字段解析:ResourceQuota 的 Spec 结构

一个标准的 ResourceQuota YAML 定义包含 apiVersion、kind、metadata 和 spec。核心逻辑集中在 spec.hard 字段中,该字段是一个键值对映射,支持以下三类资源维度:

资源类别 字段键(Key)示例 说明
计算资源 requests.cpu、requests.memory
limits.cpu、limits.memory
分别限制所有 Pod 的 requests 和 limits 总和。单位:CPU 为核心数(如 10),内存为字节(如 20Gi)。
存储资源 requests.storage
persistentvolumeclaims
限制 PVC 请求的总存储容量,以及命名空间内 PVC 对象的总数量。
对象数量 count/pods、count/services
count/deployments.apps
count/configmaps
限制特定资源类型的对象数量。格式为 count/<resource>.<group>,对于核心资源可省略 API 组。
避坑提示: 对象数量配额(count/*)在 Kubernetes 1.22+ 中逐步稳定。审计时需注意,如果集群版本较低,部分 count 配额可能不被支持。OPA 策略应首先检查集群版本,再评估配额字段的合法性。

2.3 典型配置示例与解析

以下是一个面向“生产级微服务命名空间”的 ResourceQuota 配置,它同时限制了计算资源上限和关键对象数量:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: production-quota
  namespace: team-alpha
spec:
  hard:
    # 计算资源:所有 Pod 的 requests 总和上限
    requests.cpu: "20"
    requests.memory: "40Gi"
    # 计算资源:所有 Pod 的 limits 总和上限
    limits.cpu: "40"
    limits.memory: "80Gi"
    # 存储资源:PVC 总容量上限
    requests.storage: "500Gi"
    # 对象数量:核心资源
    count/pods: "50"
    count/services: "10"
    count/configmaps: "30"
    count/secrets: "30"
    count/persistentvolumeclaims: "20"
    # 对象数量:扩展资源(Apps 组)
    count/deployments.apps: "10"
    count/statefulsets.apps: "5"

该配置的审计要点:

  • 资源比例: limits.cpu 是 requests.cpu 的 2 倍,允许一定程度的突发,但防止无限超卖。
  • 对象上限: Pod 上限 50 个,Deployment 上限 10 个,平均每个 Deployment 可管理 5 个 Pod,符合微服务典型密度。
  • 存储隔离: PVC 数量与总容量双重限制,防止存储资源被单个应用耗尽。

2.4 ResourceQuota 的 Scope 与优先级

ResourceQuota 支持通过 spec.scopes 字段实现更精细的资源隔离。Scope 决定了配额适用的 Pod 类别:

Scope 名称 匹配条件 典型用途
BestEffort Pod 未设置 requests 和 limits 限制“尽力而为”类 Pod 的总数,防止其抢占资源
NotBestEffort Pod 设置了 requests 或 limits 对“有保障”类 Pod 进行资源上限控制
Terminating Pod 设置了 activeDeadlineSeconds 限制批处理或短任务 Pod 的资源消耗
NotTerminating Pod 未设置 activeDeadlineSeconds 限制常驻服务 Pod 的资源消耗
审计风险点: 当命名空间内同时存在多个 ResourceQuota 对象(例如一个针对 BestEffort,一个针对 NotBestEffort)时,Kubernetes 会计算所有匹配配额的交集。OPA 策略必须验证这些配额之间是否存在冲突或重叠导致的意外拒绝。例如,如果 BestEffort 配额限制了 CPU 总量,但 BestEffort Pod 本身不设置 requests,该配额实际上无法生效,形成“配置漂移”漏洞。

2.5 ResourceQuota 状态与漂移检测点

ResourceQuota 的 status 字段记录了当前命名空间的实际资源消耗,是 OPA 审计“配置漂移”的关键数据源:

status:
  hard:
    requests.cpu: "20"
    requests.memory: 40Gi
  used:
    requests.cpu: "12"
    requests.memory: 25Gi

OPA 策略通过对比 status.hard(期望值)与 status.used(实际值),可以判断资源利用率是否异常。但“配置漂移”审计的核心是:比较当前生效的 ResourceQuota 对象与 Git 仓库中的基线配置是否一致。任何对 spec.hard 中字段值的修改(如将 requests.cpu 从 “20” 改为 “40”),即使未导致资源超限,也属于配置漂移。

ResourceQuota 配置漂移审计数据流 Git 基线配置 spec.hard 期望值 集群实际配置 kubectl get quota -n ns OPA 策略引擎 Rego 规则审计 拉取 采集 漂移判定:spec.hard 差异 字段值变更 / 字段新增或删除 告警 / 阻断 / 自动修复 输出到审计日志

2.6 典型配置模式对比

在实际生产环境中,ResourceQuota 的配置模式通常分为以下三种,OPA 审计策略需要针对不同模式调整漂移检测的敏感度:

模式 特点 漂移风险等级 OPA 审计建议
严格固定配额 所有字段值硬编码,不允许动态调整 高(任何修改即漂移) 全字段精确匹配,拒绝任何偏差
动态弹性配额 部分字段(如 CPU)允许在基线 ±20% 范围内浮动 中(需容忍合理波动) 使用 Rego 算术比较,允许阈值内变化
多 Scope 组合配额 同时存在 BestEffort 和 NotBestEffort 两个配额对象 中高(Scope 逻辑复杂易出错) 验证 Scope 组合是否覆盖所有 Pod 类别,且无冲突
实践要点: 在实施 OPA 审计前,建议先通过 kubectl describe resourcequota -n <ns> 收集所有命名空间的配额现状,与 Git 基线做一次全量 diff。这能快速发现已存在的“历史漂移”,避免 OPA 策略上线后产生大量误报。