操作场景
在 GPU 集群运行过程中,GPU 硬件可能出现各类故障,如 XID 错误、ECC 内存错误、温度过高、设备丢失等问题。这些故障如果不能及时发现和处理,可能导致训练任务失败、数据损坏甚至集群不稳定。
TKE 提供了完整的 GPU 故障检测与自愈解决方案,通过 Node Problem Detector(NPD) 组件实时检测 GPU 异常,并结合 Node-Healing 组件自动执行隔离、排空、重启等自愈操作,帮助您快速恢复 GPU 节点的正常运行状态,保障 AI 训练和推理任务的稳定性。
前提条件
已创建 TKE 集群,且集群中包含 GPU 节点。详情请参见 创建集群。
集群 Kubernetes 版本 >= 1.18。
故障自愈功能仅作用于原生节点。
功能说明
GPU 故障检测能力
TKE 支持检测以下 12 种 GPU 故障类型:
故障类型 | 说明 |
GPUDeviceLost | GPU 设备丢失,无法被系统识别 |
GPUDoubleBitEccError | GPU 双位 ECC 错误,不可纠正的内存错误 |
GPUHighSingleBitEccError | GPU 单位 ECC 错误超过阈值 |
GPUInfoROMCorrupted | GPU InfoROM 损坏 |
GPUNvlinkError | NVLink 通信错误 |
GPUPCIeError | PCIe 接口异常 |
GPUPendingRetiredPages | GPU 待退役内存页 |
GPUPowerError | GPU 电源问题 |
GPURemappingRowsError | GPU 内存行映射错误 |
GPUTempError | GPU 温度过高 |
GPUXIDFatalError | GPU 致命 XID 错误 |
GPUXIDWarningError | GPU 警告 XID 错误 |
自愈策略说明
根据故障类型的不同,系统采用不同的自愈策略:
自愈策略 | 执行步骤 | 适用故障类型 |
完整自愈流程 | 隔离 → 排空 → 重启 → 解封 | GPUDeviceLost、GPUNvlinkError、GPUPCIeError、GPUPendingRetiredPages、GPUXIDWarningError |
仅隔离排空 | 隔离 → 排空 | GPUDoubleBitEccError、GPUHighSingleBitEccError、GPUInfoROMCorrupted、GPUPowerError、GPURemappingRowsError、GPUTempError、GPUXIDFatalError |
说明:
完整自愈流程:适用于软件或可恢复的硬件问题,重启后可自动恢复。
仅隔离排空:适用于严重硬件故障,需要人工介入检查和维修,系统仅执行隔离和排空操作,避免新任务调度到故障节点。
操作步骤
步骤1:安装 Node Problem Detector 组件
Node Problem Detector(NPD)是节点故障检测的基础组件,负责实时监控节点状态并上报异常。
1. 登录 容器服务控制台,在左侧导航栏中选择集群。
2. 在集群列表中,单击目标集群 ID,进入集群详情页。
3. 选择左侧菜单栏中的组件管理,在组件管理页面单击新建。
4. 在新建组件管理页面中勾选 NodeProblemDetectorPlus。
5. 单击完成即可创建组件。
安装完成后,NPD 组件会以 DaemonSet 方式运行在集群中的每个节点上,自动检测 GPU 相关故障并更新节点 Condition。
步骤2:安装 Node-Healing 组件
Node-Healing 组件负责根据检测到的故障执行自愈操作。
1. 在组件管理页面单击新建。
2. 在新建组件管理页面中勾选 Node-Healing。
3. 单击完成即可创建组件。
步骤3:配置 GPU 节点自愈策略
安装组件后,需要创建 NodeHealer 资源来定义 GPU 节点的自愈策略。
1. 创建 NodeHealer 配置文件
gpu-node-healer.yaml:apiVersion: node.healing.tke.cloud.tencent.com/v1kind: NodeHealermetadata:name: gpu-cluster-healerspec:nodeSelector:matchLabels:node-healing.tke.cloud.tencent.com/belong-to: gpu-cluster-healercloud.tencent.com/provider: tencentcloudnode.tke.cloud.tencent.com/accelerator-type: gpumachineHealingTemplate:name: "default-healing-template"kind: "MachineHealingTemplate"apiVersion: "node.healing.tke.cloud.tencent.com/v1"unhealthyConditions:- type: GPUXIDFatalError # GPU 致命错误enableCheck: trueenableHealing: truedurationTime: "1m"priority: 100- type: GPUDeviceLost # GPU 设备丢失enableCheck: trueenableHealing: truedurationTime: "5m"priority: 80nodeHealingPolicy:maxHealConcurrency: 3minNodeCoolingMinutes: 30
说明:
2. 执行以下命令应用配置:
kubectl apply -f gpu-node-healer.yaml
步骤4:为 GPU 节点添加标签
NodeHealer 通过
nodeSelector 中定义的标签来选择需要自愈的节点。您需要为目标节点添加与配置文件中 nodeSelector.matchLabels 一致的标签。下述示例配置为例,执行以下命令为 GPU 节点添加标签:kubectl label node <node-name> node-healing.tke.cloud.tencent.com/belong-to=gpu-cluster-healer
或批量为所有原生 GPU 节点添加标签:
kubectl label node \\-l node.tke.cloud.tencent.com/accelerator-type=gpu \\node-healing.tke.cloud.tencent.com/belong-to=gpu-cluster-healer
说明:
标签键值可自定义,只需确保节点标签与 NodeHealer 配置中的
nodeSelector.matchLabels 一致即可。验证配置
查看 NodeHealer 状态
kubectl get nodehealer
预期输出:
NAME AGEgpu-cluster-healer 1h
查看节点 Condition
kubectl get node <gpu-node-name> -o jsonpath='{.status.conditions}' | jq
如果 NPD 检测到 GPU 故障,会在节点 Condition 中显示对应的故障类型。
查看自愈任务
kubectl get healingtask -n kube-system
当触发自愈时,系统会自动创建 HealingTask 记录任务执行状态。
处理 GPU 硬件故障
对于严重的 GPU 硬件故障(如双位 ECC 错误、InfoROM 损坏等),系统仅执行隔离和排空操作,不会自动重启。您需要按以下流程人工处理:
1. 确认故障:在容器服务控制台查看节点状态,或通过
kubectl describe node 命令查看节点 Condition 和事件,确认具体的故障类型。2. 检查 GPU 状态:登录节点,使用
nvidia-smi -q 命令检查 GPU 详细状态。3. 联系维修:如确认为硬件故障,请 提交工单 联系腾讯云售后团队进行检查和更换。
4. 恢复节点:故障修复后,通过
kubectl uncordon 命令解除节点隔离,并移除自愈相关的 Taint。配置说明
unhealthyConditions 参数说明
定义需要监控的故障类型及自愈行为:
参数 | 类型 | 说明 |
type | string | |
enableCheck | bool | 是否启用检测。 |
enableHealing | bool | 是否启用自愈。 |
durationTime | string | 故障持续多长时间后触发自愈,格式如 1m、5m。 |
priority | int | 优先级,数值越大优先级越高(0-100)。 |
durationTime 建议配置:
故障类型 | 建议值 | 说明 |
严重硬件故障(ECC 错误、XID 致命错误等) | 1m | 快速响应,避免数据损坏。 |
一般硬件故障(设备丢失、NVLink 错误等) | 5m | 适当观察,避免误判。 |
可恢复问题(警告类错误) | 10m | 延长观察,可能自动恢复。 |
nodeHealingPolicy 参数说明
限流策略,防止大规模故障时集群雪崩:
参数 | 说明 | 建议值 |
maxHealNodesPerDay | 每天最大自愈节点数 | 10-20 |
maxHealNodesPerHour | 每小时最大自愈节点数 | 3-5 |
maxHealConcurrency | 最大并发自愈数 | 2-3 |
minNodeCoolingMinutes | 同一节点两次自愈的最小间隔(分钟) | 30-60 |
常见问题
GPU 故障检测不生效?
1. 确认 NPD 组件已正确安装并运行:
kubectl get ds -n kube-system | grep node-problem-detector
2. 确认节点上的 NPD Pod 状态正常:
kubectl get pod -n kube-system -l app=node-problem-detector -o wide
自愈任务未触发?
1. 确认节点已添加与 NodeHealer 配置匹配的标签:
kubectl get node <node-name> --show-labels
2. 确认节点是原生节点(有
cloud.tencent.com/provider=tencentcloud 标签)。3. 检查故障持续时间是否超过
durationTime 配置。4. 检查是否被限流策略限制:
kubectl describe nodehealer gpu-cluster-healer
如何关闭某个节点的自愈?
移除节点上与 NodeHealer 配置匹配的标签即可,例如:
kubectl label node <node-name> node-healing.tke.cloud.tencent.com/belong-to-
相关文档