Kubernetes 在副本集倒计时中使用 TERM 信号。
这对我的应用程序来说非常危险。
我使用 Tomcat 应用程序服务器,该应用程序服务器有自己的关闭机制来终止应用程序服务器。
当我向 jvm 发送操作系统(Linux)信号(9,15,...)时,JVM 不知道如何处理 jvm 内的线程,因此线程在成功完成之前被杀死。
Request -----> BackEnd API -----> [Process] -----> Response
^
Send TERM (Signal) while thread doing Process
有没有办法改变kubernetes容器关闭机制?
我想要 kubernetes 使用:
catalina.sh stop
答案1
实现此目的的一种方法是使用 dumb-init。
构建容器时,dumb-init 通常是一个很好的做法,可以处理僵尸等问题。在您的情况下,它还允许重新映射信号。
在你的 Dockerfile 中,你会有类似的内容
CMD ["dumb-init", "--rewrite", "15:28", "/app/start.sh"]
查了一下kill -l
,SIGINT
应该是号码15
。
然后,在您的启动脚本中,您可以捕获SIGWINCH
( 28
) 信号:
#!/bin/sh
trap "cd /app ; catalina.sh stop" SIGWINCH
[your startup script]
exec $JAVA_HOME/bin/java ...
编辑,我可以看到另一个答案被接受:当然,容器生命周期挂钩听起来不错。
一方面,它们已经存在大约一年了:可能无法使用,具体取决于您的集群版本。
然后,您会意识到它们仅在 API 驱动的终止上运行,这可能是一个问题。
答案2
Kubernetes 生命周期是解决此类问题的良好解决方案:
容器生命周期挂钩