【集群】云原生批调度实战:调度器测试与监控工具 kube-scheduling-perf

【集群】云原生批调度实战:调度器测试与监控工具 kube-scheduling-perf

Fre5h1nd Lv6

本系列《云原生批调度实战:Volcano 深度解析》计划分为以下几篇,点击查看其它内容。

  1. 云原生批调度实战:Volcano 深度解析(一)批处理背景需求与Volcano特点
  2. 云原生批调度实战:Volcano 深度解析(二)Volcano调度流程与调度状态
  3. 云原生批调度实战:Volcano 安装与初试
  4. 云原生批调度实战:调度器测试与监控工具 kube-scheduling-perf
  5. 云原生批调度实战:调度器测试与监控工具 kube-scheduling-perf 实操注意事项说明
  6. 云原生批调度实战:调度器测试监控结果

kube-scheduling-perf:Kubernetes多调度器性能测试框架全解析

项目简介

kube-scheduling-perf 项目为 Kubernetes 社区主流调度器(如 Kueue、Volcano、YuniKorn)提供了统一、自动化的性能测试与对比分析框架。通过自动化脚本和标准化测试流程,用户可在本地快速搭建测试集群,批量运行多种调度器的性能基准测试,并自动收集、汇总测试结果,极大提升了调度器性能评测的效率和可复现性。

📖 阅读说明:本文为 kube-scheduling-perf 项目的理论介绍篇,重点解析项目的架构设计、自动化流程和核心原理。如果您计划实际部署和使用该工具,强烈建议同时阅读 实操注意事项说明文档,该文档详细记录了在实际环境中可能遇到的各种问题(如网络访问、系统兼容性、权限配置等)及其解决方案。


目录结构与核心组件说明

clusters 目录

  • clusters/ 目录下包含了每个调度器(kueue、volcano、yunikorn)及 overview 的子目录。
  • 每个调度器子目录下都包含一个 Makefilekind.yaml,用于定义该调度器测试集群的启动、销毁、等待等操作。
  • overview/ 子目录用于搭建统一的监控与可视化环境(如 Prometheus + Grafana),并负责性能数据的采集与展示。

bin 目录

  • bin/ 目录用于存放自动编译生成的二进制文件,如 kind(用于创建K8s集群)、test-xxx(各调度器的测试用例可执行文件)。
  • 这些二进制文件由 Makefile 自动生成和调用,用户无需手动干预。

Makefile 语法与目标说明

.PHONY 说明

  • .PHONY 是 Makefile 的一个特殊声明,用于标记”伪目标”。
  • .PHONY 声明的目标不会与同名文件或目录冲突,每次执行 make 时都会被强制执行。
  • 例如:
    1
    2
    3
    .PHONY: up
    up:
    # ...命令...

目标与依赖格式

  • Makefile 的每个目标格式为:
    1
    2
    3
    目标名: 依赖1 依赖2 ...
    命令1
    命令2
  • 冒号后面可以跟依赖目标,表示在执行当前目标前会先执行依赖目标。
  • 命令必须以Tab缩进。

自动化测试流程详解

1. make命令的起点:default 目标

当你在项目根目录下执行 make 时,实际上会触发 Makefile 中的 default 目标。其内容如下:

1
2
3
4
5
6
7
8
9
10
11
.PHONY: default
default:
make serial-test \
RESULT_RECENT_DURATION_SECONDS=250 TEST_TIMEOUT_SECONDS=350 \
NODES_SIZE=1000 \
QUEUES_SIZE=1 JOBS_SIZE_PER_QUEUE=10000 PODS_SIZE_PER_JOB=1
# ...(省略多组不同参数的serial-test调用)
make serial-test \
RESULT_RECENT_DURATION_SECONDS=300 TEST_TIMEOUT_SECONDS=400 \
NODES_SIZE=1000 GANG=true \
QUEUES_SIZE=1 JOBS_SIZE_PER_QUEUE=1 PODS_SIZE_PER_JOB=10000
  • 这里依次调用了多次 serial-test,每次传入不同的集群规模、作业数量、Pod数量、是否GANG调度等参数。
  • 这样做的目的是批量测试不同场景下各调度器的性能,保证测试的全面性和对比性。

2. serial-test 目标的作用

1
2
3
4
5
6
7
8
9
10
11
12
.PHONY: serial-test
serial-test: bin/kind
$(foreach sched,$(SCHEDULERS), \
make prepare-$(sched); \
make start-$(sched); \
make end-$(sched); \
)
make \
prepare-overview \
start-overview \
save-result \
end-overview
  • serial-test 首先依赖 bin/kind,确保本地有 kind 工具(用于创建K8s集群)。
  • 然后对 SCHEDULERS(即 Kueue、Volcano、YuniKorn)中的每个调度器,依次执行 prepare-xxxstart-xxxend-xxx 三个目标。
  • 最后执行 overview 相关目标和结果保存。

