【集群】云原生批调度实战:Volcano Pod创建数量不足问题排查与Webhook超时修复

【集群】云原生批调度实战:Volcano Pod创建数量不足问题排查与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禁用与性能瓶颈分析

💡简介

上一篇博客中,我们介绍了如何禁用Volcano调度器的enqueue功能。然而,在实际测试过程中,我们发现了一个更严重的问题:Pod创建数量始终少于10000,仅达到1000左右,这严重影响了测试结果的准确性。

本文详细记录了问题排查的完整过程,从发现异常现象到分析4.9GB的审计日志,最终定位到Webhook超时是导致Pod创建失败的根本原因。通过修改Webhook超时时间,我们成功解决了这个问题。

🚨问题现象描述

测试环境配置

我们使用以下参数进行测试:

1
2
3
4
5
6
7
8
9
make serial-test \
RESULT_RECENT_DURATION_SECONDS=60 TEST_TIMEOUT_SECONDS=160 \
NODES_SIZE=1000 \
QUEUES_SIZE=1 JOBS_SIZE_PER_QUEUE=20 PODS_SIZE_PER_JOB=500

make serial-test \
RESULT_RECENT_DURATION_SECONDS=90 TEST_TIMEOUT_SECONDS=190 \
NODES_SIZE=1000 \
QUEUES_SIZE=1 JOBS_SIZE_PER_QUEUE=1 PODS_SIZE_PER_JOB=10000

预期结果:应该创建10,000个Pod
实际结果:仅创建了不到1,000个Pod,成功率不到10%

🔍问题排查过程

1. 初步分析

首先,我们检查了测试环境的基本状态:

1
2
3
4
5
# 检查Pod数量
kubectl get pods -A | grep volcano-job | wc -l

# 检查Job状态
kubectl get vcjob -A

发现确实只有少量Pod被创建,大部分Pod创建请求似乎失败了。

2. 日志文件分析

2.1 日志文件大小

测试完成后,我们发现审计日志文件异常巨大:

1
2
ls -lh results/1755448387/logs/kube-apiserver-audit.volcano.log
# 输出:-rw-rw-rw- 1 root root 4.9G 8月 18 00:22 kube-apiserver-audit.volcano.log

4.9GB的日志文件表明系统产生了大量的审计记录,远大于其它测试的审计记录,猜测这意味着存在大量失败的操作。

2.2 高效日志分析方法

由于日志文件过大,我们采用了高效的分析方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 统计错误数量
grep -c "context deadline exceeded" kube-apiserver-audit.volcano.log
# 输出:520120

# 统计Webhook调用数量
grep -c "validatepod.volcano.sh" kube-apiserver-audit.volcano.log
# 输出:515531

# 统计Pod创建成功/失败数量
grep -c "ResponseComplete.*pods.*create.*Success" kube-apiserver-audit.volcano.log
# 输出:712
grep -c "ResponseComplete.*pods.*create.*Failure" kube-apiserver-audit.volcano.log
# 输出:520518

3. 根本原因定位

3.1 错误模式分析

通过分析日志中的错误信息,我们发现了统一的错误模式:

1
2
3
4
5
6
{
"status": "Failure",
"message": "Internal error occurred: failed calling webhook \"validatepod.volcano.sh\": failed to call webhook: Post \"https://volcano-admission-service.volcano-system.svc:443/pods/validate?timeout=10s\": context deadline exceeded",
"reason": "InternalError",
"code": 500
}

关键信息

  • 错误类型:Webhook调用超时
  • 超时时间:10秒
  • 影响范围:98.7%的Pod创建请求失败

3.2 统计数据汇总

指标数量占比
总Pod创建请求526,767100%
成功创建7120.13%
失败创建520,51898.7%
Webhook超时错误520,12098.7%

4. 问题根因分析

4.1 Webhook超时机制

Volcano使用admission webhook来验证和修改Pod创建请求:

  1. Pod创建流程

    1
    kubectl create pod → API Server → Admission Webhook → Volcano Controller → Pod创建
  2. 超时配置

    • 当前配置:timeoutSeconds: 10
    • 问题:10秒内无法处理大量并发Pod创建请求

4.2 性能瓶颈分析

当设置PODS_SIZE_PER_JOB=10000时:

  1. 并发压力:系统需要同时处理10,000个Pod创建请求
  2. Webhook负载:每个请求都需要经过admission webhook验证
  3. 超时触发:大量请求堆积导致处理时间超过10秒
  4. 失败连锁:超时失败导致Pod创建失败,影响整体测试结果

🔧问题修复方案

1. 修改Webhook超时时间

1.1 手动修改方法

我们需要将所有webhook配置文件的超时时间从10秒增加到30秒:

1
2
3
4
5
# 查找所有webhook配置文件
find schedulers/volcano/ -name "*webhook*.yaml" -exec grep -l "timeoutSeconds: 10" {} \;

# 批量修改超时时间
sed -i 's/timeoutSeconds: 10/timeoutSeconds: 30/g' schedulers/volcano/admission-service-*.yaml

重要说明:Kubernetes对webhook超时时间有严格限制,必须在1到30秒之间。我们最初尝试设置为60秒,但在部署时遇到了验证错误。

1.3 Kubernetes超时时间限制

在修复过程中,我们发现了一个重要的Kubernetes限制:

