本文主要介绍弹性资源优先级调度能力相关的最佳实现。
弹性资源优先级调度通过自定义资源 ResourcePolicy,设置工作负载 Pod 被调度到不同类型节点的顺序,例如包年包月 ECS、按量付费 ECS、自动伸缩 ECS 和 VCI 虚拟节点。该能力适合需要在多个资源池之间做成本、弹性和稳定性取舍的业务。根据不同的业务场景,推荐使用方式如下:
- 集群已安装 scheduler-plugin,并开启 弹性资源优先级调度。
- 如果涉及 VCI,已创建 VCI 业务相关集群或虚拟节点,并建议开启 VCI 库存感知调度。
- 目标工作负载使用稳定 Label,且 ResourcePolicy 与 Pod 在同一命名空间。
- 目标命名空间下已调度 Pod 不会被新的ResourcePolicy.selector误选中。
- 未同时使用 Kubernetes pod-deletion-cost 控制缩容顺序。
ResourcePolicy 只作用于自身命名空间下符合 selector 的工作负载 Pod。subsets表示资源池配置,顺序越靠前,Pod 越优先调度到该资源池;缩容时则优先从最靠后的低优先级资源池缩容。
该场景中,业务优先使用 VCI 。当 VCI 配额不足或承载能力不够时,Pod 被调度到 ECS 节点池,并通过 ECS 节点池弹性伸缩补充资源。该方法主要适用于突发资源用量较大的批量作业等业务,无需长期维持固定 ECS 资源成本。当 VCI 承载能力不够时,可以通过 ECS 的弹性伸缩来保障资源供应。
- 将 VCI 虚拟节点配置为第一个subset,优先承接 Pod。
- 为 VCI subset 设置maxReplicas,防止 VCI 配额被耗尽。
- 将开启弹性伸缩的 ECS 节点池配置为第二个subset。
- 为 ECS subset 设置maxReplicas,控制 ECS 资源使用上限。
- 将 ECS subset 的whenNotReachMax设置为DoNotSchedule,让 ECS 资源不足时 Pod 短暂 Pending,从而触发节点池弹性伸缩。
- 确定 VCI 虚拟节点存在,且工作负载具备调度到 VCI 所需的 Toleration;ECS 节点池已开启弹性伸缩。
-
- 为更直观的观察创建过程中的行为,这里将 ECS 节点池设置为 0 节点的空节点池。
-
- 当 VCI 达到maxReplicas或配额不足时,新 Pod 进入 ECS subset的调度路径。
-
- ECS 资源不足时,Pod 短暂 Pending,并触发节点池扩容。
-
- 扩容后 Pod 能进入 Running,且没有因 VCI 库存不足直接 Failed。
-
该场景的风险主要在等待时间。DoNotSchedule会让 Pod 在 ECS 节点池扩容前保持 Pending,因此不适合对启动时延极敏感的在线流量。
场景二:按比例将 Pod 调度到 ECS 和 VCI
该场景通过maxReplicasRatio控制 ECS 和 VCI 的副本比例,适合业务从 ECS 向 VCI 过渡、做成本结构调优,或希望固定资源和弹性资源之间保持长期平衡。
- 将 ECS 节点池配置为第一个subset,例如比例 0.6。
- 将 VCI 虚拟节点配置为第二个subset,例如比例 0.4。
- 两个 subset 都设置maxReplicasRatio,比例阈值之和建议为 1。
- whenNotReachMax建议使用ScheduleAnyWay。Pod 数量较少时比例计算存在一定误差,不建议将maxReplicasRatio与whenNotReachMax: DoNotSchedule同时配置,否则可能出现部分 Pod 在预期外 Pending。
- 验证 ResourcePolicy 对象符合预期。
-
-
- 缩容时(10->8)优先释放靠后的低优先级资源池。
-
比例调度不适合副本数很少的工作负载。比如总副本数只有 2 或 3 时,0.6/0.4 的目标比例会因为取整出现偏差。建议在副本数足够大、业务可以接受短时间比例偏差时使用该模式。迁移过程中可以从 0.9/0.1 开始,观察 VCI 稳定性和成本,再逐步调整到 0.7/0.3 或 0.6/0.4。
该场景对应集群中同时存在固定 ECS 资源和 VCI 资源,工作负载优先调度到固定 ECS;当 ECS 资源不足或达到maxReplicas上限时,再使用 VCI 作为弹性补充。缩容时,ResourcePolicy 会优先从靠后的 VCI 资源池删除 Pod,先释放按需弹性资源,再释放固定 ECS 资源。
该模式适合有一定长期稳定流量、偶尔出现突发峰值的在线服务。相比“VCI 优先 + 自动伸缩 ECS”,它更强调固定资源利用率和成本可控;相比“按比例调度”,它更强调资源池顺序和缩容释放顺序,而不是长期维持固定比例。
- 将固定 ECS 节点池配置为第一个 subset,优先承载稳定基线流量。
- 为 ECS subset 设置maxReplicas,该值建议接近稳定流量所需副本数。
- 将 VCI 虚拟节点配置为第二个 subset,用于承接 ECS 资源不足或业务突发峰值。
- 为 VCI subset 设置maxReplicas,按峰值流量、VCI 配额和预算上限控制弹性资源使用规模。
- 将 ECS subset 的whenNotReachMax设置为ScheduleAnyWay,确保固定 ECS 资源不足时 Pod 能快速溢出到 VCI;只有当 ECS 节点池本身开启弹性伸缩,且希望等待高优资源池扩容时,才考虑 DoNotSchedule。
- 验证 ResourcePolicy 对象符合预期
-
-
- 缩容工作负载时,优先删除 VCI 资源池上的 Pod。
-
该模式下,ecs-stable.maxReplicas应接近稳定流量所需副本数,例如常态 20 个副本即可承载基线流量,就可以把 ECS 资源池上限设置为 20;vci-burst.maxReplicas应按峰值流量、VCI 配额和预算上限设置。若固定 ECS 资源池配置过小,业务会过早进入 VCI,可能增加弹性资源成本;若 VCI 上限配置过大,突发流量可能快速消耗 VCI 配额或预算。
注意如果将 ECS 节点池的whenNotReachMax参数设置为DoNotSchedule,但该 ECS 节点池未开启弹性伸缩,会导致业务 Pod 持续 Pending,而不会使用 VCI 创建 Pod,因此,若希望固定 ECS 资源池扩容后再使用 VCI,应确认 ECS 节点池已开启弹性伸缩,并谨慎将whenNotReachMax调整为DoNotSchedule。
上线验证时建议先选择一个灰度工作负载,同时做扩容和缩容演练。若发现已有 Pod 被策略误选中,应先缩小selector范围,再重新执行灰度。
- 选择目标工作负载,确认 Deployment 的 Pod Label 稳定且不会误选其它 Pod。
- 选择资源池模型:固定 ECS 优先、VCI 优先后备 ECS、或 ECS/VCI 按比例。
- 创建 ResourcePolicy,把selector限定到灰度工作负载。
- 扩容工作负载,观察 Pod 是否按资源池顺序调度。
- 缩容工作负载,验证是否优先从低优先级资源池释放 Pod。
- 若涉及 VCI,观察库存感知、VCI Pod 创建事件和成本指标。
该能力与 Kubernetes pod-deletion-cost冲突,不能同时使用。创建 ResourcePolicy 前,还应确认目标命名空间下已调度 Pod 不会被策略误选中,否则已有 Pod 可能被优先缩容。
修改已有 ResourcePolicy 时,已调度 Pod 会按照原策略顺序进行缩容,新建 Pod 会按照更新后的策略顺序进行缩容。因此,调整资源池顺序前应暂停或控制扩缩容,避免同一批 Pod 同时受新旧策略影响。
- 将 Deployment 模板中的 Label 改为不匹配ResourcePolicy.selector,或删除 ResourcePolicy。
- 重新发布工作负载并观察新 Pod 是否恢复普通调度。
- 若已产生不符合预期的缩容顺序,先扩容恢复副本数,再重新设计资源池顺序。
- 若 VCI 库存或配额异常,先降低 VCI maxReplicas或比例,再恢复在线服务副本。
先检查 VCI 虚拟节点是否存在、Pod 是否具备对应Toleration、ResourcePolicy.selector是否匹配、VCI subset 是否达到maxReplicas或maxReplicasRatio,以及 VCI 库存感知调度是否因为库存不足让 Pod 保持 Pending。
为什么配置比例后实际分布不完全符合 ResourcePolicy 中给定的比例?
副本数较少时,比例计算存在取整误差。建议在副本数足够大时使用比例调度,并避免将maxReplicasRatio与whenNotReachMax: DoNotSchedule同时配置。
当前仅 Deployment 支持通过 ResourcePolicy 实现逆序缩容,其余工作负载不支持逆序缩容。