说一个最近遇到的坑吧
我们一个测试服务,Spring Cloud 的,在下线后,节点无法从注册中心摘除,然后百思不得其解,最后查到问题,,
本质上是这样,POD 被摘除的时候,K8S Scheduler 会给 POD 的 ENTRYPOINT 发一个 SIGTERM 信号,然后等待三十秒(默认的 graceful shutdown 超时实践),还没响应就会 SIGKILL 直接杀
问题在于,我们 Eureka 版的服务是通过 start.sh 来启动的,ENTRYPOINT ["/home/admin/start.sh"],容器里默认是 /bin/sh 是 fork/exec 模式,导致我服务进程没法正确的收到 SIGTERM 信号,然后一直没结束就被 SIGKILL 了
解决方法其实很简单在 Deployment 上加了一个 lifestyle 中 pre stop 的hook。
pid=$(ps aux | grep spring | grep -v grep | awk '{print $2}')
kill -TERM $pid
然后在框架里捕获事件,在Eureka 上下线
当然在容器中的东西,还是建议用 exec 来做启动。。。不然后患无穷。。
我们一个测试服务,Spring Cloud 的,在下线后,节点无法从注册中心摘除,然后百思不得其解,最后查到问题,,
本质上是这样,POD 被摘除的时候,K8S Scheduler 会给 POD 的 ENTRYPOINT 发一个 SIGTERM 信号,然后等待三十秒(默认的 graceful shutdown 超时实践),还没响应就会 SIGKILL 直接杀
问题在于,我们 Eureka 版的服务是通过 start.sh 来启动的,ENTRYPOINT ["/home/admin/start.sh"],容器里默认是 /bin/sh 是 fork/exec 模式,导致我服务进程没法正确的收到 SIGTERM 信号,然后一直没结束就被 SIGKILL 了
解决方法其实很简单在 Deployment 上加了一个 lifestyle 中 pre stop 的hook。
pid=$(ps aux | grep spring | grep -v grep | awk '{print $2}')
kill -TERM $pid
然后在框架里捕获事件,在Eureka 上下线
当然在容器中的东西,还是建议用 exec 来做启动。。。不然后患无穷。。