当我们尝试将webhook超时时间设置为60秒时,在部署过程中遇到了以下错误:

1
2
3
4
Error from server (Invalid): error when creating "../../schedulers/volcano": 
MutatingWebhookConfiguration.admissionregistration.k8s.io "volcano-admission-service-jobs-mutate"
is invalid: webhooks[0].timeoutSeconds: Invalid value: 60:
the timeout value must be between 1 and 30 seconds

这个错误表明:

  • Kubernetes限制:webhook超时时间必须在1到30秒之间
  • 我们之前的设置:60秒超出了允许范围
  • 影响范围:所有7个webhook配置文件都无法部署

1.2 修改的文件列表

需要修改的7个webhook配置文件:

  1. admission-service-jobs-validate_validatingwebhookconfiguration.yaml
  2. admission-service-queues-mutate_mutatingwebhookconfiguration.yaml
  3. admission-service-jobs-mutate_mutatingwebhookconfiguration.yaml
  4. admission-service-podgroups-mutate_mutatingwebhookconfiguration.yaml
  5. admission-service-pods-mutate_mutatingwebhookconfiguration.yaml
  6. admission-service-queues-validate_validatingwebhookconfiguration.yaml
  7. admission-service-pods-validate_validatingwebhookconfiguration.yaml

2. 修复实现

为了修改配置,可以按照以下步骤进行:

步骤1:备份原配置文件

1
2
3
4
5
# 创建备份目录
mkdir -p schedulers/volcano/backup-$(date +%Y%m%d-%H%M%S)

# 备份所有webhook配置文件
cp schedulers/volcano/admission-service-*.yaml schedulers/volcano/backup-$(date +%Y%m%d-%H%M%S)/

步骤2:查找需要修改的文件

1
2
3
4
5
# 查找所有包含timeoutSeconds的文件
find schedulers/volcano/ -name "*webhook*.yaml" -exec grep -l "timeoutSeconds:" {} \;

# 查看当前超时设置
grep -r "timeoutSeconds:" schedulers/volcano/ | grep -E "[0-9]+"

步骤3:逐个修改文件

1
2
3
4
5
6
7
8
9
10
# 修改validating webhook配置文件
sed -i 's/timeoutSeconds: 10/timeoutSeconds: 30/g' schedulers/volcano/admission-service-jobs-validate_validatingwebhookconfiguration.yaml
sed -i 's/timeoutSeconds: 10/timeoutSeconds: 30/g' schedulers/volcano/admission-service-pods-validate_validatingwebhookconfiguration.yaml
sed -i 's/timeoutSeconds: 10/timeoutSeconds: 30/g' schedulers/volcano/admission-service-queues-validate_validatingwebhookconfiguration.yaml

# 修改mutating webhook配置文件
sed -i 's/timeoutSeconds: 10/timeoutSeconds: 30/g' schedulers/volcano/admission-service-jobs-mutate_mutatingwebhookconfiguration.yaml
sed -i 's/timeoutSeconds: 10/timeoutSeconds: 30/g' schedulers/volcano/admission-service-podgroups-mutate_mutatingwebhookconfiguration.yaml
sed -i 's/timeoutSeconds: 10/timeoutSeconds: 30/g' schedulers/volcano/admission-service-pods-mutate_mutatingwebhookconfiguration.yaml
sed -i 's/timeoutSeconds: 10/timeoutSeconds: 30/g' schedulers/volcano/admission-service-queues-mutate_mutatingwebhookconfiguration.yaml

步骤4:批量修改(推荐)

1
2
# 一次性修改所有文件
sed -i 's/timeoutSeconds: 10/timeoutSeconds: 30/g' schedulers/volcano/admission-service-*.yaml

3. 验证修复效果

3.1 检查配置修改

1
2
3
4
5
6
7
8
# 检查是否所有文件都已修改
grep -r "timeoutSeconds:" schedulers/volcano/ | grep -E "[0-9]+"
# 期望输出:所有文件都显示 timeoutSeconds: 30

# 确认没有遗漏的文件
find schedulers/volcano/ -name "*webhook*.yaml" -exec grep -l "timeoutSeconds: 10" {} \;

# 如果上述命令有输出,说明还有文件未修改

3.2 重新部署测试

1
2
3
4
5
6
7
8
# 重新部署Volcano
make up-volcano

# 重新运行测试
make serial-test \
RESULT_RECENT_DURATION_SECONDS=90 TEST_TIMEOUT_SECONDS=190 \
NODES_SIZE=1000 \
QUEUES_SIZE=1 JOBS_SIZE_PER_QUEUE=1 PODS_SIZE_PER_JOB=10000

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

🗺参考文献

[1] Github - kube-scheduling-perf

[2] Volcano Documentation - Admission Webhooks

[3] Kubernetes Documentation - Admission Controllers

[4] 云原生批调度实战:Volcano调度器enqueue功能禁用与性能测试

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

  • 标题: 【集群】云原生批调度实战:Volcano Pod创建数量不足问题排查与Webhook超时修复
  • 作者: Fre5h1nd
  • 创建于 : 2025-08-18 23:19:30
  • 更新于 : 2025-08-21 19:57:24
  • 链接: https://freshwlnd.github.io/2025/08/18/k8s/k8s-scheduler-performance-volcano-webhook-debug/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论