多实例推理服务无感升级指导
场景描述
服务的滚动升级或重启操作必须尽可能避免对正在处理的业务请求造成影响。为实现无感知切换流量,采用 Kubernetes 的 Readiness 探针机制,确保在 Pod 进入终止流程前,先将其从服务负载均衡中优雅“摘流”,待已有请求处理完成后,再安全终止 Pod。
整体流程
为最大限度减少服务中断,确保业务连续性,将采用逐实例滚动升级策略进行无感升级。整体流程如下:
- 删除一个旧版本的 KubeInfer 实例;
- 部署或扩容一个新版本的 KubeInfer 实例;
- 待新实例健康检查通过并稳定运行后,继续下一轮操作;
- 重复上述过程,逐个替换剩余旧实例,每次仅升级一个实例。
该策略以单实例为粒度进行替换,确保集群中始终有足够的服务实例处理请求,从而实现平滑升级,避免对线上业务造成显著影响。
操作指导
- 执行以下命令获取实例role0的Pod IP。
kubectl get pod -owide
查询结果示例
- 在配置的save_path健康检查日志路径,默认为脚本所在路径的health_log目录下,例如/mnt/deepseek/deploy/health_log/,添加status.json文件,并将role0的Pod IP写入。文件内容参考如下:
{"POD_IP": "192.168.0.22"}
- 等待role0的Pod状态为非就绪,该Instance状态会变成Concerning。
- 执行以下命令查看实例Pod日志,直到确认没有新的流量进入该实例,并且已经进入的请求全部处理完毕。
kubectl logs -f ${POD_NAME}
- 参考扩缩容推理服务(可选),对KubeInfer副本数减1,会优先删除状态为Concerning的Instance,达到删除指定实例的效果。
- 指定实例删除完成之后,准备一份变更后的部署推理服务的yaml文件,并重新部署推理服务。
kubectl apply -f infer_vllm_kubeinfer.yaml
- 执行下述命令获取 Service 的 ”CLUSTER-IP”。
kubectl get svc
- 手动测试推理API,确认业务已恢复。
curl -ik -H 'Content-Type: application/json' -d '{"messages":[{"role":"user","content":"hello"}],"model":"deepseek","temperature":0.6,"max_tokens":1024}' -X POST http://${CLUSTER-IP}:9000/v1/chat/completions
- 重命名或删除status.json文件,并查看实例状态,直到所有实例状态为就绪。
- 查看实例日志,观察是否有流量接入。