k8s服务优雅退出

k8s服务优雅退出,第1张

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

发现会有很多失败的请求

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

当前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

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

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

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信号给启动进程

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

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

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

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

分析:

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

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

加上lifecycle preStop

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

线程池是系统资源,这篇文章主要介绍如何优雅关闭线纯罩毕程池

相关API:

Runtime.addShutdownHook解释

如果你想在jvm关闭的时候进行内存清理、对象销毁等 *** 作,或者仅仅想起个线程然后这个线程不会退出,你可以使用Runtime.addShutdownHook。

这个方法的作用就做芹是在JVM中增加一个关闭的钩子。当程序正常退出、系统调用 System.exit方法或者虚拟机被关闭时才会执行系统中已经设置的所有钩子,当系统执行完这些钩子后,JVM才会关闭。所谓钩子,就是一个已初始化但并不启动的线程。JVM退出通常通过两种事件。

程序正常退出,例如最后一个非守护进程退出、使用System.exit()退出等

程序异常退出,例如使用Ctrl+C触发的中断、用户退出或系统关闭等系统事件等 , 详情见官方文档:https://docs.oracle.com/javase/8/docs/api/index.html

Guava解释

google退出的open sdk,提供多类并发api。

上两篇文章讲了@Configuration @Bean @Import注入线程池Bean,还有ApplicationRunner 和 CommandLineRunner接口去实现容器启动完成事件驱动,所以结合起来举个例子,在项目中如何注入、优雅关闭线程池。

如上图。

1.通过@Configuration @Bean注解去注入一个线程池<componentThreadPool>。

2.将线程池注册到注册中心<ThreadPoolRegistrationCenter>

3.在Spring容器启动完成观察者模式中,利用ApplicationRunner接口提供的run方法,添加jvm hook钩子,以做到jvm退出时能够优雅关闭线程池闷雹。

其中用到了guava的<MoreExecutors.shutdownAndAwaitTermination>,jdk<Runtime.getRuntime().addShutdownHook>等API


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12434422.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存