1. Resource Quota 概述

1.1 什么是 Resource Quota

Resource Quota 是 Kubernetes 内置的 命名空间级别 资源约束策略对象。它通过声明式 YAML 定义一组配额规则,限制命名空间内所有 Pod、Service、PVC 等对象可消耗的 计算资源总量(CPU、内存)与 对象数量(Pod 数、Service 数、PVC 数等)。

当命名空间内资源使用量达到配额上限时,Kubernetes API Server 会拒绝后续超出配额的创建请求,并返回 403 Forbidden 错误。

核心定义: Resource Quota = 命名空间资源使用的“硬上限” + 对象计数的“硬上限”。

1.2 为什么需要声明式管理

传统运维模式下,资源分配依赖人工估算、手动配置或脚本临时调整,存在以下痛点:

  • 配置漂移: 不同环境(开发/测试/生产)的配额不一致,人工修改后难以追溯。
  • 缺乏审计: 谁在何时修改了配额?修改前值是多少?无版本记录。
  • 变更风险: 直接修改集群资源可能导致误操作,影响线上业务。
  • 合规困难: 安全审计要求资源分配可追溯、可回滚,传统方式无法满足。

声明式管理将 Resource Quota 定义为 版本化、可审查、可回滚 的 YAML 文件,存储在 Git 仓库中,通过 GitOps 或 CI/CD 管道自动同步到集群。任何变更都经过 Pull Request 审查 → 自动测试 → 合规审批 → 自动部署 的标准化流程。

对比维度 传统命令式管理 声明式管理
变更方式 kubectl edit quota 直接修改 修改 Git 仓库 YAML → PR 审查 → 自动同步
版本历史 无版本记录,依赖人工记忆 Git 完整历史,可追溯每次变更
回滚能力 需手动恢复旧值,易出错 git revert 一键回滚
合规审计 无审计日志,难以满足合规要求 PR 记录 + Git 日志,天然满足审计
多环境一致性 各环境独立维护,容易漂移 同一份 YAML 模板,参数化差异

1.3 核心价值

  • 资源隔离与公平性: 防止单个命名空间或团队“抢占”集群全部资源,保障多租户场景下的资源公平分配。
  • 成本控制: 通过配额限制,避免开发/测试环境过度消耗资源导致生产环境资源不足,间接控制云成本。
  • 安全合规: 声明式 YAML 存储在 Git 中,配合签名与证书轮换机制,可提供不可否认的变更证据链。
  • 自动化运维: 配额变更全流程自动化,减少人工干预,降低配置错误风险。
  • 可观测性: 结合 kubectl describe quota 或 Prometheus 指标,实时监控配额使用率,提前预警。

1.4 使用场景

场景 说明 典型配额设置
多团队共享集群 每个团队一个命名空间,限制 CPU/内存总量 requests.cpu: "10", limits.memory: "20Gi"
开发/测试环境成本控制 防止开发环境无限创建 Pod 导致费用飙升 count/pods: "50", requests.storage: "100Gi"
生产环境资源保障 为关键业务命名空间预留资源,避免被非关键业务挤占 limits.cpu: "40", limits.memory: "80Gi"
证书轮换发布证据 通过声明式配额变更 + Git 签名,提供资源变更的不可否认证据 配额变更 YAML 经 GPG 签名后提交
合规审计场景 金融、医疗等行业要求资源分配可追溯、可审计 所有配额变更记录在 Git 中,定期审计

1.5 Resource Quota 声明式管理架构

下图展示了声明式 Resource Quota 管理的核心组件与数据流:

Resource Quota 声明式管理架构 Git 仓库 quota-dev.yaml quota-prod.yaml GPG 签名 CI/CD 管道 PR 审查 合规检查 自动同步 Kubernetes 集群 命名空间 A 命名空间 B ResourceQuota git push kubectl apply 审计与证据链 Git 日志 + GPG 签名 配额使用数据 变更历史 说明: 声明式管理将 Resource Quota 变更纳入 GitOps 流程,每次变更都经过 PR 审查、合规检查、GPG 签名, 形成不可否认的变更证据链,满足安全审计与证书轮换发布要求。

1.6 声明式 Resource Quota 示例

以下是一个典型的声明式 Resource Quota YAML 定义,包含计算资源配额与对象计数配额:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: team-a
spec:
  hard:
    requests.cpu: "10"
    requests.memory: "20Gi"
    limits.cpu: "20"
    limits.memory: "40Gi"
    requests.nvidia.com/gpu: "2"
    count/pods: "50"
    count/services: "10"
    count/persistentvolumeclaims: "20"
    persistentvolumeclaims: "100Gi"
最佳实践: 将 Resource Quota YAML 文件存储在 Git 仓库的 k8s/quotas/ 目录下,按命名空间命名(如 team-a-quota.yaml),并在 CI/CD 管道中增加 kubectl diff 步骤,提前预览变更影响。

1.7 配额使用监控与预警

声明式管理不仅关注“配额定义”,还需关注“配额使用率”。建议在 CI/CD 管道或监控系统中集成以下检查:

  • 配额使用率告警: 当使用率超过 80% 时触发告警,预留缓冲时间。
  • 配额变更前检查: 在 apply 新配额前,检查当前使用量是否已接近新配额上限,避免立即拒绝合法请求。
  • 配额变更回滚: 若新配额导致业务异常,自动触发 Git revert 并重新同步。
注意: Resource Quota 仅限制 创建 操作,不会驱逐已运行的 Pod。若需要动态调整资源分配,需结合 LimitRange 和 Pod Priority 使用。