优雅下线
使用prestop来达到优雅下线,该字段的作用是在pod终止前,使用自定义的逻辑,在该字段下配置sleep以达到目的
exec
#配置sleep以为pod提供缓冲时间
lifecycle:
preStop:
exec:
command:
- sleep
- ‘5’
#prestop的其他语法格式,仅供参考
#不过需要注意的是,因为这个命令并不是在shell中运行的,所以诸如管道符之类的符号是无法使用的
lifecycle:
preStop:
exec:
command:
[
"/bin/sh",
"-c",
"echo this pod is stopping. > /stop.log && sleep 10s",
]
原理
用户操作重新部署某应用,当新pod就绪后,会去删除旧pod,因为kubelet摘除节点和kube-proxy完成endpoints的同步同时发生在非常短的时间内,如果新的请求到达旧pod、但还未来得及处理完旧pod就被删除,则会导致请求失败
添加prestop,pod在被通知删除后,kube-proxy会先更新endpoints,此时旧pod已经被移除,而后面的新请求将被发给新注册的pod,而旧pod则在prestop配置的命令(也就是此处我们配置的sleep)执行完毕后在删除,这就给那些未完成处理的请求留下了缓冲的时间
pod终止的过程:
删除Pod => Pod被标记为Terminating状态 => Service移除该Pod的endpoint => kubelet筛别Terminating状态的pod,执行pod的preStop钩子 => 如果执行preStop超时(grace period) ,kubelet发送SIGTERM并等待2秒 => ...
评论已关闭