管理项目配额

本指南介绍了 ACP 如何扩展 Kubernetes 的 ResourceQuota,提供项目级的聚合配额(ProjectQuota)。ProjectQuota 允许您限制一个项目中所有命名空间的 ResourceQuota 之和,从而在项目级别规划和管理容量,同时仍将限制委托给各个命名空间。

目录

什么是 ProjectQuota?

  • ResourceQuota(Kubernetes 原生)限制每个命名空间的资源(CPU、内存、对象数量等)。有关概念、键和用法,请参见:
  • ProjectQuota 定义了项目范围的上限:项目内所有命名空间的 ResourceQuota 总和不得超过该项目对应键的硬限制。

简而言之:ResourceQuota 限制单个命名空间;ProjectQuota 限制项目中所有命名空间的总和。

工作原理

  • 工作流程顺序:先定义或调整 ProjectQuota,然后在该项目预算内为各命名空间分配 ResourceQuota。
  • 作用范围:ProjectQuota 适用于平台项目,管理属于该项目的所有命名空间。
  • 聚合强制执行(准入时):
    • 创建或更新命名空间的 ResourceQuota 时,平台会计算该项目内所有命名空间对应键(例如 limits.cpurequests.memorypods)的聚合值,包括此次变更。
    • 仅当新的聚合值小于或等于对应的 ProjectQuota 硬限制时,才允许该请求。否则,变更会被拒绝并返回说明错误。
  • 执行模型:
    • ProjectQuota 约束通过命名空间 ResourceQuota 可分配的资源(预分配),而非瞬时运行时使用量。实际消耗仍由各命名空间的 ResourceQuota 和调度器管理。

何时使用 ProjectQuota

  • 按项目进行预算/容量管理:分配固定的 CPU/内存/对象预算,再细分到各命名空间。
  • 多团队或多环境项目(例如 dev/staging/prod)共享统一上限。
  • 防止配额漂移:在项目层保持一个“大桶”,避免命名空间配额随时间悄然膨胀。

配额键及单位

ProjectQuota 支持与 ResourceQuota 相同的常用键(非详尽):

  • 计算和内存:limits.cpulimits.memoryrequests.cpurequests.memory
  • 工作负载/对象计数:podsservicesconfigmapssecretspvc

单位及计数规则:

  • CPU 以核为单位(例如 2500m
  • 内存以字节为单位(例如 8Gi
  • 对象类键使用整数计数

当所有命名空间对应键的总和接近或超过 ProjectQuota 硬限制时,ACP 会阻止该键的 ResourceQuota 进一步创建或扩容。

分配策略建议

  • 先定义项目级“大桶”(ProjectQuota),再细分为各命名空间的 ResourceQuota,分配给团队或环境。
  • 保留 10% - 30% 的余量以应对突发和弹性扩缩。
  • 定期审查:回收未充分使用的配额并重新分配;提升持续受限的命名空间配额,并相应调整项目上限。

最佳实践与常见问题

  • 问:增加某命名空间的 limits.memory 时失败,提示超出项目配额,为什么?
    • 答:请求变更会导致该键的 ProjectQuota 硬限制被超出。请先减少其他命名空间的配额,或先提升项目上限,再重试命名空间变更。
  • 问:我提升了 ProjectQuota,但工作负载仍无法调度。
    • 答:请确保各命名空间的 ResourceQuota 也相应提升,并检查底层集群/节点容量。
  • 建议:将 ProjectQuota 管理纳入常规变更控制,配合容量规划(节点/存储)和预算管理。