Pod中有两种关闭模式,一种是强制删除模式,一种是优雅关闭模式。在强制删除模式中,Kubernetes会直接终止容器,导致容器内部的应用程序无法正常退出,这样就会导致数据的丢失和服务之间的异常。而在优雅关闭模式中,Kubernetes会给容器发送SIGTERM信号,在容器内部应用程序完成清理工作之后,发送SIGTERM信号来通知Kubernetes,随后容器才会被正常地关闭。这样可以确保数据没有丢失,而且服务之间也不会出现异常

Pod停止流程

  1. 用户发送命令删除Pod,默认terminationGracePeriodSeconds(宽限期)为30s

  2. Pod会根据宽限期进行更新,同时被标记为Terminating,Service会将Pod从它的Endpoints中移除,同时Replication Controller也会认为Pod不是运行状态,负载均衡也不会再将流量分配到该Pod中

  3. Pod处于Terminating状态时,Kubelet会执行Pod关闭流程,如果Pod定义了preStop的勾子,便在Pod中执行

  4. 当宽限期结束后preStop还在执行时,会给Pod内的进程发送SIGTERM信号(相当于kill pid),增加等待时间是2秒(扩展宽限期),当宽限期结束后任何还在Pod中运行的进程都会被SIGKILL杀死

  5. Kubelet将通过设置宽限期为0(立即删除)来完成删除API服务器上的Pod,Pod从API中消失,客户端也不再可见

Pod停止流程重点:

  • terminationGracePeriodSeconds(宽限期):代表整个Pod停止流程的时间

  • preStop勾子:定义了preStop勾子,关闭Pod时会先执行它

  • SIGTERM信号:如果没有定义preStop勾子,那在关闭Pod时,会直接发送SIGTERM信号。或者是有定义preStop,然而在宽限期结束了,preStop依旧没执行完,那么也会发送SIGTERM信号,并扩展2秒钟的宽限期

  • SIGKILL信号:当时间超过了宽限期,Pod中的所有进程都会被SIGKILL杀死

  • 强制删除Pod:通过kubectl delete命令的--grace-period参数,可以覆盖掉宽限期,设置为0时会强制删除Pod,kubectl版本大于1.5时需增加--force参数

kubectldelete -n namespace po name --force --grace-period=0

优雅关闭服务

想要优雅的停止Pod,可以通过添加preStop勾子,可参考Kubernetes生命周期钩子函数进行设置,值得注意的是terminationGracePeriodSeconds 要设置一个合适的值,至少保证所有现存的request能被正确处理并返回,正常应该大于服务正常停止时间加上preStop的时间

文章作者: 鲜花的主人
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 爱吃可爱多
Kubernetes Kubernetes
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