说一个最近遇到的坑吧

我们一个测试服务,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 来做启动。。。不然后患无穷。。
 
 
Back to Top