美文网首页
k8s服务优雅退出

k8s服务优雅退出

作者: 怀旧的艾克 | 来源:发表于2019-08-21 19:48 被阅读0次

    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几次,发现没有失败的请求了

    相关文章

      网友评论

          本文标题:k8s服务优雅退出

          本文链接:https://www.haomeiwen.com/subject/eazisctx.html