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 管理的核心组件与数据流:
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 使用。