K8s 部署 AI 推理服务检查:GPU、探针、镜像和回滚
环境说明本文记录一次 AI 推理服务上 K8s 前的检查流程示例以 vLLM 服务为主。目标不是讲模型调参而是解决上线前常见的运行环境问题Pod 长时间 Pending ImagePullBackOff ContainerCreating 卡住 探针失败导致容器重启 GPU 利用率不稳定 回滚路径不清楚排查顺序镜像依赖 - GPU 节点 - 资源声明 - 探针 - 日志指标 - 回滚1. 先验证关键镜像推理服务通常涉及多个镜像vLLM、CUDA 基础环境、监控组件等。先单独验证镜像避免把镜像问题和 GPU 调度问题混在一起。dockerpull docker.1ms.run/vllm/vllm-openai:latestdockerpull docker.1ms.run/nvidia/cuda:12.4.1-runtime-ubuntu22.04dockerpull docker.1ms.run/prom/prometheus:latest这一步只确认依赖能进入当前环境。镜像通过以后再继续看 GPU 和 Pod 事件。2. 创建 namespaceapiVersion:v1kind:Namespacemetadata:name:ai-infer应用推理服务时kubectl apply-fnamespace.yaml3. Deployment 示例下面是一个最小化示例真实环境需要替换模型目录、参数和资源限制。apiVersion:apps/v1kind:Deploymentmetadata:name:llm-apinamespace:ai-inferspec:replicas:1selector:matchLabels:app:llm-apitemplate:metadata:labels:app:llm-apispec:nodeSelector:accelerator:nvidiacontainers:-name:vllmimage:docker.1ms.run/vllm/vllm-openai:latestargs:---model-/models/qwen---host-0.0.0.0---port-8000ports:-containerPort:8000resources:limits:nvidia.com/gpu:1startupProbe:httpGet:path:/healthport:8000failureThreshold:60periodSeconds:5readinessProbe:httpGet:path:/healthport:8000initialDelaySeconds:20periodSeconds:10livenessProbe:httpGet:path:/healthport:8000initialDelaySeconds:120periodSeconds:20volumeMounts:-name:model-dirmountPath:/modelsvolumes:-name:model-dirpersistentVolumeClaim:claimName:qwen-model-pvc关键点nodeSelector约束到 GPU 节点。resources.limits明确申请 GPU。startupProbe给模型加载留时间。模型目录放在 PVC不建议把大模型权重塞进应用镜像。4. Pod Pending 排查kubectl-nai-infer get pod-lappllm-api kubectl-nai-infer describe pod-lappllm-api kubectl getnode-Laccelerator常见事件事件可能原因处理方向Insufficient nvidia.com/gpuGPU 资源不足看节点资源和现有 Pod 占用node(s) didnt match node selector标签不匹配检查节点标签ImagePullBackOff镜像拉取失败检查镜像地址和网络FailedMount模型 PVC 问题检查 PVC/PV 和权限5. 镜像问题排查如果看到ImagePullBackOffkubectl-nai-infer describe pod-lappllm-apidockerpull docker.1ms.run/vllm/vllm-openai:latest如果节点能拉Pod 不能拉再看 imagePullSecrets、运行时配置和节点网络。6. 探针失败排查如果容器反复重启kubectl-nai-infer logs deploy/llm-api--previouskubectl-nai-infer describe pod-lappllm-api大模型服务冷启动时间长探针不能按普通 Web 服务配置。建议拆分探针作用startupProbe给模型加载和 GPU 初始化留时间readinessProbe控制什么时候接流量livenessProbe判断服务是否需要重启7. GPU 状态检查节点上看 GPUnvidia-smiK8s 侧看资源kubectltoppod-nai-infer kubectl-nai-infer logs deploy/llm-api--tail120如果 GPU 利用率低但请求延迟高需要继续看请求是否排队。batch 参数是否合理。模型是否真正加载到 GPU。是否有 CPU fallback。是否被 readiness 提前接流量。8. 回滚检查kubectl-nai-infer rollout status deploy/llm-api kubectl-nai-infer rollouthistorydeploy/llm-api kubectl-nai-infer rollout undo deploy/llm-api推理服务回滚要同时确认镜像版本 模型权重版本 启动参数 Service 路由 监控告警只回滚 Deployment不回滚模型目录可能会留下隐藏问题。9. 上线前检查清单镜像能单独拉取 GPU 节点标签明确 Pod 明确申请 GPU 模型目录可挂载 startupProbe 留足冷启动时间 readinessProbe 不提前接流量 livenessProbe 不误杀服务 日志能看到模型加载和错误 GPU 利用率和请求延迟能对应 Deployment 回滚已验证总结AI 推理服务上 K8s不能只看 Pod 是否 Running。GPU 是昂贵资源模型服务启动慢、探针误杀、调度不清楚、回滚没验证都会放大上线风险。建议上线前先按“镜像依赖、GPU 节点、资源声明、探针、日志、回滚”做一次体检。镜像只是第一层真正决定稳定性的是后面这些工程边界。