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

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

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禁用与性能瓶颈分析
  13. 云原生批调度实战:Volcano性能瓶颈猜想验证与实验总结

💡简介

上一篇博客中,我们通过修改webhook超时时间解决了Pod创建数量不足的问题。然而,在实际测试过程中,我们发现webhook本身可能成为性能瓶颈,特别是在大规模Job提交的场景下。

本文详细介绍了如何通过修改kube-scheduling-perf的Makefile来完全禁用Volcano的webhook功能,分析了webhook对调度性能的影响,并探讨了未来通过CRD替代webhook的可能性。通过实验发现,即使禁用webhook,在Job数量较多时仍然存在Pod创建瓶颈,这为后续的调度器优化提供了重要参考。

🖼️背景需求分析

1. Webhook性能瓶颈问题

1.1 多次判断的性能开销

Volcano的webhook系统包含多个组件,每个Pod创建请求都需要经过:

  1. Mutating Webhook:修改Pod配置(如添加maxRetryminAvailable等字段)
  2. Validating Webhook:验证Pod配置的合法性
  3. Admission Service:处理webhook请求的服务
  4. TLS证书验证:确保webhook调用的安全性

之前的测试中,我们发现webhook超时成为了Pod创建失败的主要原因,98.7%的请求因超时而失败。

1.2 替代方案的可能性

考虑到现代Kubernetes版本的发展趋势,webhook的某些功能可以通过以下方式替代:

  1. CRD验证:在Kubernetes较新版本中,可以通过CRD的验证规则替代部分validating webhook
  2. 准入策略:使用Pod Security Standards等内置策略替代部分验证逻辑
  3. 预配置模板:通过提前配置Job模板,减少运行时的修改需求

1.3 性能测试需求

为了准确评估webhook对调度性能的影响,我们需要:

  • 基准测试:在有webhook的情况下进行性能测试
  • 对比测试:在禁用webhook的情况下进行相同的性能测试
  • 瓶颈分析:识别webhook是否是真正的性能瓶颈

🔧方案设计与实现

1. 整体设计思路

1.1 保留核心组件

我们采用选择性禁用的策略,只删除webhook配置,保留其他重要组件:

  • 保留volcano-admission deployment、volcano-admission-servicevolcano-admission-init job
  • 删除:所有MutatingWebhookConfigurationValidatingWebhookConfiguration

1.2 实现方式

通过修改./clusters/volcano/Makefile,在Volcano部署完成后自动删除webhook配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
.PHONY: disable-volcano-webhooks
disable-volcano-webhooks:
# 只删除webhook配置,保留admission服务和初始化组件
# 删除所有MutatingWebhookConfiguration
-KUBECONFIG=$(KUBECONFIG) kubectl delete mutatingwebhookconfiguration volcano-admission-service-jobs-mutate
-KUBECONFIG=$(KUBECONFIG) kubectl delete mutatingwebhookconfiguration volcano-admission-service-podgroups-mutate
-KUBECONFIG=$(KUBECONFIG) kubectl delete mutatingwebhookconfiguration volcano-admission-service-pods-mutate
-KUBECONFIG=$(KUBECONFIG) kubectl delete mutatingwebhookconfiguration volcano-admission-service-queues-mutate
# 删除所有ValidatingWebhookConfiguration
-KUBECONFIG=$(KUBECONFIG) kubectl delete validatingwebhookconfiguration volcano-admission-service-jobs-validate
-KUBECONFIG=$(KUBECONFIG) kubectl delete validatingwebhookconfiguration volcano-admission-service-pods-validate
-KUBECONFIG=$(KUBECONFIG) kubectl delete validatingwebhookconfiguration volcano-admission-service-queues-validate
@echo "Volcano webhook configurations have been disabled, but admission service and init components are preserved"

2. 具体实现步骤

2.1 修改Makefile

clusters/volcano/Makefile中,我们添加了多个webhook控制选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 完全禁用webhook
.PHONY: disable-volcano-webhooks
disable-volcano-webhooks:
# 删除所有webhook配置

