【集群】云原生批调度实战:Volcano调度器enqueue功能禁用与性能测试

【集群】云原生批调度实战:Volcano调度器enqueue功能禁用与性能测试

Fre5h1nd Lv6

本系列《云原生批调度实战:Volcano 监控与性能测试》计划分为以下几篇,点击查看其它内容。

  1. 云原生批调度实战:调度器测试与监控工具 kube-scheduling-perf
  2. 云原生批调度实战:调度器测试与监控工具 kube-scheduling-perf 实操注意事项说明
  3. 云原生批调度实战:调度器测试监控结果
  4. 云原生批调度实战:本地环境测试结果与视频对比分析
  5. 监控与测试环境解析:测试流程拆解篇
  6. 监控与测试环境解析:指标采集与可视化篇
  7. 监控与测试环境解析:自定义镜像性能回归测试
  8. 监控与测试环境解析:数据收集方法深度解析与Prometheus Histogram误差问题
  9. 云原生批调度实战:Volcano调度器enqueue功能禁用与性能测试
  10. 云原生批调度实战:Volcano Pod创建数量不足问题排查与Webhook超时修复
  11. 云原生批调度实战:Volcano版本修改与性能测试优化
  12. 云原生批调度实战:Volcano Webhook禁用与性能瓶颈分析

💡简介

上一篇博客中,我们分析了本地环境下的调度器性能测试结果,发现了一些有趣的现象:在某些测试场景下,CREATED事件会出现阶段性突变,而SCHEDULED事件则相对平稳。这种现象可能与调度器的enqueue机制有关。

本文详细介绍了如何禁用Volcano调度器的enqueue功能,通过对比分析来验证我们的猜测:enqueue可能会提前判断资源是否充足,从而在资源不足时限制Pod的创建,进而影响调度性能

通过禁用enqueue功能,我们可以观察调度器在资源分配阶段的纯粹性能表现,为调度器性能优化提供重要参考。

🧠Volcano调度器enqueue功能简介

什么是enqueue?

enqueue是Volcano调度器调度流程中的一个重要阶段,主要负责:

  1. 作业入队管理:将提交的Job添加到调度队列中
  2. 优先级排序:根据Job的优先级、提交时间等因素进行排序
  3. 资源预检查:提前判断集群资源是否满足Job需求
  4. 队列容量控制:管理队列的容量限制和准入控制

enqueue对调度性能的影响

基于前期测试结果的分析,我们猜测enqueue可能会:

  • 提前资源判断:在Pod创建前就判断资源是否充足
  • 限制Pod创建:当资源不足时,限制新Pod的创建速度
  • 影响CREATED事件:导致CREATED事件出现阶段性突变
  • 调度性能瓶颈:在某些场景下成为整体性能的瓶颈

Volcano调度器的完整调度流程

graph LR
    A[Job提交] --> B[enqueue]
    B --> C[allocate]
    C --> D[backfill]
    D --> E[reclaim]
    E --> F[preempt]
    
    B1[enqueue阶段] --> B2[队列管理]
    B1 --> B3[优先级排序]
    B1 --> B4[资源预检查]
    
    C1[allocate阶段] --> C2[资源分配]
    C1 --> C3[节点选择]
    C1 --> C4[Pod绑定]

🔧如何禁用Volcano的enqueue功能

1. 修改调度器配置文件

1.1 修改主配置文件

编辑 schedulers/volcano/scheduler.conf 文件:

1
2
3
4
5
# 原始配置
actions: "enqueue, allocate, backfill"

# 修改为(移除enqueue)
actions: "allocate, backfill"

1.2 修改测试配置文件

编辑 test/volcano/init.yaml 文件:

1
2
3
4
5
# 原始配置
actions: "enqueue, allocate,#{{ if .preemption }} preempt,#{{ end }} backfill, reclaim"

# 修改为(移除enqueue)
actions: "allocate,#{{ if .preemption }} preempt,#{{ end }} backfill, reclaim"

2. 重新部署Volcano调度器

修改配置后,需要重新部署调度器:

1
2
# 重新构建和部署
make up-volcano

🚀如何手动配置测试环境

1. 启动Volcano测试环境

1
2
# 启动完整的Volcano测试环境
make prepare-volcano

这个命令会依次执行:

  • make up-volcano:创建Kind集群并部署Volcano
  • make wait-volcano:等待所有服务就绪
  • make test-init-volcano:初始化测试环境,创建虚拟节点

2. 验证环境状态

2.1 检查集群状态

1
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get nodes -o wide

应该看到:

  • volcano-control-plane:控制平面节点
  • node-0node-1等:虚拟KWOK节点

2.2 检查Volcano服务状态

1
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get pods -n volcano-system

确保所有Pod都处于Running状态。

2.3 检查虚拟节点标签

1
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get nodes --show-labels | grep node-

确保虚拟节点有正确的标签:type=kwok

🔍如何验证enqueue是否被成功禁用

1. 检查ConfigMap配置

1
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get configmap -n volcano-system volcano-scheduler-configmap -o yaml

期望结果

1
2
data:
volcano-scheduler.conf: "actions: \"allocate, backfill, reclaim\"\n..."

关键点:配置中应该没有enqueue,只有allocate, backfill, reclaim

