日志分析指南

概述

本文档整理 Volcano 各组件的关键日志模式、常见错误消息的含义和解读方法,帮助运维人员快速定位问题。


日志来源

graph TB subgraph logs["Volcano 日志来源"] SCH["vc-scheduler
调度器日志"] CTL["vc-controller-manager
控制器日志"] WH["vc-webhook-manager
Webhook 日志"] end
# 获取各组件日志
kubectl logs -n volcano-system -l app=volcano-scheduler
kubectl logs -n volcano-system -l app=volcano-controller-manager
kubectl logs -n volcano-system -l app=volcano-admission

调度器关键日志

调度周期

日志模式含义级别
"Open session"调度周期开始V(3)
"Close session"调度周期结束V(3)
"Enter xxx action"Action 开始执行V(3)
"Leaving xxx action"Action 执行结束V(3)

分配相关

日志模式含义级别
"bindTask"Task 成功绑定到 NodeV(3)
"bindErr"绑定 API 失败Error
"Committed operations for job"调度决策提交成功V(3)
"Discard operations for job"调度决策回滚(Gang 不满足)V(3)
"try to allocate task"尝试分配 TaskV(4)

Gang 调度

日志模式含义级别
"bindable job is ready"Job 满足 Gang 条件V(4)
"Bindable job is not ready"Job 不满足 Gang 条件V(4)
"job is not ready, valid is false"Job 无效V(4)

队列和资源

日志模式含义级别
"queue is overused"队列超出 DeservedV(4)
"deserved"队列 Deserved 计算结果V(4)
"reclaim"资源回收操作V(3)
"preempt"抢占操作V(3)

Predicate 过滤

日志模式含义级别
"predicate failed"节点被过滤V(4)
"Insufficient cpu"CPU 不足V(4)
"Insufficient memory"内存不足V(4)
"node taint"节点 Taint 不匹配V(4)
"node affinity"节点亲和性不匹配V(4)

控制器关键日志

Job Controller

日志模式含义级别
"execute action"执行 Job 状态转换V(3)
"sync job"同步 Job 状态V(3)
"create pod group"创建 PodGroupV(3)
"create pod"创建 PodV(3)
"job completed"Job 完成V(2)
"job failed"Job 失败Warning
"maximum retry reached"MaxRetry 耗尽Warning

Queue Controller

日志模式含义级别
"sync queue"同步 Queue 状态V(3)
"queue state changed"Queue 状态变更V(2)

PodGroup Controller

日志模式含义级别
"sync podgroup"同步 PodGroupV(3)
"podgroup phase changed"PodGroup 状态变更V(2)

常见错误消息解读

调度器错误

错误消息含义解决方案
"insufficient resources on node"节点资源不足扩容或减小 Pod 请求
"bindable job is not ready, bindable:X, bindableTasks:Y"Gang 检查:已分配 Y 个 Task,需要 X 个增加节点或降低 minAvailable
"bindErr: bindVolumes: bindclaim failed"PVC 绑定失败检查 StorageClass 和 PV
"predicate failed on node xxx: Insufficient cpu"节点 CPU 不足减少请求或使用其他节点
"job xxx queue xxx is overused"Job 所在队列已超出份额等待其他队列释放或增大 Weight
"plugin xxx panic"插件内部错误检查插件配置和输入数据

控制器错误

错误消息含义解决方案
"failed to create pod"Pod 创建失败检查 RBAC、ResourceQuota
"failed to create podgroup"PodGroup 创建失败检查 CRD 是否注册
"maximum retry reached, job failed"重试次数耗尽增大 maxRetry 或修复 Pod 错误
"job sync error"Job 状态同步失败检查 API Server 连通性

Webhook 错误

错误消息含义解决方案
"minAvailable should not exceed total replicas"minAvailable 超出总副本数调整 minAvailable
"task name must be unique"Task 名称重复修改 Task 名称
"queue not found"指定的队列不存在先创建 Queue
"queue is not open"队列已关闭开放队列

日志分析工具

实时日志追踪

# 实时追踪调度器日志
kubectl logs -f -n volcano-system -l app=volcano-scheduler

# 只看错误
kubectl logs -n volcano-system -l app=volcano-scheduler | grep -E "Error|error|ERR"

# 追踪特定 Job
kubectl logs -f -n volcano-system -l app=volcano-scheduler | grep "my-job"

日志统计

# 统计调度周期数
kubectl logs -n volcano-system -l app=volcano-scheduler | grep "Open session" | wc -l

# 统计 Predicate 失败
kubectl logs -n volcano-system -l app=volcano-scheduler | grep "predicate failed" | wc -l

# 统计 Commit vs Discard
echo "Commits:"
kubectl logs -n volcano-system -l app=volcano-scheduler | grep "Committed" | wc -l
echo "Discards:"
kubectl logs -n volcano-system -l app=volcano-scheduler | grep "Discard" | wc -l

# 统计错误类型
kubectl logs -n volcano-system -l app=volcano-scheduler | grep "Error\|error" | \
  awk '{for(i=1;i<=NF;i++) if($i ~ /Error|error/) print $0}' | sort | uniq -c | sort -rn

时间线分析

# 追踪一个 Job 的完整时间线
JOB="my-job"
echo "=== Controller ==="
kubectl logs -n volcano-system -l app=volcano-controller-manager | grep "$JOB" | head -20
echo "=== Scheduler ==="
kubectl logs -n volcano-system -l app=volcano-scheduler | grep "$JOB" | head -20
echo "=== Events ==="
kubectl get events --sort-by='.lastTimestamp' | grep "$JOB"

日志级别速查

组件级别输出内容
SchedulerV(0)错误和致命
SchedulerV(2)基本信息、组件启停
SchedulerV(3)调度周期、Action 进出、分配结果
SchedulerV(4)Job/Task 级别的详细决策
SchedulerV(5)每个节点的 Predicate/Score 细节
ControllerV(0)错误和警告
ControllerV(2)状态变更
ControllerV(3)同步操作、Pod/PodGroup 创建
ControllerV(4)事件处理细节

日志配置最佳实践

环境调度器级别控制器级别日志保留
生产-v=2-v=27 天
预发布-v=3-v=33 天
测试-v=4-v=31 天
开发调试-v=5-v=4实时

参考文件

文件说明
pkg/scheduler/scheduler.go调度器主循环日志
pkg/scheduler/framework/session.goSession 操作日志
pkg/controllers/job/job_controller.goJob Controller 日志
pkg/webhooks/Webhook 日志