K8s集群GPU显存监控排错:从指标采集到告警修复
K8s集群里的GPU显存监控一旦失效,最直接的表现是Prometheus查不到DCGM_FI_DEV_FB_USED或nvidia_gpu_memory_used_bytes指标,Grafana面板显存曲线断流。
本文按“先确认采集链路,再定位具体断点”的思路,讲清楚从指标暴露到告警触发的完整排错流程。
先确认GPU节点和驱动状态
排错前必须确认节点本身能识别GPU,否则后面所有监控配置都无意义。
在GPU节点上执行:
nvidia-smi -L
正常应输出类似GPU 0: Tesla T4 (UUID: GPU-xxxx)的列表。
如果提示command not found,说明驱动未装或容器内未挂载;
如果显示No devices were found,先排查驱动和内核模块:
lsmod | grep nvidia
nvidia-smi -q | head -20
确认驱动正常后,再检查K8s是否给节点打上了GPU资源标签:
kubectl get nodes -o custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu
GPU列显示数字(如1)才说明device-plugin工作正常。
检查nvidia-exporter或DCGM-exporter是否运行
K8s集群GPU显存监控通常由DaemonSet形式部署的exporter采集。
先用命令确认Pod状态:
kubectl get pods -n monitoring -l app=nvidia-dcgm-exporter -o wide
如果Pod处于CrashLoopBackOff或Pending,按以下顺序排查:
Pending:节点没有可用GPU资源,或DaemonSet的nodeSelector写错。检查kubectl describe pod中的Events。-n monitoring CrashLoopBackOff:进入Pod日志查看具体报错:
kubectl logs -n monitoring --tail=100
常见原因是驱动版本与DCGM版本不匹配,或容器未挂载/dev/nvidia*设备。
确认DaemonSet中是否有:
volumeMounts:
- name: dev
mountPath: /dev
volumes:
- name: dev
hostPath:
path: /dev
缺少设备挂载时,exporter能启动但采集不到任何GPU指标。
验证指标暴露和Prometheus抓取
exporter运行正常后,直接访问它的metrics端点:
kubectl port-forward -n monitoring 9400:9400
curl http://localhost:9400/metrics | grep -i memory
正常应看到类似:
DCGM_FI_DEV_FB_USED{gpu="0",UUID="GPU-xxxx"} 1024
DCGM_FI_DEV_FB_FREE{gpu="0",UUID="GPU-xxxx"} 14848
如果这里没有显存指标,问题在exporter侧;
如果有指标但Prometheus查不到,问题在抓取配置。
检查Prometheus的target状态:
kubectl get servicemonitor -n monitoring
确认ServiceMonitor的selector.matchLabels与exporter Service的标签一致,endpoints.port指向正确端口。
标签不匹配是抓取失败的常见原因。
显存数据异常的典型场景
指标能采集到但数值异常时,按现象区分处理:
- 显存使用量始终为0:容器内进程未实际占用GPU,或nvidia-smi在容器内不可见。检查业务Pod是否挂载了
/dev/nvidia*和NVIDIA_VISIBLE_DEVICES环境变量。 - 显存曲线突然断流:节点重启后exporter未自动恢复,检查DaemonSet的
restartPolicy和节点污点。 - 显存占用持续上涨不释放:可能是业务进程显存泄漏,用
nvidia-smi --query-compute-apps=pid,used_memory --format=csv定位具体进程。 - 告警规则不触发:检查Prometheus告警规则中
expr用的指标名是否与实际暴露的一致,不同exporter版本的指标名可能不同。
避坑要点
驱动版本对齐:DCGM-exporter对驱动版本有要求,版本不匹配时可能采集到部分指标但显存指标缺失。
部署前确认节点驱动版本与exporter镜像的兼容性。
不要只看Pod Running:exporter Pod处于Running状态不代表采集正常,必须实际curl metrics端点验证。
告警阈值要结合卡型:不同GPU卡显存容量差异大,告警阈值建议用百分比而非固定值,避免小显存卡频繁误报。
节点标签要一致:如果集群中只有部分节点有GPU,DaemonSet的nodeSelector或affinity必须准确,否则会在无GPU节点上反复重启。
验证与复查
完成修复后,按以下顺序复查:
nvidia-smi -L确认节点识别GPU。kubectl get pods -n monitoring确认exporter Pod全部Running。curlmetrics端点确认显存指标存在。- Prometheus的Targets页面确认该job状态为UP。
- Grafana面板确认显存曲线恢复且数值与
nvidia-smi输出一致。
五个环节全部通过,才说明K8s集群GPU显存监控链路完整可用。
如果仍有断点,回到对应环节重新检查配置和日志。