2. 检查调度器启动日志

1
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl logs -n volcano-system deployment/volcano-scheduler --since=1h | grep "Successfully loaded"

期望结果

1
Successfully loaded Scheduler conf, actions: [allocate backfill reclaim]

关键点:日志中应该显示actions: [allocate backfill reclaim],没有enqueue。

3. 检查实时调度日志

1
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl logs -n volcano-system deployment/volcano-scheduler -f | grep -E "(enqueue|allocate|backfill)"

期望结果:应该只看到allocatebackfill相关的日志,没有enqueue相关的日志。

🧪如何执行性能测试

1. 运行批处理作业测试

1
2
# 使用小规模参数进行测试
make start-volcano QUEUES_SIZE=1 JOBS_SIZE_PER_QUEUE=20 PODS_SIZE_PER_JOB=500

参数说明

  • QUEUES_SIZE=1:创建1个队列
  • JOBS_SIZE_PER_QUEUE=20:每个队列20个Job
  • PODS_SIZE_PER_JOB=500:每个Job包含500个Pod
  • 总计:20个Job × 500个Pod = 10,000个Pod

2. 测试执行过程

测试程序会:

  1. 创建队列test-queue-long-term-research-0
  2. 创建Job:20个Volcano Job
  3. 创建Pod:每个Job创建500个Pod
  4. 执行调度:Volcano调度器分配资源
  5. 收集结果:记录CREATED和SCHEDULED事件

3. 监控测试进度

3.1 查看Job状态

1
2
3
4
5
# 查看Volcano Job(注意:不是标准Kubernetes Job)
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get vcjob -A

# 或者使用完整API
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get jobs.batch.volcano.sh -A

3.2 查看Pod状态

1
2
3
4
5
# 查看所有Pod
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get pods -A | grep volcano-job

# 查看特定Job的Pod
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get pods -l job-name=volcano-job-long-term-research-0-1

3.3 查看调度器日志

1
2
# 实时监控调度过程
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl logs -n volcano-system deployment/volcano-scheduler -f | grep -E "(Binding|allocate|task)"

📊如何验证测试是否正常执行

1. 检查测试结果

1.1 查看测试程序输出

测试完成后,应该看到类似输出:

1
2
3
=== RUN   TestBatchJob
--- PASS: TestBatchJob (40.05s)
PASS

1.2 检查Job和Pod状态

1
2
3
4
5
# 检查Job状态
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get vcjob -o wide

# 检查Pod状态分布
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get pods -A | grep volcano-job | awk '{print $3}' | sort | uniq -c

期望结果

  • 大部分Pod应该处于Completed状态
  • 少量Pod可能处于RunningPending状态
  • 没有Pod处于Failed状态

2. 验证调度行为

2.1 检查Pod调度位置

1
2
# 查看Pod被调度到哪些节点
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get pods -A -o wide | grep volcano-job | awk '{print $1, $2, $8}'

期望结果:Pod应该被调度到虚拟节点(如node-0),而不是控制平面节点。

2.2 检查资源分配

1
2
# 查看节点资源使用情况
KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl describe node node-0

3. 分析调度性能

3.1 对比enqueue启用/禁用的差异

启用enqueue时

  • CREATED事件可能出现阶段性突变
  • SCHEDULED事件相对平稳
  • 整体调度时间较长

禁用enqueue后

  • CREATED事件应该更加平稳
  • SCHEDULED事件可能成为瓶颈
  • 整体调度时间可能缩短

3.2 关键指标对比

指标启用enqueue禁用enqueue差异分析
CREATED事件曲线阶段性突变相对平稳enqueue的资源预检查影响
SCHEDULED事件曲线相对平稳可能成为瓶颈直接进入资源分配阶段
整体调度时间较长可能较短跳过队列管理阶段
资源利用率较高可能较低缺乏资源预优化

🧹如何清理测试环境

1. 停止测试

如果测试还在运行,可以按Ctrl+C停止。

2. 清理测试环境

1
2
# 清理Volcano测试环境
make down-volcano

这个命令会:

  • 删除所有测试Pod和Job
  • 销毁Kind集群
  • 清理相关资源

3. 验证清理结果

1
2
3
4
5
# 检查集群是否已销毁
docker ps | grep volcano

# 检查相关目录是否清理
ls -la clusters/volcano/

  • 希望这篇博客对你有帮助!如果你有任何问题或需要进一步的帮助,请随时提问。
  • 如果你喜欢这篇文章,欢迎动动小手给我一个follow或star。

🗺参考文献

[1] Github - kube-scheduling-perf

[2] Volcano Documentation - Scheduler Configuration

[3] Volcano GitHub - Scheduler Actions

[4] 云原生批调度实战:本地环境测试结果与视频对比分析

[5] 云原生批调度实战:调度器测试与监控工具 kube-scheduling-perf

  • 标题: 【集群】云原生批调度实战:Volcano调度器enqueue功能禁用与性能测试
  • 作者: Fre5h1nd
  • 创建于 : 2025-08-17 23:06:07
  • 更新于 : 2025-08-21 19:57:33
  • 链接: https://freshwlnd.github.io/2025/08/17/k8s/k8s-scheduler-performance-volcano-enqueue/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论