Как отправить трафик с Сервиса на Pod, пока Pod находится в льготном периоде завершения - PullRequest
0 голосов
/ 09 мая 2018

У меня есть развертывание (A pods) с подключенными Service и HorizontalPodAutoscaler. Я хочу иметь возможность контролировать процесс уменьшения масштаба и выполнить некоторую очистку перед выключением модуля. Проблема в том, что очистка может занять много времени, и для ее завершения некоторые другие службы (блоки B) должны иметь доступ к модулю, пытающемуся завершить работу.

Для этого я установил для развертывания A длинное значение spec.terminationGracePeriodSeconds. Когда Стручок получает SIGTERM, он начинает заканчивать и закрывать процесс, когда он закончен.

Из точки, в которой модуль A получает SIGTERM, он больше не получает подключения от модуля B, поскольку служба удаляет свой IP из конечной точки, что делает невозможным завершение очистки модулем A модуля.

При использовании служб ClusterIP и Headless оба работают одинаково.

Как я могу заставить службу продолжать отправлять трафик на модуль A даже после того, как он получил SIGTERM? Я не возражаю против запросов от модулей B о получении ошибок при попытке добраться до модулей А.

1 Ответ

0 голосов
/ 09 мая 2018

Нет способа сделать это из-за схемы завершения процесса.

Вот выдержка из документации процесса завершения:

  1. Пользователь отправляет команду на удаление Pod с льготным периодом по умолчанию (30 с)

  2. Стручок на сервере API обновляется временем, после которого Стручок считается «мертвым» вместе с льготным периодом.

  3. Pod отображается как «Завершающий», когда указан в клиентских командах
  4. (одновременно с 3) Когда Kubelet видит, что Pod был отмечен как завершающий, потому что время в 2 было установлено, он начинает процесс выключения pod.

    1. Если модуль определил ловушку preStop, он вызывается внутри модуля. Если ловушка preStop все еще работает после истечения льготного периода, то шаг 2 вызывается с небольшим (2 секунды) продленным льготным периодом.
    2. Процессам в Pod отправляется сигнал TERM.
  5. (одновременно с 3) Модуль удален из списка конечных точек для службы и больше не считается частью набора запущенных модулей для контроллеров репликации. Блоки, которые медленно отключаются, могут продолжать обслуживать трафик, поскольку балансировщики нагрузки (например, прокси-сервер службы) удаляют их из своих вращений.

  6. Когда льготный период истекает, любые процессы, все еще работающие в модуле, уничтожаются с помощью SIGKILL.
  7. Kubelet завершит удаление Pod на сервере API, установив льготный период 0 (немедленное удаление). Pod исчезает из API и больше не виден клиенту.

Таким образом, Pod будет снят с регистрации в Сервисе при разрешении сигнала «SIGTERM», и у вас нет вариантов его избежать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...