Когда именно SIGTERM отправляется в процесс приложения Spring Boot в контейнере, когда используется хук preStop?

Я пытаюсь понять, как трафик может быть направлен на модуль, который начал процесс выключения.

В документах 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?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
0
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это происходит в следующем порядке:

  1. Обратный отсчет до начала льготного периода прекращения
  2. Престоп хук начинает выполняться
  3. Хуки Pre Stop готовы
  4. SIGTERM выдается контейнеру, Spring Boot начинает завершение работы (возможно ожидание, если настроено корректное завершение работы)

Если в любой момент времени льготный период превышен, выдается сигнал SIGKILL и все процессы завершаются.

Как # 1 может произойти, если SIGTERM не отправлен?

Vahid 05.04.2022 23:25

Обратный отсчет обрабатывается внутри kubernetes, а не вашим приложением spring.

Thomas 05.04.2022 23:27

Да, я знаю. Когда Kubernetes начинает обратный отсчет, он должен отправить SIGTERM. В вашем заказе SIGTERM отправляется после завершения PreStop (#4). Есть пробел! Просто рассмотрим случай, когда в PreStop у нас есть что-то вроде command: ["sh", "-c", "sleep 10"]. Означает ли это, что SIGTERM не отправляется, потому что он находится в спящем режиме в течение этого времени?

Vahid 05.04.2022 23:40

Вы правы, в этом случае сигтерм отправляется на 10 секунд позже, поэтому у приложения остается 20 секунд, если не настроен явный льготный период.

Thomas 06.04.2022 14:16

Понятно, поведение упоминается в Выполнение обработчика хука

Vahid 06.04.2022 16:31

Другие вопросы по теме