版本信息最后核对:2026-10-25
GPU 节点生命周期运维:加入、下线、重启、驱动升级与重新调度的检查清单。
新节点加入集群后长期 NotReady,或节点已经 Ready 但 nvidia.com/gpu 容量为零,GPU Pod 一直 Pending;device plugin 或 GPU Operator 组件反复重启;节点重启后驱动没有加载、MIG 配置丢失、Fabric Manager 未启动,训练任务全部失败。维护时执行 drain 却卡住不动,或者 Pod 被驱逐后没有回到其他节点。
驱动升级最容易出事:容器内 nvidia-smi 与宿主机不一致,旧任务出现 CUDA 错误或 Xid,新 Pod 无法分配 GPU;节点看似恢复,调度器却把任务放上去,随后再次失败。cordon 后仍被误调度、健康检查未完成就 uncordon,也会反复失败。
先确认节点处于哪个阶段:加入、下线、重启、升级、MIG 变更还是重新加入。不同阶段的检查项和回滚方式不同。
先看节点和 GPU 资源的基本状态:
kubectl get nodes -o wide
kubectl describe node <node>
kubectl get node <node> -o jsonpath='{.status.conditions}'
kubectl get node <node> -o jsonpath='{.status.allocatable}'
kubectl get pods -A -o wide --field-selector spec.nodeName=<node>
再上节点检查驱动、设备、MIG 和服务:
nvidia-smi
nvidia-smi -L
nvidia-smi -q | grep -i -A5 -E 'mig|fabric'
ls -l /dev/nvidia*
systemctl status nvidia-fabricmanager
journalctl -u kubelet --since '30 min ago'
journalctl -k --since '30 min ago' | grep -i -E 'nvrm|xid|nvidia'
最后确认 device plugin、GPU Operator 和测试 Pod 能否真正拿到 GPU。宿主机 nvidia-smi 正常,不代表调度器能看到资源,也不代表容器内可用。
| 线索 | 更可能的方向 |
|---|---|
节点 NotReady |
kubelet、容器运行时、CNI、磁盘或证书 |
节点 Ready 但 GPU 容量为 0 |
驱动、device plugin、GPU Operator、标签 |
GPU Pod 一直 Pending |
资源名、污点、亲和性、配额、容量 |
| 插件 Pod 反复重启 | 驱动版本、运行时配置、权限、MIG 模式 |
| 重启后 MIG 配置丢失 | MIG 持久化、设备插件配置、启动顺序 |
| drain 卡住 | PDB、DaemonSet、本地存储、finalizer |
| 升级后任务报 CUDA/Xid | 驱动、内核模块、Fabric Manager、容器工具链 |
| 节点恢复后任务再次失败 | 健康检查不完整、调度过早、硬件未复检 |
回答四个问题:
新节点的 kubelet、容器运行时、CNI、证书和时间同步任一异常,都会让节点无法加入或反复 NotReady。GPU 节点还需要正确的内核头文件、驱动、容器工具链和运行时配置;Secure Boot 下驱动签名不通过,内核模块无法加载。缺少 GPU 标签或节点池配置,调度器就不会把它当作 GPU 节点。
宿主机驱动、CUDA 兼容层、容器 toolkit、device plugin 和 GPU Operator 需要成套匹配。只升级一项,可能出现宿主机能看到 GPU、容器内看不到,或插件上报资源与真实设备不符。升级后未重启或未重建内核模块,新驱动只生效一半;节点混跑不同版本时,问题只出现在部分节点。
device plugin 负责把 GPU 和 MIG 设备上报为可调度资源。插件未运行、不识别当前 MIG 模式、资源名与工作负载请求不一致,都会让容量显示为零或少于预期。MIG 模式变更通常要停止 GPU 进程并重置设备,运行中的任务会中断;重启后未重新应用配置,切分和 profile 会丢失。MIG 与整卡混用、profile 名写错,也会让 Pod 无法分配。
cordon 只标记不可调度,不驱逐已有 Pod;drain 才会驱逐。PDB、DaemonSet、本地存储或 EmptyDir、卡住的 finalizer 都会让 drain 阻塞。强制删除可能丢失本地数据,让训练任务在没有 checkpoint 时退出。GPU 任务通常不支持优雅迁移,下线前必须确认断点和重新调度策略。
节点重启后,内核模块、nvidia-persistenced、Fabric Manager、device plugin 和 kubelet 的启动顺序会影响 GPU 可用性。带 NVSwitch 的机器若 Fabric Manager 未启动或版本不匹配,NVLink 初始化和多卡训练都会异常。MIG 配置、GPU 复位状态、ECC 和 Xid 也要重新检查;nvidia-smi 能运行不等于节点健康。
GPU 资源名写错、节点选择器或亲和性排除了新节点、维护污点未移除、PDB 阻止驱逐、优先级和抢占配置不当,都会让 Pod 无法回到集群。自动扩缩容可能把任务放到尚未完成 GPU 初始化的节点;descheduler 也可能在维护期间搬动 Pod。容量不足时,drain 后的 Pod 会长期 Pending。
Xid、ECC、NVLink 错误、温度或功耗异常、GPU 掉卡,都会让节点在重启后仍不适合训练。没有健康检查和自动 cordon 时,调度器会继续把任务放到问题节点,形成反复失败。驱动升级只是触发因素,根因可能在硬件或散热。
记录节点是刚加入、准备下线、刚重启、刚升级还是刚改过 MIG;查看变更记录、维护窗口和节点事件。阶段不明时不要同时改驱动、污点和插件配置,否则无法判断哪个变量起作用。
kubectl describe node <node>
systemctl status kubelet containerd
journalctl -u kubelet --since '30 min ago'
关注节点条件、磁盘/内存/PID 压力和网络状态。节点 Ready 但 GPU 容量为零,问题通常在驱动或插件;NotReady 则先修 kubelet、运行时和 CNI,不要急着动 GPU。
确认驱动、设备节点和容器运行时配置,再查 device plugin 与 GPU Operator 日志。用测试 Pod 请求一张 GPU,验证从调度到容器内可见的链路。宿主机 nvidia-smi 正常但测试 Pod 失败,重点查运行时、toolkit、设备挂载和资源上报。
升级前查兼容矩阵,确认驱动、容器 toolkit、Operator、框架和内核模块匹配。选维护窗口,先 cordon 并 drain,确认没有任务占用 GPU;在测试或金丝雀节点验证 nvidia-smi、dcgmi diag、nccl-tests 和真实任务,再推广到整个节点池。保留旧驱动包、节点镜像和回滚步骤,禁止全池同时升级。
kubectl cordon <node>
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
--delete-emptydir-data 会删除本地临时数据,使用前确认任务已有 checkpoint、日志已采集。先检查 PDB、DaemonSet、本地存储和 finalizer,确认 Pod 能迁移或有重跑计划。--force 只用于测试环境或确认数据可丢弃时;生产优先解决阻塞原因,而不是强删。
重启前完成 drain 和维护标记。启动后依次检查内核模块、驱动、设备节点、Fabric Manager、MIG、device plugin、GPU 容量和节点条件,再跑硬件自检与通信测试,确认没有新的 Xid、ECC 增长或 NVLink 错误。任何一项失败都不要 uncordon。
MIG 模式切换会中断设备上的进程,属于破坏性操作。先在测试环境确认 profile、资源名和工作负载请求一致,再在维护窗口执行;变更后重启相关服务,核对 allocatable 中的 MIG 资源与 profile,并用测试 Pod 验证隔离和分配。准备恢复原模式的回滚步骤。
检查节点标签、污点、亲和性、资源名和配额,确认维护污点已移除、容量已上报。提交与生产同规格的测试 Pod,观察能否调度并成功运行。长任务要确认 checkpoint、重试和优先级策略有效,避免 drain 后长期 Pending 或反复失败。
uncordon 前完成:GPU 全部识别、容器内外驱动一致、MIG 符合预期、Fabric 正常、dcgmi diag 通过、nccl-tests 达到基线、没有新的 Xid 或 ECC 增长。把结果记入维护单,再移除污点并 uncordon。仅“节点 Ready”不构成上线依据。
按问题类型处理:
验证至少覆盖:
nvidia-smi 正常。dcgmi diag 和 nccl-tests 通过,结果与节点基线一致。drain、强制删除、驱动升级、节点重启和 MIG 重配都可能中断训练或丢失本地数据。操作前确认测试环境验证过、备份可用、维护窗口已批准,并准备明确的回滚路径。
合上页面,先回答,再展开对照。
Ready 但 nvidia.com/gpu 容量为零,应该先查哪一层?cordon 和 drain 有什么区别,为什么下线 GPU 节点前要先确认 checkpoint?cordon 只把节点标记为不可调度,不驱逐已有 Pod;drain 会驱逐 Pod,可能中断训练并删除 EmptyDir 等本地数据。GPU 任务通常不能优雅迁移,所以下线前必须确认已有 checkpoint、日志已采集、任务能恢复或重跑,并检查 PDB、本地存储和 finalizer,避免 drain 阻塞或数据丢失。dcgmi diag 与 nccl-tests 通过,且没有新的 Xid 或 ECC 增长。过早 uncordon 会把任务放到尚未完成健康检查的节点,导致再次失败;应完成门禁并记录结果后再上线。
小程序版
微信扫码,随时查命令