使用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秒 => ...

标签: none

评论已关闭