3. serial-test 的每一步剖析

3.1 bin/kind

1
2
bin/kind:
$(GO_IN_DOCKER) go build -o ./bin/kind sigs.k8s.io/kind
  • 用 Docker 构建 kind 工具的二进制文件,确保后续可以用 kind 创建本地K8s集群。

3.2 prepare-xxx、start-xxx、end-xxx

这些目标通过 define test-scheduler 宏自动生成。以 kueue 为例:

  • prepare-kueue:启动集群、等待就绪、初始化测试。
  • start-kueue:重置审计日志,运行批量作业调度测试。
  • end-kueue:销毁测试集群。

其它调度器(如 volcano、yunikorn)流程类似。

3.3 overview 相关目标

prepare-overview

1
2
3
4
.PHONY: prepare-overview
prepare-overview:
make up-overview
make wait-overview
  • 启动 overview 监控集群,并等待其所有服务就绪。

start-overview

1
2
3
.PHONY: start-overview
start-overview:
make -C ./clusters/overview start-export
  • 在 overview 集群中启动数据导出与采集服务(如 patch、kustomize、kubectl create 等)。

save-result

1
2
3
4
5
6
.PHONY: save-result
save-result:
sleep $(RESULT_RECENT_DURATION_SECONDS)
RECENT_DURATION="$(RESULT_RECENT_DURATION_SECONDS)second" ./hack/save-result-images.sh
make down
# 归档测试环境变量、日志、输出到 results 目录
  • 等待一段时间,采集最新的监控数据,调用脚本保存结果,并归档到 results/ 目录。

end-overview

1
2
3
.PHONY: end-overview
end-overview:
make down-overview
  • 销毁 overview 监控集群,释放资源。

目标之间的调用关系图

graph TD
    A[make] --> B[default]
    B --> C1[serial-test(参数1)]
    B --> C2[serial-test(参数2)]
    B --> Cn[serial-test(参数n)]
    C1 --> D1[prepare-scheduler]
    C1 --> D2[start-scheduler]
    C1 --> D3[end-scheduler]
    C1 --> E[prepare-overview/start-overview/save-result/end-overview]
    D1 --> F1[up-scheduler]
    D1 --> F2[wait-scheduler]
    D1 --> F3[test-init-scheduler]
    D2 --> G1[reset-auditlog-scheduler]
    D2 --> G2[test-batch-job-scheduler]
    D3 --> H[down-scheduler]

注意事项

⚠️ 重要提醒:本文档主要介绍 kube-scheduling-perf 项目的理论架构和自动化流程。在实际运行过程中,由于外网访问限制、系统版本兼容性、用户权限配置等问题,您可能会遇到各种部署和使用障碍。

实际部署使用指南:请务必参考 云原生批调度实战:调度器测试与监控工具 kube-scheduling-perf 实操注意事项说明 文档,该文档详细记录了:

  • 网络访问问题:国内环境下的镜像加速配置、Go模块代理设置
  • 系统兼容性问题:内核版本适配、Docker版本要求、Go版本兼容性
  • 权限配置问题:Docker容器权限、目录所有权、用户权限设置
  • 版本降级方案:针对老旧系统的版本适配策略
  • 故障排除指南:常见错误及解决方案

该注意事项文档基于实际部署经验总结,能够帮助您快速解决部署过程中的各种技术难题,确保测试工具能够正常运行。

总结

  • make 触发 default,批量执行多组参数化的 serial-test
  • serial-test 依次对每个调度器完成:集群部署→初始化→批量作业测试→集群销毁→结果采集。
  • overview 相关目标 负责性能数据的统一采集与可视化。
  • clusters 目录 负责各调度器及监控集群的生命周期管理。
  • bin 目录 存放自动生成的工具和测试用例二进制文件。
  • .PHONY 声明伪目标,保证每次都能正确执行。

本项目通过 Makefile 的自动化编排、参数化测试、统一的日志与指标采集、可视化监控等手段,实现了 Kubernetes 多调度器性能对比的”一键化”与标准化。极大降低了测试门槛,提高了效率和可复现性,非常适合调度器开发者、性能分析师和社区贡献者使用与扩展。



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

🗺参考文献

[1] Github - kube-scheduling-perf

[2] Go 国内加速镜像

[3] 深入理解 Go Modules 的 go.mod 与 go.sum

  • 标题: 【集群】云原生批调度实战:调度器测试与监控工具 kube-scheduling-perf
  • 作者: Fre5h1nd
  • 创建于 : 2025-06-24 21:12:48
  • 更新于 : 2025-07-08 09:01:05
  • 链接: https://freshwlnd.github.io/2025/06/24/k8s/k8s-scheduler-performance-test/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论