管理项目配额
本指南介绍了 ACP 如何扩展 Kubernetes 的 ResourceQuota,提供项目级的聚合配额(ProjectQuota)。ProjectQuota 允许您限制一个项目中所有命名空间的 ResourceQuota 之和,从而在项目级别规划和管理容量,同时仍将限制委托给各个命名空间。
目录
什么是 ProjectQuota?
- ResourceQuota(Kubernetes 原生)限制每个命名空间的资源(CPU、内存、对象数量等)。有关概念、键和用法,请参见:
- ProjectQuota 定义了项目范围的上限:项目内所有命名空间的 ResourceQuota 总和不得超过该项目对应键的硬限制。
简而言之:ResourceQuota 限制单个命名空间;ProjectQuota 限制项目中所有命名空间的总和。
工作原理
- 工作流程顺序:先定义或调整 ProjectQuota,然后在该项目预算内为各命名空间分配 ResourceQuota。
- 作用范围:ProjectQuota 适用于平台项目,管理属于该项目的所有命名空间。
- 聚合强制执行(准入时):
- 创建或更新命名空间的 ResourceQuota 时,平台会计算该项目内所有命名空间对应键(例如
limits.cpu
、requests.memory
、pods
)的聚合值,包括此次变更。
- 仅当新的聚合值小于或等于对应的 ProjectQuota 硬限制时,才允许该请求。否则,变更会被拒绝并返回说明错误。
- 执行模型:
- ProjectQuota 约束通过命名空间 ResourceQuota 可分配的资源(预分配),而非瞬时运行时使用量。实际消耗仍由各命名空间的 ResourceQuota 和调度器管理。
何时使用 ProjectQuota
- 按项目进行预算/容量管理:分配固定的 CPU/内存/对象预算,再细分到各命名空间。
- 多团队或多环境项目(例如
dev
/staging
/prod
)共享统一上限。
- 防止配额漂移:在项目层保持一个“大桶”,避免命名空间配额随时间悄然膨胀。
配额键及单位
ProjectQuota 支持与 ResourceQuota 相同的常用键(非详尽):
- 计算和内存:
limits.cpu
、limits.memory
、requests.cpu
、requests.memory
- 工作负载/对象计数:
pods
、services
、configmaps
、secrets
、pvc
等
单位及计数规则:
- CPU 以核为单位(例如
2
、500m
)
- 内存以字节为单位(例如
8Gi
)
- 对象类键使用整数计数
当所有命名空间对应键的总和接近或超过 ProjectQuota 硬限制时,ACP 会阻止该键的 ResourceQuota 进一步创建或扩容。
分配策略建议
- 先定义项目级“大桶”(ProjectQuota),再细分为各命名空间的 ResourceQuota,分配给团队或环境。
- 保留 10% - 30% 的余量以应对突发和弹性扩缩。
- 定期审查:回收未充分使用的配额并重新分配;提升持续受限的命名空间配额,并相应调整项目上限。
最佳实践与常见问题
- 问:增加某命名空间的
limits.memory
时失败,提示超出项目配额,为什么?
- 答:请求变更会导致该键的 ProjectQuota 硬限制被超出。请先减少其他命名空间的配额,或先提升项目上限,再重试命名空间变更。
- 问:我提升了 ProjectQuota,但工作负载仍无法调度。
- 答:请确保各命名空间的 ResourceQuota 也相应提升,并检查底层集群/节点容量。
- 建议:将 ProjectQuota 管理纳入常规变更控制,配合容量规划(节点/存储)和预算管理。