Я пытаюсь понять, как трафик может быть направлен на модуль, который начал процесс выключения.
В документах Spring Boot упоминается, что
Once the pre-stop hook has completed, SIGTERM will be sent to the container and graceful shutdown will begin, allowing any remaining in-flight requests to complete.
Жизненный цикл контейнера Kubernetes
Но в документации Kubernetes у нас есть
The Pod's termination grace period countdown begins before the PreStop hook is executed, so regardless of the outcome of the handler, the container will eventually terminate within the Pod's termination grace period. No parameters are passed to the handler.
В документации 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
?
Это происходит в следующем порядке:
Если в любой момент времени льготный период превышен, выдается сигнал SIGKILL и все процессы завершаются.
Обратный отсчет обрабатывается внутри kubernetes, а не вашим приложением spring.
Да, я знаю. Когда Kubernetes начинает обратный отсчет, он должен отправить SIGTERM. В вашем заказе SIGTERM отправляется после завершения PreStop (#4). Есть пробел! Просто рассмотрим случай, когда в PreStop у нас есть что-то вроде command: ["sh", "-c", "sleep 10"]
. Означает ли это, что SIGTERM не отправляется, потому что он находится в спящем режиме в течение этого времени?
Вы правы, в этом случае сигтерм отправляется на 10 секунд позже, поэтому у приложения остается 20 секунд, если не настроен явный льготный период.
Понятно, поведение упоминается в Выполнение обработчика хука
Как # 1 может произойти, если SIGTERM не отправлен?