本文主要介绍 VKE 负载感知调度能力相关的最佳实践。
负载感知调度是 VKE 提供的基于节点真实负载进行调度的策略。调度过程中,调度器会参考节点负载的历史指标,将 Pod 优先调度到负载较低的节点,实现节点负载均衡,降低单个节点负载过高导致应用或节点故障的概率。根据不同的业务场景,推荐使用方式如下。
短生命周期 Job 不建议默认开启负载感知调度。Job 调度完成后很快退出,调度时看到的节点负载可能很快变化,收益通常低于在线服务。
- 集群处于运行中状态,且至少存在两个需要均衡负载的节点。
- 集群 Kubernetes 版本满足负载感知调度要求,并已安装 scheduler-plugin 组件。
- scheduler-plugin 已开启负载感知调度;如需灰度,生效范围配置为特定 Pod。
- 节点池标签稳定,可使用cluster.vke.volcengine.com/machinepool-name或业务自定义节点标签区分节点池。
- 可通过 kubectl top nodes、监控大盘或节点负载指标判断节点 CPU、Memory 使用率。
负载感知调度主要由 scheduler-plugin 组件配置、Pod Annotation、节点负载指标和节点池级阈值覆盖配置共同生效。关键参数如下。
该场景适合在线服务、网关、常驻 Worker 等长生命周期 Pod。业务希望新增 Pod 避开已经出现 CPU 或内存热点的节点,优先调度到低负载节点,降低单节点热点对业务延迟和稳定性的影响。
- 在 scheduler-plugin 中开启负载感知调度能力。
- 生效范围选择特定 Pod,先通过 Annotation 灰度目标工作负载。
- 设置全局默认 CPU、Memory 阈值,作为未配置节点池覆盖时的默认保护线。
- 按业务瓶颈设置节点打分资源权重。CPU 密集型服务提高 CPU 权重,内存敏感服务提高 Memory 权重。
- 对目标 Deployment 添加vke.volcengine.com/load-aware-enabled: "true"。
- 确认 scheduler-plugin 已开启负载感知调度,且生效范围符合预期。
-
- 准备热点节点。可使用压测工作负载或已有业务负载制造 CPU/Memory 高水位,确保集群中至少存在一个高负载节点和一个低负载节点。
仅在测试集群或隔离节点池执行,不得在承载生产流量的节点上制造高负载。开始前确认监控和回滚路径,验证完成后立即删除压测工作负载。
-
- 部署示例应用,并确认 Pod 模板中包含vke.volcengine.com/load-aware-enabled: "true"。示例应用通过节点亲和性将可调度范围限定在节点池标签cluster.vke.volcengine.com/machinepool-name=pd9ji9ullqoqnlv6sok7g对应的节点池内,由调度器在该节点池内根据负载选择更合适的节点。
- 观察 Pod 分布。预期新建 Pod 更倾向调度到低负载节点。
-
该场景的核心风险是阈值过低导致可调度节点减少,或阈值过高导致热点规避效果不明显。建议先在单个工作负载灰度,观察 Pending、调度失败事件、节点热点数量和业务 P95/P99 延迟。若新增 Pod 仍然落到高负载节点,应同时检查 Annotation、生效范围、节点负载数据新鲜度、节点亲和性、污点容忍和资源请求等约束。
该场景适合集群中存在多类节点池的情况,例如通用计算池、CPU 高配池、内存型节点池、混部或低优先级节点池。不同节点池的规格、业务类型和资源瓶颈不同,如果只使用一套全局阈值,可能出现通用池过载、内存型节点过晚保护、高配节点利用率不足等问题。
- 梳理节点池用途和稳定标签。推荐使用cluster.vke.volcengine.com/machinepool-name匹配节点池。
- 为每类节点池设置不同 CPU、Memory 阈值。
- 为每个节点池创建一个 NodeSchedulingConfig。一个节点应只命中一个预期配置,避免最终阈值来源不清晰。
- 保留全局默认阈值作为兜底,覆盖未命中 NodeSchedulingConfig 的节点。
- 灰度期间只选择一个或少量节点池验证,确认效果后再扩大到其它节点池。
- 确认 scheduler-plugin 已开启负载感知调度,且生效范围符合预期。
-
- 创建或更新 NodeSchedulingConfig。
- 检查节点池 Label,确认每个节点只命中一个预期配置。
- 查询 NodeSchedulingConfig 配置详情。
-
- 部署负载到load-threshold-pool-1对应的节点池,预计会拒绝调度,验证单独对该节点池设置的阈值生效。
-
- 扩容上述工作负载,节点池亲和性添加上述三个节点池,观察 Pod 避开超过对应节点池阈值的节点。
-
分池阈值上线时,最大的风险是 Selector 设计不清晰。若同一个节点同时被多个 NodeSchedulingConfig 命中,排障时很难判断最终阈值来源。建议每个节点池使用唯一稳定标签,并在上线前用kubectl get nodes --show-labels校验匹配关系。
阈值设计应结合历史监控数据。通用计算池可从 CPU 65%~75%、Memory 70%~80% 开始;CPU 高配池可适当提高 CPU 阈值;内存型节点池建议将 Memory 阈值设置得更保守,例如 60%~70%。上线后根据业务延迟、Pending、节点热点数量和资源利用率继续调整。
- 选择目标工作负载,确认 Pod Label、资源请求和调度约束稳定。
- 开启 scheduler-plugin 的负载感知调度能力,生效范围优先选择特定 Pod。
- 为灰度工作负载添加vke.volcengine.com/load-aware-enabled: "true"。
- 设置全局默认 CPU、Memory 阈值和资源权重。
- 如需按节点池设置阈值,创建 NodeSchedulingConfig 并校验节点匹配关系。
- 部署或扩容灰度工作负载,观察 Pod 分布、节点负载和调度事件。
- 灰度稳定后,扩大到同类业务;确认监控稳定、阈值清晰、回滚路径明确后再评估全局开启。
负载感知调度依赖节点负载数据。若监控数据缺失、延迟或与真实负载偏差较大,调度效果会下降。排障时应同时检查 NodeMonitor 更新时间、节点监控指标、Pod 事件和 scheduler-plugin 配置。
负载感知调度不会绕过 Kubernetes 原生调度约束。节点亲和性、污点容忍、资源请求、拓扑约束等仍然会影响最终调度结果。如果这些约束已经把可选节点范围缩小到少数节点,即使开启负载感知调度,也可能无法避开热点节点。
- 将灰度工作负载 Annotation 改为vke.volcengine.com/load-aware-enabled: "false",或删除该 Annotation。
- 若已创建节点池级 NodeSchedulingConfig,先删除新建配置或将 Selector 改到空匹配,恢复全局默认阈值。
- 若已全局开启,在 scheduler-plugin 配置中将生效范围改回特定 Pod 或关闭负载感知调度。
- 重新发布工作负载,观察新 Pod 是否恢复普通调度,确认 Pending 和节点热点指标恢复到预期范围。