在Kubernetes环境中部署TensorFlow Serving服务时,Pod生命周期管理是关键环节。最近踩坑发现,如果不对Pod的启动和终止过程进行精细化控制,会导致模型服务出现不可预知的错误。
问题场景:使用TensorFlow Serving部署BERT模型服务,通过Helm Chart部署到K8s集群。
核心问题:当进行滚动更新时,新Pod启动后立即开始接受请求,但模型加载需要15-30秒,导致前几次请求超时。同时旧Pod被强制终止时,正在处理的请求会中断。
解决方案:
- 配置StartupProbe:
startupProbe:
httpGet:
path: /v1/models/echo
port: 8501
initialDelaySeconds: 30
periodSeconds: 10
failureThreshold: 6
- 配置ReadinessProbe:
readinessProbe:
httpGet:
path: /v1/models/echo
port: 8501
initialDelaySeconds: 45
periodSeconds: 10
- 设置优雅终止时间:
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 30"]
- Pod重启策略:
restartPolicy: Always
通过以上配置,新Pod启动后会等待模型加载完成再对外提供服务,旧Pod在终止前有充足时间处理完正在的请求。整个更新过程从原来的30秒超时变为5秒内完成。
负载均衡配置: 配合Kubernetes Service使用ClusterIP模式,配合外部负载均衡器实现服务发现和流量分发。

讨论