K8s 部署推理服务要点
在 Kubernetes 上跑 GPU 推理服务要处理三件事:节点侧通过 NVIDIA device plugin 把 GPU 暴露成可分配资源、Pod 里按不可压缩资源的方式申请 GPU、给推理服务配好就绪探针与优雅退出。模型加载耗时长的服务尤其要处理探针的初始延迟,否则 Pod 会在启动期间被反复重启。
基本信息
| 资源名 | nvidia.com/gpu(由 device plugin 注册) |
|---|---|
| 申请位置 | 写在 limits 中,属不可压缩资源 |
| 就绪探针 | 决定 Pod 何时接入流量,初始延迟要覆盖模型加载时间 |
| 存活探针 | 决定是否重启容器,阈值过紧会在加载期误杀 |
| 优雅退出 | terminationGracePeriodSeconds 要给正在生成的请求留时间 |
典型使用场景
- 新集群接入 GPU:安装 device plugin 后确认资源出现在节点可分配容量里
- 排查 Pod 一直 Pending:多为 GPU 资源不可调度或数量不足
- 调整探针参数:避免模型加载期间 Pod 被判定失败并反复重启
- 滚动更新:配合优雅退出与就绪探针,让流量平滑切换
- 多副本扩容:副本数受节点 GPU 总量限制,扩容前先确认可分配余量
Pod 资源声明(节选)
Pod 资源声明(节选)
spec:
terminationGracePeriodSeconds: 60 # 给正在生成的请求留退出时间
containers:
- name: vllm
image: vllm/vllm-openai:<版本>
args: ["--model", "/models/<模型>"]
resources:
limits:
nvidia.com/gpu: "1" # 不可压缩资源,必须写在 limits
readinessProbe:
httpGet: { path: /health, port: 8000 }
initialDelaySeconds: 120 # 覆盖模型加载耗时
periodSeconds: 10排查 GPU 不可调度
排查 GPU 不可调度
# 节点可分配资源里有没有 GPU
kubectl get node <节点名> -o json | jq '.status.allocatable["nvidia.com/gpu"]'
# 看调度失败原因(Insufficient nvidia.com/gpu 等)
kubectl describe pod <pod> | tail -20
# 确认 device plugin 组件是否正常
kubectl get pods -A | grep -i device-plugin参数与坑的对应
| 配置项 | 作用 | 设错的后果 |
|---|---|---|
| GPU 资源申请 | 声明需要的卡数 | 只写 requests 或写小数都不生效 |
| 就绪初始延迟 | 等模型加载完成 | 过早接流量,请求大量失败 |
| 存活探针阈值 | 判断进程是否健康 | 加载期被重启,陷入崩溃循环 |
| 优雅退出时间 | 等待在途请求结束 | 滚动更新时请求被直接掐断 |
模型加载耗时长的服务要给足初始延迟:探针在加载期间就判定失败时,Pod 会被反复重启,日志看起来像服务崩溃,实际是探针参数问题。
只有驱动与 device plugin 都就绪,节点才会在可分配资源里暴露 GPU;否则 Pod 会长时间等待资源,表现为调度失败而不是启动失败。