k8s服务优雅退出

1 检查当前预估服务支持优雅退出

部署预估服务,rollingUpdate,使用Jmeter一直发压力请求

发现会有很多失败的请求

确认当前预估服务不支持优雅退出

2 检查预估服务的框架是否支持优雅退出

当前light4j的版本是1.5.14

发现light4j从1.5.15开始支持graceful shutdown

https://github.com/networknt/light-4j/blob/master/server/src/main/java/com/networknt/server/Server.java

3 更新版本为1.5.15

启动预估服务后,直接给java程序发SIGTERM信号,kill -SIGTERM JAVAPID,发现java程序能够优雅退出

但是通过RollingUpdate,发现java程序没有优雅退出

4 k8s优雅退出步骤

4.0 删除POD

4.1 POD进入Terminating状态

4.2 与此同时,k8s会将POD从对应的service删除

4.3 与此同时,有preStop hook的容器,会先执行preStop hook, 如果preStop hook的时间超出了Grace period,kubelet会发送SIGTERM

4.4 与此同时,没有preStop hook的容器,kubelet发送SIGTERM信号给启动进程

5 Bash Trap 信号

由于预估服务的镜像是通过bash script启动,而不是直接在Dockerfile里面执行java程序,由上面的知识可知,POD删除的时候,kubelet会发送SIGTERM信号给Bash Script进程。

现在会有一个问题,bash是不能传递信号的

所以需要在bash脚本里面捕获信号,并给java程序发SIGTERM信号

6 Lifecycle preStop

通过Bash Trap信号传递给JAVA进程后,发现RollingUpdate操作还是会有失败的请求,压测qps 500的时候,会有20个请求失败,表现为503, connect refuse

分析:

请求持续不断的过来,这个时候进程收到了SIGTERM信号后开始处理没有完成的请求,但是在切流量的过程中,就是kubelet发送SIGTERM信号和把POD从service拿掉的过程中,有一点请求漏过来了

所以需要确保切流量之后,进程收到SIGTERM之前,不要有流量进来。

加上lifecycle preStop

再次测试,RollingUpdate几次,发现没有失败的请求了

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • SIGINT SIGTERM SIGKILL区别 三者都是结束/终止进程运行。 1.SIGINT SIGTERM区...
    go4it阅读 10,261评论 0 3
  • 排错指南 - Pod 本文档介绍 Pod 的异常状态,可能原因和解决办法。 排查 Pod 异常的常用命令如下: 查...
    小孩子的童话2014阅读 11,881评论 0 2
  • 00 前言 微服务部署是一个非常严谨的话题,微服务开发完成需要上线部署,在整个部署过程中怎么保证业务的连续性,怎么...
    rabbitGYK阅读 11,273评论 1 39
  • 有些幸福,果真是天赐的。 前日,陪同好友作家千叶的莲,又去诗人了了村童家故交一聚。莲与我的知己情怀,自我们懵懂爱着...
    曲水修竹阅读 3,003评论 2 1
  • 让爱国的种子在幼小的心灵扎根发芽!
    宕州老马阅读 1,683评论 1 7