【集群】云原生批调度实战:Volcano Webhook禁用与性能瓶颈分析

本系列《云原生批调度实战:Volcano 监控与性能测试》计划分为以下几篇,点击查看其它内容。
- 云原生批调度实战:调度器测试与监控工具 kube-scheduling-perf
- 云原生批调度实战:调度器测试与监控工具 kube-scheduling-perf 实操注意事项说明
- 云原生批调度实战:调度器测试监控结果
- 云原生批调度实战:本地环境测试结果与视频对比分析
- 监控与测试环境解析:测试流程拆解篇
- 监控与测试环境解析:指标采集与可视化篇
- 监控与测试环境解析:自定义镜像性能回归测试
- 监控与测试环境解析:数据收集方法深度解析与Prometheus Histogram误差问题
- 云原生批调度实战:Volcano调度器enqueue功能禁用与性能测试
- 云原生批调度实战:Volcano Pod创建数量不足问题排查与Webhook超时修复
- 云原生批调度实战:Volcano版本修改与性能测试优化
- 云原生批调度实战:Volcano Webhook禁用与性能瓶颈分析
- 云原生批调度实战:Volcano性能瓶颈猜想验证与实验总结
💡简介
在上一篇博客中,我们通过修改webhook超时时间解决了Pod创建数量不足的问题。然而,在实际测试过程中,我们发现webhook本身可能成为性能瓶颈,特别是在大规模Job提交的场景下。
本文详细介绍了如何通过修改kube-scheduling-perf
的Makefile来完全禁用Volcano的webhook功能,分析了webhook对调度性能的影响,并探讨了未来通过CRD替代webhook的可能性。通过实验发现,即使禁用webhook,在Job数量较多时仍然存在Pod创建瓶颈,这为后续的调度器优化提供了重要参考。
🖼️背景需求分析
1. Webhook性能瓶颈问题
1.1 多次判断的性能开销
Volcano的webhook系统包含多个组件,每个Pod创建请求都需要经过:
- Mutating Webhook:修改Pod配置(如添加
maxRetry
、minAvailable
等字段) - Validating Webhook:验证Pod配置的合法性
- Admission Service:处理webhook请求的服务
- TLS证书验证:确保webhook调用的安全性
在之前的测试中,我们发现webhook超时成为了Pod创建失败的主要原因,98.7%的请求因超时而失败。
1.2 替代方案的可能性
考虑到现代Kubernetes版本的发展趋势,webhook的某些功能可以通过以下方式替代:
- CRD验证:在Kubernetes较新版本中,可以通过CRD的验证规则替代部分validating webhook
- 准入策略:使用Pod Security Standards等内置策略替代部分验证逻辑
- 预配置模板:通过提前配置Job模板,减少运行时的修改需求
1.3 性能测试需求
为了准确评估webhook对调度性能的影响,我们需要:
- 基准测试:在有webhook的情况下进行性能测试
- 对比测试:在禁用webhook的情况下进行相同的性能测试
- 瓶颈分析:识别webhook是否是真正的性能瓶颈
🔧方案设计与实现
1. 整体设计思路
1.1 保留核心组件
我们采用选择性禁用的策略,只删除webhook配置,保留其他重要组件:
- ✅ 保留:
volcano-admission
deployment、volcano-admission-service
、volcano-admission-init
job - ❌ 删除:所有
MutatingWebhookConfiguration
和ValidatingWebhookConfiguration
1.2 实现方式
通过修改./clusters/volcano/Makefile
,在Volcano部署完成后自动删除webhook配置:
1 |
|
2. 具体实现步骤
2.1 修改Makefile
在clusters/volcano/Makefile
中,我们添加了多个webhook控制选项:
1 | # 完全禁用webhook |
2.2 集成到部署流程
在up
目标中集成webhook禁用:
1 |
|
3. 技术细节说明
3.1 Webhook配置类型
我们禁用的webhook配置包括:
类型 | 配置名称 | 功能描述 |
---|---|---|
Mutating | volcano-admission-service-jobs-mutate | 修改Job配置,添加maxRetry 等字段 |
Mutating | volcano-admission-service-podgroups-mutate | 修改PodGroup配置 |
Mutating | volcano-admission-service-pods-mutate | 修改Pod配置 |
Mutating | volcano-admission-service-queues-mutate | 修改Queue配置 |
Validating | volcano-admission-service-jobs-validate | 验证Job配置合法性 |
Validating | volcano-admission-service-pods-validate | 验证Pod配置合法性 |
Validating | volcano-admission-service-queues-validate | 验证Queue配置合法性 |
3.2 保留组件的原因
我们选择保留以下组件的原因:
volcano-admission
deployment:保持服务架构完整性,避免其他组件依赖问题- **
volcano-admission-service
**:维持网络服务,避免服务发现失败 volcano-admission-init
job:继续生成TLS证书,确保系统安全性
🚀未来展望与优化方向
1. CRD替代Webhook的可能性
1.1 Kubernetes版本演进
从Kubernetes 1.16开始,CRD支持更强大的验证和默认值设置:
1 | apiVersion: apiextensions.k8s.io/v1 |
1.2 替代方案设计
未来可以考虑通过以下方式替代webhook:
- CRD验证规则:在Job CRD中定义验证规则,替代validating webhook
- 默认值设置:通过CRD的defaulting功能,替代mutating webhook
- 准入策略:使用Pod Security Standards等内置策略
1.3 实现路径
1 | # 示例:通过CRD实现Job验证 |
2. Controller调度逻辑优化
基于测试结果,我们发现前期确定的优化点仍然存在。具体而言:
- 实验结果发现:即使禁用了webhook,在Job数量很多时仍然存在前期测试中提到的Pod CREATE 瓶颈。
- 可能原因:Volcano会分批处理Job并CREATE Pod,当Job数量多时CREATE速度比SCHEDULE速度慢而成为瓶颈。
- 后续思路:可以通过检查和修改controller的调度逻辑来进行优化。
- 希望这篇博客对你有帮助!如果你有任何问题或需要进一步的帮助,请随时提问。
- 如果你喜欢这篇文章,欢迎动动小手给我一个follow或star。
🗺参考文献
[1] Github - kube-scheduling-perf
[2] 云原生批调度实战:Volcano Pod创建数量不足问题排查与Webhook超时修复
[5] Kubernetes 文档 - Kubernetes 1.25: CustomResourceDefinition Validation Rules Graduate to Beta
- 标题: 【集群】云原生批调度实战:Volcano Webhook禁用与性能瓶颈分析
- 作者: Fre5h1nd
- 创建于 : 2025-08-22 22:55:54
- 更新于 : 2025-08-24 15:21:27
- 链接: https://freshwlnd.github.io/2025/08/22/k8s/k8s-scheduler-performance-volcano-webhook-disable/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。