Kubernetes Coverage for Fault Awareness and Recovery
面向大规模 AI 工作负载的故障感知与即时恢复方案
在深入分析 kcover 之前,先理解它所解决的核心问题和相关术语。
dcgmi diag 可对 GPU 执行健康诊断,检测硬件故障。kcover 是 BaizeAI 开源的一个 Kubernetes 控制器,专为大规模 AI/ML 工作负载提供自动化的故障感知和恢复能力。
通过 Pod 状态监控、NVIDIA GPU 诊断(DCGM)、Kubernetes Event 监听等多维度检测故障,实现硬件/网络/软件故障的自动发现。
检测到故障后自动执行恢复:删除异常 Pod 触发重建、将故障节点标记为不可调度,无需人工介入。内置 TTL 防抖机制防止重启风暴。
基于 Kubernetes Informer 和 Leader Election 构建,支持多副本部署;Agent 以 DaemonSet 方式运行在每个 GPU 节点,实现节点级诊断。
| 项目名称 | kcover |
| 组织 | BaizeAI(百泽 AI)— 与 Merbridge、DaoCloud 生态关联 |
| 许可证 | Apache 2.0(允许商用) |
| 编程语言 | Go 1.23+ |
| 安装方式 | Helm Chart — helm install kcover baizeai/kcover |
| 镜像仓库 | release-ci.daocloud.io/baize/kcover-controller / kcover-agent |
| 支持平台 | linux/amd64, linux/arm64 |
| K8s 兼容 | 1.19+ |
| KubeCon 演讲 | "Sit Back and Relax with Fault Awareness and Robust Instant Recovery for Large Scale AI Workloads" — KubeCon HK 2024 |
| Topics | kubeflowkubernetesllmmlopsnvidia-gpupytorchjobxid-error |
kcover 采用 Controller-Agent 双组件架构,遵循 Kubernetes 原生设计范式。
| 组件 | 部署方式 | 职责 | 对应入口 |
|---|---|---|---|
| kcover-controller | Deployment(多副本 + Leader Election) | 集群级控制:诊断编排、事件处理、恢复执行 | cmd/kcover/main.go |
| kcover-agent | DaemonSet(每个 GPU 节点一个) | 节点级诊断:执行 DCGM GPU 健康检查,上报故障 | cmd/collector-controller/main.go |
从故障发生到恢复完成的完整处理流程。
PodStatusCollector 通过 Informer 监听 Pod 状态变化;或 DCGM Agent 每 30 秒执行一次 GPU 诊断;或外部系统通过标注 Event 触发。
诊断模块将故障信息包装为 CollectorEvent,包含目标类型(Pod/Node/Device)、命名空间、事件类型(Error/Warning)。
KubeEventsRecorder 将事件写入 Kubernetes Event 对象,并附加 kcover.io/need-recovery=true 标注。Controller 的 Informer 监听到标注 Event。
RecoveryController 检查 Pod/Job 是否带有 kcover.io/cascading-recovery=true 标签;校验 RestartPolicy 非 Never;通过 TTL Cache 确认不在冷却期内(30 秒)。
Pod 级:批量删除该 Job 的所有 Pod,由 Kubeflow Operator 自动重建。Node 级:将节点标记为 Unschedulable,并对该节点上的所有 Job 执行 Pod 级恢复。
项目代码精简,核心逻辑约 2000 行 Go 代码,模块划分清晰。
| 依赖 | 版本 | 用途 |
|---|---|---|
| k8s.io/client-go | v0.32.0 | Kubernetes API 客户端、Informer、Leader Election |
| jellydator/ttlcache | v3.3.0 | TTL 缓存,用于重启防抖和 Job 标签缓存 |
| samber/lo | v1.47.0 | Go 泛型工具库,简化集合操作 |
| k8s.io/klog/v2 | v2.130.1 | 结构化日志 |
nvidiadiag/nvidia_diag.go 中的 dcgmi diag 调用尚未实现(注释状态),说明 GPU 诊断功能仍在开发中。kcover 的三大核心能力:标签驱动的恢复策略、多维度故障检测、分级恢复机制。
kcover 通过 Kubernetes 标签(Label)和标注(Annotation)控制恢复行为,无需修改应用代码:
| 标签/标注 | 作用范围 | 说明 |
|---|---|---|
kcover.io/cascading-recovery=true | Pod 或 Job | 启用级联恢复。可标注在 Pod 上,也可标注在 PyTorchJob/TFJob 上自动传递到 Pod |
kcover.io/need-recovery=true | K8s Event Annotation | 触发恢复的信号。诊断模块或外部系统通过此标注标记需要恢复的 Event |
training.kubeflow.org/job-name | Pod (Kubeflow 自动添加) | 标识 Pod 所属的训练 Job,用于批量删除同 Job 的所有 Pod |
# 在 PyTorchJob 上启用恢复(推荐方式,自动传递到 Pod) kubectl label pytorchjobs my-training-job kcover.io/cascading-recovery=true # 或直接标注 Pod kubectl label pod my-training-worker-0 kcover.io/cascading-recovery=true # 也可以在 Job YAML 中预设 metadata: labels: kcover.io/cascading-recovery: "true"
实现状态: 已实现
通过 Kubernetes Informer 实时监听 Pod 状态变化。当容器以 Reason: Error 状态退出时,自动产生恢复事件。仅监控带有恢复标签的 Pod。
实现状态: 开发中
Agent 每 30 秒执行 dcgmi diag -r 1,检测 GPU 硬件故障。当前代码框架已搭建,但核心 dcgmi 调用和结果解析仍在注释状态。
实现状态: 已实现
监听集群中所有带有 kcover.io/need-recovery=true 标注的 Event。这提供了外部集成通道 — 任何能创建 K8s Event 的系统都可以触发恢复。
实现状态: 架构支持
通过 Kubernetes Event 标注机制,任何外部监控系统(如 Prometheus AlertManager、DCGM Exporter)只需创建带标注的 Event 即可触发恢复,无需代码集成。
| 故障级别 | 触发条件 | 恢复动作 | 影响范围 |
|---|---|---|---|
| Pod 级 | 容器异常退出(exit code != 0) | 删除该 Job 的所有 Pod → Kubeflow Operator 自动重建 | 单个训练任务 |
| Node 级 | 节点故障(GPU 掉线、DCGM 报告等) | 1. 将节点标记为 Unschedulable 2. 对该节点上所有带恢复标签的 Job 执行 Pod 级恢复 | 故障节点上的所有训练任务 |
从代码质量、功能完整度、社区活跃度、生产就绪度四个维度评估。
| 场景 | 适用性 | 说明 |
|---|---|---|
| 大规模 LLM 训练集群 | 非常适合 | GPU 故障频繁,自动恢复可大幅减少人工介入和训练中断时间 |
| Kubeflow 分布式训练 | 非常适合 | 原生支持 PyTorchJob 和 TFJob,无缝集成 |
| 通用 K8s 工作负载 | 一般适合 | 架构支持但需扩展,当前聚焦 Kubeflow 生态 |
| 非 GPU 工作负载 | 一般适合 | Pod 状态监控可用,但 DCGM 诊断不适用 |
| 生产环境(立即可用) | 需谨慎 | 核心 GPU 诊断功能未完成,建议先在测试环境验证 Pod 级恢复 |
当前 5 个 Open Issue 反映了社区关注的方向。
在删除 Pod 之前保存其日志。恢复操作会删除 Pod 导致日志丢失,建议先收集日志以便事后分析故障原因。renovate 2025-06
请求将安全检测间隔和时间窗口大小改为可配置。当前 30 秒的检测间隔和冷却期是硬编码的。enhancement 2025-03
增加对 Volcano 调度器的支持。Volcano 是另一个主流的 K8s 批处理调度器,集成可扩大用户群。enhancement 2025-01
GPU 断连导致训练失败的 bug 报告。这印证了 kcover 要解决的核心痛点。bug 2024-08
| 阶段 | 内容 | 状态 |
|---|---|---|
| Phase 1 | Pod 状态监控 + 基础恢复(删除 Pod + Node Cordon) | 已完成 |
| Phase 2 | NVIDIA DCGM GPU 诊断集成(Agent 端 dcgmi 调用) | 开发中 |
| Phase 3 | 可配置化(检测间隔、冷却时间、诊断策略) | 计划中 |
| Phase 4 | Volcano 调度器支持 + 更多 Job 类型 | 计划中 |
| Phase 5 | 恢复前日志收集、更丰富的诊断报告 | 计划中 |
# 1. 添加 Helm 仓库 helm repo add baizeai https://baizeai.github.io/charts # 2. 安装 kcover helm install kcover baizeai/kcover \ --namespace kcover-system \ --create-namespace # 3. 为训练 Job 启用故障恢复 kubectl label pytorchjobs my-llm-training \ kcover.io/cascading-recovery=true # 4. 查看恢复事件 kubectl get events -A -w --field-selector reason=Error