Задержка автоматического удаления подов в Kubernetes

Есть ли способ автоматически задерживать все запросы на удаление модуля Kubernetes, чтобы сигнал о снятии с регистрации конечной точки подавался, но SIGTERM модуля задерживался на несколько секунд?

Было бы предпочтительно, но не обязательно, если бы задержка затрагивала только модули с конечной точкой / службой.

Фон:

Это хорошо established, что некоторый трафик может продолжаться к модулю после того, как модуль отправил сигнал завершения SIGTERM из-за асинхронного характера отмены регистрации конечной точки и сигнал удаления. Рекомендуемым смягчением последствий является задержка в несколько секунд в ловушка жизненного цикла preStop модуля путем вызова sleep.

Сложность быстро возникает там, где развертывание модуля может быть выполнено через helm или другой исходный код восходящего потока, или же существует большое количество развертываний и контейнеров, которыми необходимо управлять. Такое изменение многих развертываний может быть трудным или даже невозможным (например, в контейнере может не быть двоичного файла сна, оболочки или чего-либо еще, кроме исполняемого файла приложения).

Я вкратце исследовал изменяющийся контроллер допуска, но кажется неработоспособным динамическое добавление preStop хука, так как все изображения не имеют /bin/sleep или уже имеют preStop, для слияния которых могут потребоваться знания, относящиеся к изображению.

(Конечно, всего этого можно было бы избежать, если бы K8S API синхронизировал отмену регистрации конечной точки с тайм-аутом, чтобы избежать взаимоблокировки (подсказка, подсказка), но я не видел никаких обсуждений такого изменения. Да, существует множество причины, по которым это не синхронно, но это не значит, что что-то нельзя сделать.)


person Eldstone    schedule 22.02.2019    source источник


Ответы (1)


Жизненный цикл Kubernetes состоит из следующих этапов.

  • Pod установлен в состояние «Завершение» и удален из списка конечных точек всех Сервисов.
  • preStop хук выполняется
  • Сигнал SIGTERM отправляется модулю
  • Kubernetes ждет льготного периода, по умолчанию 30 секунд.
  • Сигнал SIGKILL отправляется на модуль, и модуль удаляется.

Льготный период - это то, что вам нужно. Для узла важно, чтобы этот период отсрочки проходил параллельно с обработчиком preStop и сигналом SIGTERM.

Вызов ловушки preStop завершается ошибкой, если контейнер уже находится в состоянии завершения или завершения. Это блокирующий, то есть синхронный, поэтому он должен завершиться перед отправкой вызова на удаление контейнера.

Здесь вы можете узнать больше о хуках жизненного цикла контейнера.

Так, например, вы можете установить terminationGracePeriodSeconds: 90, и это может выглядеть следующим образом:

spec: 
   terminationGracePeriodSeconds: 90
   containers:
       - name: myApplication

Вы можете прочитать документацию Kubernetes относительно прекращения работы подов. Я также рекомендую отличную запись в блоге Лучшие практики Kubernetes: завершение с изяществом.

person Crou    schedule 03.04.2019
comment
Да, я понимаю параметр terminationGracePeriod - это общий тайм-аут для завершения выключения. Я хочу отложить первоначальное выключение всех модулей хотя бы на несколько секунд. Я не предвижу необходимости изменять льготный период для большинства модулей, если я пытаюсь добавить начальную задержку, эквивалентную preStop, равную (скажем) 8 секундам. - person Eldstone; 26.04.2019
comment
Также Kubernetes не дожидается завершения хука preStop. - Не могли бы вы указать источник этой информации? - person Vusal; 18.06.2020
comment
@Vusal, большое спасибо, что указали на это. Я отредактировал ответ, чтобы отразить текущие документы. - person Crou; 18.06.2020