k8s pod优雅下线实践
优雅下线的重要性
在Kubernetes中,Pod的优雅下线(Graceful Shutdown)是确保服务无中断的关键环节。当Pod需要终止时,系统会发送SIGTERM信号,预留时间让应用完成未完成的任务、释放资源并拒绝新请求,避免数据丢失或客户端错误。
配置terminationGracePeriodSeconds
在Pod的YAML中定义terminationGracePeriodSeconds,默认30秒。根据应用需求调整,例如设置为60秒:
spec:terminationGracePeriodSeconds: 60
处理SIGTERM信号
应用需捕获SIGTERM信号并执行清理逻辑。以Go为例:
package mainimport ("context""os""os/signal""syscall"
)func main() {ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM)defer stop()<-ctx.Done()// 执行清理逻辑(如关闭数据库连接、等待请求完成)
}
使用preStop钩子
在容器配置中添加preStop钩子,延迟退出或调用健康检查接口:
lifecycle:preStop:exec:command: ["sh", "-c", "sleep 10 && nginx -s quit"]
就绪探针与流量转移
确保就绪探针(readinessProbe)在终止时快速失效,从Service的Endpoints中移除Pod:
readinessProbe:httpGet:path: /healthport: 8080initialDelaySeconds: 5periodSeconds: 2
负载均衡器同步延迟
部分云厂商的负载均衡器存在同步延迟(如AWS ALB约需15秒)。可通过延长terminationGracePeriodSeconds或preStop休眠时间覆盖延迟。
日志与监控
记录下线过程的日志,监控以下指标:
- Pod终止耗时
- 请求失败率
- 资源释放情况
测试验证流程
- 手动删除Pod观察行为:
kubectl delete pod <pod-name> --grace-period=60
- 模拟网络故障强制终止:
kubectl exec <pod-name> -- kill -9 1
- 检查日志是否显示清理逻辑被执行。
