Volcano 基准测试脚本体系全解:从集群搭建、拓扑模拟到微秒级调度延迟采集
Volcano 基准测试脚本体系全解从集群搭建、拓扑模拟到微秒级调度延迟采集【免费下载链接】volcanoA Cloud Native Batch System (Project under CNCF)项目地址: https://gitcode.com/GitHub_Trending/vol/volcano导读本文聚焦 Volcano 仓库 benchmark/scripts 下的 Shell 脚本体系它构成了 Volcano 性能基准测试框架的可执行主干通过Makefile统一编排覆盖 Kind/KWOK 模拟集群的创建、Volcano 与监控组件安装、Gang/Pod 两类调度场景的压测执行、审计日志导出audit-exporter与 Prometheus 指标报表采集以及一键清理。读完本文你将能完整复现一套针对 Volcano 调度器的基准测试环境理解每个脚本的职责、输入输出与调用链并掌握 microsecond 级调度延迟与 Pod 时间戳回退两种指标采集方案。一、脚本全景11 个脚本的职责与调用关系benchmark/scripts/README.md 以一张表格概括了整个脚本体系。下表逐行说明各脚本的职责及对应的 Make 目标调用方脚本职责调用方common.sh共享环境变量、日志函数、require_cmd、wait_for_deployment被所有脚本 sourcecreate-cluster.sh创建 Kind 集群启用审计日志与 NodePort 映射make create-clustercreate-kwok-nodes.sh安装 KWOK 控制器并创建模拟节点make create-nodesbuild-images.sh构建 audit-exporter 镜像并加载进 Kind 集群make build-imagesinstall-volcano.sh通过 Helm 安装 Volcano本地源码或发布版 Chartmake install-volcanoinstall-monitoring.sh部署 Prometheus、Grafana、kube-state-metrics、audit-exportermake install-monitoringrun-tests.sh应用调度器配置、执行 Go 测试、自动采集报表make test-config、make test-gang-envcollect-report.sh从 Prometheus 查询 audit-exporter 指标写 JSON 报表run-tests.sh调用make reportexport-grafana-charts.sh通过 Render API 将 Grafana 面板导出为 PNGmake export-chartscleanup.sh拆除 VCJob、监控、Volcano、KWOK可选删除集群make cleanup、make cleanup-allcreate-hypernodes.sh为拓扑感知调度创建 HyperNode CR在 Volcano 安装后执行make create-hypernodescleanup-kwok-nodes.sh删除 KWOK 节点与 HyperNodecleanup.sh的子任务cleanup.sh这些脚本并非各自孤立而是按照 benchmark/Makefile 中的目标组织成一条完整流水线make setup依次执行集群创建→镜像构建→KWOK 节点→Volcano 安装→监控安装各步骤均可通过USE_EXISTING_CLUSTER、SKIP_KWOK、SKIP_INSTALL_VOLCANO、SKIP_INSTALL_MONITORING跳过随后make test-gang-env/make test-pod-env/make test-config触发压测。二、shared 基础common.sh 的统一设施common.sh是整个脚本体系的“公共底座”被所有脚本通过source $(dirname $0)/common.sh引入。它提供了四类设施1. 环境变量默认值所有可调参数都在这里统一收敛例如CLUSTER_NAMEvolcano-benchmark、KWOK_NODE_COUNT100、CPU_PER_NODE32、MEMORY_PER_NODE256Gi、KWOK_VERSIONv0.7.0以及现有集群模式开关USE_EXISTING_CLUSTER、SKIP_INSTALL_VOLCANO、SKIP_INSTALL_MONITORING、SKIP_KWOK等见 common.sh。2. 路径解析脚本通过BASH_SOURCE推算出BENCHMARK_DIRbenchmark 根目录与VOLCANO_ROOT仓库根目录从而保证脚本无论从哪个目录被调用都能正确定位配置、清单与 Helm Chart。3. 日志函数log_info/log_warn/log_error输出带时间戳的[INFO]、[WARN]、[ERROR]前缀其中 warn 与 error 走 stderr。4. 工具函数require_cmd校验必需命令是否存在缺失即退出wait_for_deployment通过kubectl rollout status等待 Deployment 就绪wait_for_pods_ready通过kubectl wait --forconditionReady等待 Pod 就绪见 common.sh。三、环境搭建脚本集群、节点、镜像与组件安装3.1 create-cluster.shKind 集群与审计日志create-cluster.sh负责创建 Kind 集群关键点在于渲染 Kind 配置用sed将 config/kind-config.yaml 中的__VOLCANO_ROOT__占位符替换为仓库绝对路径Kind 要求 hostPath 为绝对路径生成config/.kind-config.rendered.yaml审计日志目录预创建预先创建benchmark/logs/确保 apiserver 审计日志挂载首次启动即成功集群生命周期管理若同名集群已存在则先删除再创建创建完成后将 kubeconfig 导出到benchmark/kubeconfig并等待全部节点 Ready见 create-cluster.sh。3.2 create-kwok-nodes.shKWOK 模拟节点与拓扑域KWOKKubernetes WithOut Kubelet用于低成本模拟大规模节点。create-kwok-nodes.sh的执行逻辑为检测kwok-controllerDeployment 是否已存在不存在则按KWOK_VERSION下载并应用 KWOK 的 CRD、控制器与stage-fast.yamlFlat 模式默认创建KWOK_NODE_COUNT个节点每个节点带有type: kwok标签、kwok.x-k8s.io/nodefake注解、NoSchedule污点以及通过CPU_PER_NODE/MEMORY_PER_NODE指定的容量见 create-kwok-nodes.shTopology 模式ENABLE_TOPOLOGYtrue按 spine→rack 两级拓扑域均匀分布节点并打上topology-rack、topology-spine标签节点数与域配置的对应关系为nodes_per_rack KWOK_NODE_COUNT / TOPOLOGY_RACKS、racks_per_spine TOPOLOGY_RACKS / TOPOLOGY_SPINES见 create-kwok-nodes.sh自定义标签KWOK_NODE_LABELS支持逗号分隔的keyvalue会附加到所有节点上用于配合 hypernode-controller 的自动发现模式例如KWOK_NODE_LABELStopology-rackrack-0,topology-spinespine-0,gpuA100。脚本内置幂等保护若现有typekwok节点数已满足需求则直接跳过创建。3.3 build-images.sh镜像构建策略build-images.sh按两种模式构建镜像默认发布版仅构建 audit-exporter 镜像该镜像未发布到 DockerHub随后kind load docker-image载入 Kind 集群BUILD_VOLCANOtrue本地源码在仓库根目录执行make images构建vc-scheduler、vc-agent-scheduler、vc-controller-manager、vc-webhook-manager等全部 Volcano 组件镜像并逐一加载进 Kind见 build-images.sh。Dockerfile 位于 manifests/audit-exporter/Dockerfile构建上下文为仓库根目录。3.4 install-volcano.sh双模式安装与调度器调参install-volcano.sh支持两种安装模式--release version从官方 Helm 仓库安装指定版本如v1.14.2并启用agent_scheduler_enabletrue、scheduler_config_filevolcano-scheduler-configmap--local直接使用仓库内 installer/helm/chart/volcano 本地 Chart 安装适合验证未发布的源码改动。安装前脚本会先清理历史残留删除所有volcano.sh后缀的 CRD、卸载已存在的 Helm release见 install-volcano.sh。此外还支持通过--scheduler-config在安装后应用自定义调度器配置并滚动重启volcano-scheduler。值得关注的是安装时会注入custom.scheduler_kube_api_qps/burst与custom.controller_kube_api_qps/burst四个 Helm 参数默认值分别为 5000/10000用于在压测前放大 Volcano scheduler 与 controller-manager 访问 Kubernetes API 的 QPS/Burst 上限避免客户端限流成为基准测试瓶颈见 install-volcano.sh。3.5 install-monitoring.sh监控栈与自定义仪表盘install-monitoring.sh依次完成应用 installer/volcano-monitoring.yaml 部署 Prometheus、kube-state-metrics 与 Grafana将 manifests/monitoring/grafana-dashboard.json 作为 ConfigMap 挂载到 Grafana 的/var/lib/grafana/dashboards/benchmark通过 strategic patch 实现应用 manifests/audit-exporter/daemonset.yaml 部署 audit-exporter DaemonSet——Prometheus 通过installer/volcano-monitoring.yaml中已有的kubernetes-service-endpoints抓取任务自动发现它无需额外改动 Prometheus 配置使用wait_for_deployment依次等待各组件就绪见 install-monitoring.sh。若AUDIT_EXPORTER_IMAGE被自定义脚本会用sed替换 DaemonSet 清单中的默认镜像名支持私有仓库场景。四、压测执行run-tests.sh 与测试用例源码4.1 run-tests.sh 的工作流run-tests.sh是压测的统一入口用法为run-tests.sh scenario --configprofile.yaml核心流程如下配置解析--config指定 YAML 配置--template则用envsubst将模板中的$JOBS、$REPLICAS、$MIN_AVAILABLE、$PODS、$SCHEDULER_NAME等变量渲染为临时配置见 run-tests.shPrometheus 探测记录测试开始前的 Prometheus 时间戳time()查询若 Prometheus 不可达则跳过 audit-exporter 报表PROM_AVAILABLEfalse执行 Go 测试cd到仓库根目录执行go test -count1 -v -timeout 1800s ./benchmark/testcases/scenario/... -run TestFromConfig输出以tee写入results/test-scenario-时间戳.log自动采集报表测试结束后等待 10 秒供 Prometheus 抓取再以--before/--after两个时间戳调用collect-report.sh见 run-tests.sh。4.2 Gang 场景的测试源码剖析Gang 场景测试代码位于 benchmark/testcases/gang/gang_test.go其结构可作为“新增场景”的参照模板VCJobConfig/TaskConfig结构体完整定义了任务模板可配置项命名空间、MinAvailable、队列名、Job/Task 两级网络拓扑、分区策略、节点选择器等见 gang_test.goBuildVCJob基于cases/vcjob-template.yaml用text/template渲染出batch.volcano.sh/v1alpha1的 Job 对象并为空字段应用默认值镜像busybox:1.36、命令/bin/sh -c sleep 30见 constant.goCreateGangJobs通过workqueue.ParallelizeUntil以BENCHMARK_CREATE_CONCURRENCY默认 16并发提交指定数量的 VCJobRunGangTest依次等待“全部 Pod 创建完成”5 分钟与“全部 Pod 被调度”10 分钟两个等待分别对应创建吞吐与调度吞吐的验证。4.3 YAML 配置文件示例以 testcases/gang/cases/comprehensive.yaml 为例配置文件同时演示了 Job 级与 Task 级的完整参数包括jobs: 5 jobTemplate: name: gang-comprehensive minAvailable: 10 queue: default # job 级网络拓扑配置 enableNetworkTopology: false networkTopologyMode: hard tasks: - name: master replicas: 1 image: busybox:1.36 cpu: 100m memory: 100Mi enableNodeSelector: false - name: worker replicas: 10 image: busybox:1.36 command: [/bin/sh, -c, sleep 30] cpu: 50m memory: 50Mi # task 级分区策略拓扑分组 enablePartitionPolicy: false partitionTotalPartitions: 2 partitionSize: 5 # task 级网络拓扑配置 enablePartitionNetworkTopology: false partitionNetworkMode: soft enableNodeSelector: false五、指标采集audit-exporter 报表与 Pod 时间戳回退5.1 collect-report.sh微秒级延迟报表collect-report.sh从 Prometheus 查询 audit-exporter 暴露的指标并生成 JSON 报表其实现有三个亮点直方图分位数计算为避免短时间窗下increase()外推误差脚本在--before/--after两个时间点分别查询sum by (le) (pod_scheduling_latency_seconds_bucket{namespacedefault})用 jq 做桶差分后线性插值出 P50/P90/P99见 collect-report.sh未提供时间戳时回退到histogram_quantileincrease(...[10m])调度吞吐计算直接解析本机 apiserver 审计日志文件筛选ResponseCompletecreate pods/binding HTTP 2xx 事件按stageTimestamp落在时间窗内的数量除以时间窗长度得到“pods/sec”见 collect-report.sh报表输出生成results/report-时间戳.json包含时间窗、P50/P90/P99秒、调度总数、吞吐量、Grafana 与 Prometheus 地址并同时在终端以毫秒打印结果见 collect-report.sh。5.2 两种延迟采集方案的取舍框架提供两条延迟采集路径方案精度前置条件适用场景audit-exporter推荐微秒级metav1.MicroTimeapiserver 开启审计日志 镜像已构建精确延迟分析Pod 可即时清理Pod 时间戳回退秒级metav1.TimeDRY_RUNtrue保留 Pod调试、未开启审计日志的环境audit-exporter 之所以被推荐原因有二审计事件携带MicroTime精度而 Pod 对象上的metav1.Time只有秒级同时pods/binding是通用绑定入口与具体调度器无关——无论 Pod 由 Volcano、agent-scheduler 还是其他调度器绑定都能被统计。而 Pod 时间戳方案的局限在于亚秒级延迟会显示为 0ms且必须搭配DRY_RUNtrue使 Pod 在采集时仍然存活。5.3 启用 apiserver 审计日志微秒级方案前置若在现有集群上使用 audit-exporter需为 kube-apiserver 增加以下启动参数--audit-policy-file/etc/kubernetes/policies/audit-policy.yaml --audit-log-path/var/log/kubernetes/kube-apiserver-audit.log --audit-log-maxsize10240 --audit-log-maxage7 --audit-log-maxbackup3审计策略文件位于 third_party/kube-apiserver-audit-exporter/audit-policy.yaml。对于 kubeadm 集群编辑控制平面节点上的/etc/kubernetes/manifests/kube-apiserver.yaml在command、volumeMounts与volumes中分别加入审计策略文件与日志目录的挂载kubelet 会自动重启 apiserver 静态 Pod 完成生效。5.4 可观测指标一览框架的指标来自三个来源audit-exporter调度器无关的微秒级延迟核心指标包括pod_scheduling_latency_secondsHistogramPod 创建到pods/binding创建的时间user标签标识调度器batchjob_completion_latency_secondsHistogramJob 创建到完成的时间涵盖batch.Job与batch.volcano.sh/Jobapi_requests_total、pod_deleted_total、pod_completed_totalCounter等Volcano 内部指标volcano_session_*、volcano_plugin_*、volcano_action_*等例如volcano_e2e_job_scheduling_latency_millisecondsJob 从创建到最后一个 task 被 assume 的时长、volcano_worker_scheduling_cycle_duration_millisecondsagent worker 单次调度周期等kube-state-metricsPod/Job 生命周期计数。服务通过 NodePort 暴露Prometheus:30003Grafana:30004admin/admin仪表盘地址为/d/volcano-benchmark。六、拓扑感知调度HyperNode 的创建与三种接线方式6.1 create-hypernodes.sh 的实现create-hypernodes.sh在 Volcano 安装完成后执行前置校验hypernodes.topology.volcano.shCRD 是否存在按TOPOLOGY_RACKS×TOPOLOGY_SPINES生成两级 HyperNode见 create-hypernodes.shTier-1rack每个 rack 一个 HyperNode通过labelMatch选择带type: kwok与topology-rackrack-i标签的节点Tier-2spine每个 spine 一个 HyperNode通过exactMatch引用其下属 rack HyperNode。关键约束执行时传入的TOPOLOGY_RACKS/TOPOLOGY_SPINES必须与create-kwok-nodes.sh阶段保持一致否则 HyperNode 的 labelSelector 无法匹配对应节点。6.2 三种拓扑接线方式KWOK 模拟拓扑默认ENABLE_TOPOLOGYtrue建节点 → 安装 Volcano →make create-hypernodes建 CRD真实节点自定义拓扑给真实节点打topology-rack标签后创建对应 HyperNode。由于脚本的 rack labelSelector 固定包含type: kwok真实节点需自行补充该标签或直接手写 HyperNode 清单如 benchmark/README.md 中topology.volcano.sh/v1alpha1的HyperNode示例hypernode-controller 自动发现仅需给节点打topology-rack、topology-spine标签控制器会根据 Volcano ConfigMap 中的 label discoverer 配置自动创建 HyperNode——这要求在使用 create-kwok-nodes.sh 时通过KWOK_NODE_LABELS注入拓扑标签。调度器使用虚拟ClusterHyperNode作为全局根节点因此只需 racktier 1与 spinetier 2两级无需显式根节点。七、清理cleanup.sh 的幂等拆除cleanup.sh提供两级清理粒度见 cleanup.shmake cleanup仅清理测试资源按标签volcano.sh/benchmarktrue删除 VCJob 与裸 Pod、删除 PodGroup、监控栈、KWOK 节点调用cleanup-kwok-nodes.sh --all、VolcanoHelm uninstall 删除 CRD及本地产物bin、results、logs、渲染配置make cleanup-all在 cleanup 基础上执行kind delete cluster删除整个 Kind 集群USE_EXISTING_CLUSTERtrue时明确跳过绝不删除外部集群。每个子项都遵循SKIP_*开关SKIP_INSTALL_MONITORINGtrue时跳过监控清理、SKIP_KWOKtrue时跳过 KWOK 清理、SKIP_INSTALL_VOLCANOtrue时跳过 Volcano 清理保证与搭建阶段的选择严格对称。八、参数速查与两种运行模式8.1 全局变量速查变量默认值说明CLUSTER_NAMEvolcano-benchmarkKind 集群名USE_EXISTING_CLUSTERfalse跳过 Kind 建集群与镜像构建使用现有 kubeconfigSKIP_INSTALL_VOLCANOfalse跳过 Volcano 安装使用集群中已装版本SKIP_INSTALL_MONITORINGfalse跳过监控栈安装SKIP_KWOKfalse跳过 KWOK 安装与节点创建运行测试时也需传入以剔除模板中的 KWOKnodeSelector/tolerationsAUDIT_EXPORTER_IMAGEvolcanosh/kube-apiserver-audit-exporter:devaudit-exporter 镜像私有仓库需覆盖KUBECONFIG~/.kube/configkubeconfig 路径KWOK_NODE_COUNT100KWOK 节点数CPU_PER_NODE32每节点 CPUMEMORY_PER_NODE256Gi每节点内存KWOK_VERSIONv0.7.0KWOK 控制器版本VOLCANO_VERSION空Helm 仓库安装的发布版标签如v1.14.2VOLCANO_*_KUBE_API_QPS/BURST5000/10000Volcano scheduler/controller 的 API 客户端限流PROM_URLhttp://localhost:30003Prometheus 地址DRY_RUNfalse跳过测试后清理调试或 Pod 时间戳采集Gang 场景参数JOBS默认 10、REPLICAS默认 100、MIN_AVAILABLE默认 100Pod 场景参数PODS默认 500、SCHEDULER_NAME默认agent-scheduler。完整参数网络拓扑、分区策略、节点选择器等见 testcases/gang/cases/comprehensive.yaml 与 testcases/pod/cases。8.2 典型使用流程Kind 本地集群快速验证cd benchmark make setup VOLCANO_VERSIONv1.14.2 # 建集群 装 Volcano 装监控 make test-gang-env JOBS10 REPLICAS100 MIN_AVAILABLE100 make cleanup-all现有集群裸金属/云托管/自建多节点make setup USE_EXISTING_CLUSTERtrue SKIP_INSTALL_VOLCANOtrue SKIP_INSTALL_MONITORINGtrue kubectl port-forward svc/prometheus-service -n volcano-monitoring 30003:8080 make test-gang-env SKIP_KWOKtrue JOBS10 REPLICAS100 MIN_AVAILABLE100无审计日志时的延迟回退采集DRY_RUNtrue make test-gang-env JOBS10 REPLICAS100 MIN_AVAILABLE100 make collect-pod-latency # 结果写入 results/pod-latency-时间戳.json make clean-vcjobs # 清理残留8.3 新增测试场景的步骤框架支持通过以下三步扩展新场景见 benchmark/README.md 的 Adding New Scenarios创建testcases/scenario/config/放入scheduler-config.yaml与queue.yaml创建testcases/scenario/*_test.go实现测试逻辑可参照 gang_test.go 的TestFromConfig约定运行make setup make test-config SCENARIOscenario CONFIGprofile.yaml。结语从common.sh的公共设施到create-cluster.sh/create-kwok-nodes.sh/install-volcano.sh/install-monitoring.sh的环境搭建四件套再到run-tests.sh与collect-report.sh组成的“压测报表”闭环Volcano 的 benchmark 脚本体系用一组职责单一、可组合、可跳过的脚本把“在任意规模的模拟集群上量化调度器性能”这件事做成了标准流水线。理解这套脚本不仅能直接复现本文所述的两类调度场景压测也能为你自己的调度器性能验证与指标埋点方案提供现成参考。【免费下载链接】volcanoA Cloud Native Batch System (Project under CNCF)项目地址: https://gitcode.com/GitHub_Trending/vol/volcano创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考