
k8s的prestop主要是用于pod的优雅停止,那么什么是优雅停止呢?
优雅停止(Graceful shutdown)这个说法来自于操作系统,我们执行关机之后都得 OS 先完成一些清理操作,而与之相对的就是硬中止(Hard shutdown),比如拔电源。
到了分布式系统中,优雅停止就不仅仅是单机上进程自己的事了,往往还要与系统中的其它组件打交道。比如说我们起一个微服务,网关把一部分流量分给我们,这时:
按照惯例,SIGKILL 是硬终止的信号,而 SIGTERM 是通知进程优雅退出的信号,因此很多微服务框架会监听 SIGTERM 信号,收到之后去做反注册等清理操作,实现优雅退出。
由于Pod所代表的是在集群中节点上运行的进程,当不再需要这些进程时允许其体面地 终止是很重要的。一般不应武断地使用KILL信号终止它们,导致这些进程没有机会完成清理操作。
设计的目标是令你能够请求删除进程,并且知道进程何时被终止,同时也能够确保删除操作终将完成。当你请求删除某个Pod时,集群会记录并跟踪Pod 体面终止周期, 而不是直接强制地杀死 Pod。在存在强制关闭设施的前提下, kubelet会尝试体面地终止 Pod。
通常情况下,容器运行时会发送一个TERM信号到每个容器中的主进程。 很多容器运行时都能够注意到容器镜像中 STOPSIGNAL 的值,并发送该信号而不是 TERM。 一旦超出了体面终止限期,容器运行时会向所有剩余进程发送 KILL信号,之后Pod就会被从API服务器上移除。如果kubelet或者容器运行时的管理服务在等待进程终止期间被重启, 集群会从头开始重试,赋予 Pod完整的体面终止限期。
Pod退出的流程大致如下:
为了服务做平滑升级或无损发布,我们会通过配置停止前的等待时间的prestop Hook,但是当我们sleep时间较长会发现prestop没有生效,其实pod的停止流程是有说明的
说明: 如果 preStop 回调所需要的时间长于默认的体面终止限期,你必须修改terminationGracePeriodSeconds属性值来使其正常工作。
terminationGracePeriodSeconds默认是30s,当我们的prostop配置的sleep 70s,就会出现pod不会等70s才被销毁,会马上kill掉,那么要怎么要配置才会生效呢?
其实这里只需要将terminationGracePeriodSeconds时长修改比prestop所执行的时间长即可,也就是说你的prestop需要100s执行完成,你的terminationGracePeriodSeconds设置为101s就不会出现不生效的问题。
如何你的prestop想执行多条命令操作,可以参考下面配置
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- /bin/bash
- '-c'
- |-
curl http://www.baidu.com
sleep 70
curl http://www.qq.com原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。