目标:标准化镜像、健康检查、扩缩容与发布流程。
🎯 文章目标
- 提供推理服务容器化与 K8s 编排的最小实践
- 健康检查、资源与调度、扩缩容策略
📚 背景/前置
- 镜像:基础镜像 + 模型/权重;分层缓存
- 编排:Deployment/StatefulSet + Service + HPA
🔧 核心内容
1) 镜像建议
- 固定依赖与模型版本;减小镜像体积
- 入口脚本:拉起引擎、探活接口
2) K8s 健康检查
yaml
livenessProbe:
httpGet: { path: /v1/models, port: 8000 }
readinessProbe:
httpGet: { path: /healthz, port: 8000 }
3) 资源与调度
- requests/limits:CPU/GPU 显存
- nodeSelector/affinity:绑卡/绑机
4) 扩缩容与发布
- HPA:按 QPS/延迟/显存使用率
- 发布:蓝绿/金丝雀;回滚策略
💡 实战示例:容器入口脚本
bash
#!/usr/bin/env bash
python -m vllm.entrypoints.openai.api_server --model Qwen/Qwen2.5-7B-Instruct --port 8000 &
while ! curl -fsSL http://localhost:8000/healthz; do sleep 1; done
exec nginx -g 'daemon off;'
📊 对比/取舍(速查)
- 有状态 vs 无状态:模型加载使其趋向有状态;发布需更谨慎
🧪 踩坑与经验
- 健康检查缺失导致流量打到“未就绪实例”
- 镜像肥大导致发布慢与回滚困难
📎 参考与延伸
- K8s 探针、HPA、Affinity 文档
- 镜像优化与层缓存
💭 总结
- 以“标准镜像 + 探针 + 资源/调度 + HPA + 灰度”稳定生产编排