K8s 环境下 RAG 服务如何配置 GPU 资源调度策略?

文章导读
K8s 环境下 RAG 服务配置 GPU 调度主要依赖 NVIDIA Device Plugin 声明资源请求,适用于需要独占或共享 GPU 的推理场景,风险边界在于驱动版本兼容性和显存碎片化。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

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 节点。

K8s 环境下 RAG 服务如何配置 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