K8s 环境下 RAG 服务配置 GPU 调度主要依赖 NVIDIA Device Plugin 声明资源请求,适用于需要独占或共享 GPU 的推理场景,风险边界在于驱动版本兼容性和显存碎片化。
先说结论:通过 Kubernetes 资源请求机制配合 NVIDIA 插件实现 GPU 分配,重点在于显存隔离与调度策略匹配。
- 适合:RAG 推理服务、Embedding 模型部署
- 先准备:节点安装 NVIDIA 驱动与 Device Plugin
- 验收:Pod 内运行 nvidia-smi 确认显存可见
命令速用版
kubectl describe nodes | grep -i nvidia
kubectl get pods -n kube-system | grep device-plugin为什么会这样
GPU 属于扩展资源,Kubernetes 默认无法感知,必须通过设备插件暴露。
RAG 服务通常包含向量检索与大模型推理,对显存带宽和算力有明确要求。Kubernetes 原生调度器仅支持 CPU 和内存,需借助 NVIDIA Device Plugin 将 GPU 作为扩展资源注册到 API Server。若未正确配置,Pod 会处于 Pending 状态或无法调用 GPU 硬件。
分步处理
步骤 1:确认节点 GPU 状态
适用场景:新集群初始化或扩容节点后。
kubectl describe nodes <node-name> | grep -A 5 "Allocated resources"检查点:输出中应包含 nvidia.com/gpu 资源项。
步骤 2:配置 Pod 资源请求
操作动作:在 Deployment YAML 中添加 resources 字段。
resources:
limits:
nvidia.com/gpu: 1
requests:
nvidia.com/gpu: 1风险边界:请求数量不能超过节点物理 GPU 数量,否则 Pod 无法调度。
步骤 3:设置节点亲和性(可选)
适用场景:集群中存在不同型号 GPU(如 T4 与 A100 混用)。
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: nvidia.com/gpu.product
operator: In
values:
- NVIDIA-A100-SXM4-40GB验证结果:Pod 仅调度到指定型号 GPU 节点。
步骤 4:配置时间切片或 MIG(高级)
操作动作:修改 Device Plugin 配置启用时间切片,或在支持 MIG 的显卡上划分实例。
风险边界:MIG 需要特定驱动版本和显卡型号支持,配置错误会导致设备不可见。
怎么验证是否生效
进入 Pod 内部执行显存检查命令,确认设备可见且无报错。
kubectl exec -it <pod-name> -- nvidia-smi状态判断:命令输出应显示 GPU 型号、显存使用情况及驱动版本,且与宿主机一致。
日志位置:查看 kubelet 日志确认无 Device Plugin 报错。
journalctl -u kubelet | grep -i nvidia常见坑
- 驱动版本不匹配:容器内 NVIDIA 驱动库版本需与宿主机内核模块兼容,建议使用官方基础镜像。
- 资源请求过大:单个 Pod 请求 GPU 数量超过节点剩余量,导致长期 Pending。
- MIG 配置遗漏:启用 MIG 后未重启 Device Plugin,导致新实例无法被识别。
- 污点未容忍:GPU 节点通常带有污点,Pod 需配置相应 tolerations 才能调度。
常见问题
如何在一个 GPU 上运行多个 Pod?
需启用 GPU 时间切片或 MIG 功能。
默认情况下一个 GPU 只能被一个 Pod 独占,通过配置 NVIDIA Device Plugin 的时间切片参数或将 A100/H100 划分为 MIG 实例,可实现多 Pod 共享物理卡。
Pod 一直处于 Pending 状态怎么办?
检查节点资源余量与污点配置。
使用 kubectl describe pod 查看事件,若显示 Insufficient nvidia.com/gpu,说明集群无可用 GPU 资源;若显示 Taint 相关错误,需在 Pod spec 中添加对应的 tolerations。
如何确保 Pod 调度到特定型号 GPU?
使用节点标签与亲和性策略。
NVIDIA Device Plugin 会自动为节点打上 gpu.product 标签,在 Pod spec 中配置 nodeAffinity 匹配该标签值即可锁定硬件型号。
参考来源
- Kubernetes Official Docs, "Manage GPUs as Kubernetes Resources", https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/
- NVIDIA GitHub, "NVIDIA Kubernetes Device Plugin", https://github.com/NVIDIA/k8s-device-plugin