# 只禁用mutating webhook
.PHONY: disable-volcano-mutating-webhooks
disable-volcano-mutating-webhooks:
# 只删除MutatingWebhookConfiguration

# 只禁用validating webhook
.PHONY: disable-volcano-validating-webhooks
disable-volcano-validating-webhooks:
# 只删除ValidatingWebhookConfiguration

# 重新启用webhook
.PHONY: enable-volcano-webhooks
enable-volcano-webhooks:
# 重新创建所有webhook配置

2.2 集成到部署流程

up目标中集成webhook禁用:

1
2
3
4
5
6
7
8
9
10
.PHONY: up
up: \
create-cluster
make wait
make -j 2 \
create-kwok \
create-volcano
make disable-volcano-webhooks # 自动禁用webhook
make limit-built-controller-manager
make uncordon

3. 技术细节说明

3.1 Webhook配置类型

我们禁用的webhook配置包括:

类型配置名称功能描述
Mutatingvolcano-admission-service-jobs-mutate修改Job配置,添加maxRetry等字段
Mutatingvolcano-admission-service-podgroups-mutate修改PodGroup配置
Mutatingvolcano-admission-service-pods-mutate修改Pod配置
Mutatingvolcano-admission-service-queues-mutate修改Queue配置
Validatingvolcano-admission-service-jobs-validate验证Job配置合法性
Validatingvolcano-admission-service-pods-validate验证Pod配置合法性
Validatingvolcano-admission-service-queues-validate验证Queue配置合法性

3.2 保留组件的原因

我们选择保留以下组件的原因:

  1. volcano-admission deployment:保持服务架构完整性,避免其他组件依赖问题
  2. **volcano-admission-service**:维持网络服务,避免服务发现失败
  3. volcano-admission-init job:继续生成TLS证书,确保系统安全性

🚀未来展望与优化方向

1. CRD替代Webhook的可能性

1.1 Kubernetes版本演进

从Kubernetes 1.16开始,CRD支持更强大的验证和默认值设置:

1
2
3
4
5
6
7
8
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
spec:
validation:
openAPIV3Schema:
# 可以定义复杂的验证规则
defaulting:
# 可以设置默认值

1.2 替代方案设计

未来可以考虑通过以下方式替代webhook:

  1. CRD验证规则:在Job CRD中定义验证规则,替代validating webhook
  2. 默认值设置:通过CRD的defaulting功能,替代mutating webhook
  3. 准入策略:使用Pod Security Standards等内置策略

1.3 实现路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 示例:通过CRD实现Job验证
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: jobs.batch.volcano.sh
spec:
validation:
openAPIV3Schema:
properties:
spec:
properties:
maxRetry:
type: integer
minimum: 1
maximum: 10
minAvailable:
type: integer
minimum: 1
defaulting:
openAPIV3Schema:
properties:
spec:
properties:
maxRetry:
default: 3

2. Controller调度逻辑优化

基于测试结果,我们发现前期确定的优化点仍然存在。具体而言:

  1. 实验结果发现:即使禁用了webhook,在Job数量很多时仍然存在前期测试中提到的Pod CREATE 瓶颈。
  2. 可能原因:Volcano会分批处理Job并CREATE Pod,当Job数量多时CREATE速度比SCHEDULE速度慢而成为瓶颈。
  3. 后续思路:可以通过检查和修改controller的调度逻辑来进行优化。

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

🗺参考文献

[1] Github - kube-scheduling-perf

[2] 云原生批调度实战:Volcano Pod创建数量不足问题排查与Webhook超时修复

[3] 云原生批调度实战:调度器测试监控结果

[4] Volcano 文档 - 架构

[5] Kubernetes 文档 - Kubernetes 1.25: CustomResourceDefinition Validation Rules Graduate to Beta

[6] Kubernetes 文档 - CRD Validation

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

  • 标题: 【集群】云原生批调度实战: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 进行许可。
评论