使用 preStop 钩子时,SIGTERM 何时发送到容器中的 Spring Boot 应用程序进程?

Vah*_*hid 1 spring-boot kubernetes

我试图了解如何将流量路由到已开始关闭过程的 Pod。

在 Spring Boot 文档中提到

一旦预停止挂钩完成,SIGTERM 将被发送到容器,并且将开始正常关闭,从而允许完成任何剩余的正在进行的请求。

Kubernetes 容器生命周期

但在 Kubernetes 文档中我们有

Pod 的终止宽限期倒计时在执行 PreStop 挂钩之前开始,因此无论处理程序的结果如何,容器最终都会在 Pod 的终止宽限期内终止。没有参数传递给处理程序。

集装箱挂钩

在 Kubernetes 文档中,它说The Pod's termination grace period countdown begins before the PreStop hook is executed这意味着 SIGTERM 在调用钩子之前发送。这不是和 Spring Boot 所说的矛盾吗Once the pre-stop hook has completed, SIGTERM will be sent to the container

Tho*_*mas 5

它按以下顺序发生:

  1. 终止宽限期倒计时开始
  2. 预停止钩子开始执行
  3. 预停钩完成
  4. 向容器发出 SIGTERM,Spring Boot 开始关闭(如果配置了正常关闭,可能会等待)

如果在任何时间点超过宽限期,则会发出 SIGKILL 并终止所有进程。

  • 明白了,[Hook handlerexecution](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-handler-execution)中提到了该行为 (2认同)