服务器K8s集群GPU算力SRE:从设备插件到监控告警落地
搜索意图判断
搜“服务器K8s集群GPU算力SRE”的人,通常不是想了解概念,而是已经有一台或多台带 GPU 的服务器,准备在 Kubernetes 里把 GPU 用起来,或者已经在用但遇到了调度、监控、稳定性问题。
所以这篇文章按“装得上、跑得对、看得住、查得到”的顺序展开。
适用前提:服务器已装好 Kubernetes 集群(kubeadm 或托管集群均可),节点上有 NVIDIA GPU,操作系统为常见 Linux 发行版。
下面命令默认在 root 或有 sudo 权限的用户下执行。
先确认节点上的 GPU 能不能被系统识别
Kubernetes 自己不认 GPU,它依赖节点上的驱动和容器运行时把 GPU 暴露出来。
第一步不是改 K8s,而是回到宿主机确认驱动正常。
在每台 GPU 节点上执行:
nvidia-smi
预期结果:输出 GPU 型号、驱动版本、显存占用和当前进程列表。
如果提示 command not found,说明 NVIDIA 驱动没装,需要先安装对应驱动,不要急着往下走。
确认驱动后,再看容器运行时是否已配置为 NVIDIA 运行时。
以 containerd 为例,检查配置文件:
cat /etc/containerd/config.toml | grep -A5 nvidia
如果没有任何 nvidia 相关配置,说明 containerd 还没启用 NVIDIA runtime,设备插件即使装了也无法正常分配 GPU。
部署 NVIDIA 设备插件
K8s 官方推荐用 NVIDIA k8s-device-plugin 把 GPU 注册成可调度资源。
最直接的方式是用 DaemonSet 部署,它会自动在每个 GPU 节点上运行。
添加 Helm 仓库并安装:
helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm repo update
helm install nvdp nvdp/nvidia-device-plugin \
--namespace kube-system \
--set tolerations[0].key=CriticalAddonsOnly \
--set tolerations[0].operator=Exists
如果不用 Helm,也可以直接 apply 官方 DaemonSet YAML。
安装完成后检查 Pod 状态:
kubectl get pods -n kube-system | grep nvidia
kubectl logs -n kube-system
预期结果:DaemonSet 的 Pod 在每台 GPU 节点上 Running,日志里能看到注册 GPU 数量的信息。
验证 GPU 是否真的可被调度
插件跑起来不等于能用。
要确认节点上报了 nvidia.com/gpu 资源:
kubectl describe node | grep -A5 Capacity
预期结果:Capacity 和 Allocatable 里出现 nvidia.com/gpu: 1(数量按实际卡数)。
如果这块为空,说明设备插件没注册成功,优先回看上一节的日志。
用一个测试 Pod 验证调度:
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
containers:
- name: cuda
image: nvidia/cuda:12.2.0-base-ubuntu22.04
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1
restartPolicy: Never
kubectl apply -f gpu-test.yaml
kubectl logs gpu-test
预期结果:Pod 调度到 GPU 节点并成功输出 nvidia-smi 内容。
如果 Pod 一直 Pending,用 kubectl describe pod gpu-test 看 Events,常见原因是资源不足或节点未打标签。
把 GPU 算力纳入监控和告警
SRE 的核心不是装完就结束,而是知道 GPU 什么时候出问题。
推荐用 NVIDIA DCGM Exporter 采集指标,再用 Prometheus 抓取、Grafana 展示。
部署 DCGM Exporter(同样以 Helm 为例):
helm repo add gpu-helm-charts https://nvidia.github.io/dcgm-exporter/helm-charts
helm repo update
helm install dcgm-exporter gpu-helm-charts/dcgm-exporter -n monitoring
部署后在 Prometheus 的 targets 页面确认 dcgm-exporter 端点状态为 UP。
常用告警指标:
DCGM_FI_DEV_GPU_UTIL:GPU 利用率,持续高于 95% 可能意味着算力瓶颈。DCGM_FI_DEV_MEM_COPY_UTIL:显存带宽利用率。DCGM_FI_DEV_GPU_TEMP:GPU 温度,超过 85°C 需要关注散热。DCGM_FI_DEV_XID_ERRORS:XID 错误,出现即代表 GPU 层面异常。
一个简单的告警规则示例:
- alert: GPUHighTemperature
expr: DCGM_FI_DEV_GPU_TEMP > 85
for: 5m
labels:
severity: warning
annotations:
summary: "GPU温度过高 {{ $labels.gpu }}"
容易踩的坑
驱动版本和 CUDA 镜像不匹配:业务镜像里的 CUDA 版本不能高于宿主机驱动支持的最高版本,否则容器启动就报错。
选镜像前先看 nvidia-smi 右上角的 CUDA Version。
设备插件装了但节点没资源:先确认 containerd 或 docker 已配置 NVIDIA runtime,再确认插件 Pod 日志无报错。
两个条件缺一不可。
GPU 被多个 Pod 争抢:默认情况下一块 GPU 只能分配给一个 Pod。
如果你需要共享,要额外部署 MIG 或时间片方案,不要直接改 limits 数值,K8s 不会按小数分配 GPU。
重启节点后 GPU 丢失:检查驱动是否开机自启、设备插件 DaemonSet 是否正常拉起。
建议在节点初始化脚本里固化驱动安装和运行时配置,避免手动补。
验证整套流程是否闭环
按下面清单逐项确认,全部通过才算基础 GPU 算力 SRE 落地:
- 每台 GPU 节点
nvidia-smi正常输出。 kubectl describe node能看到nvidia.com/gpu资源。- 测试 Pod 能调度并输出 GPU 信息。
- Prometheus 能抓到 DCGM 指标。
- Grafana 面板能看到利用率和温度曲线。
- 告警规则能在测试环境触发一次。
常见疑问
GPU 节点要不要打污点?
如果集群里既有 CPU 节点又有 GPU 节点,建议给 GPU 节点打 taint,只让明确申请 GPU 的 Pod 调度上去,避免普通业务占满 GPU 节点资源。
一块卡能不能给多个 Pod 用?
原生 K8s 不支持。需要共享时考虑 NVIDIA MIG(把一块卡切成多个实例)或时间片调度方案,配置复杂度会明显上升,建议先评估业务是否真的需要。
监控指标太多,先看哪几个?
优先盯利用率、显存占用、温度和 XID 错误这四项。前三个反映健康度,XID 错误直接对应硬件或驱动异常,出现就要查。
整套流程走完后,你的 K8s 集群就具备了基本的 GPU 算力调度和可观测能力。
后续再根据业务需求补充多卡调度、MIG 切分或成本分摊统计,不要一上来就堆复杂方案。