Kubernetes не ждет, пока все соединения websocket закрываются, прежде чем завершиться во время обновления обновления - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь достичь 0 времени простоя при обновлении с помощью EKS (сервис AWS K8s).

У меня есть один сервер WebSocket, и я хочу убедиться, что во время непрерывного обновления этого сервера существующие соединения будут сохраняться до тех пор, пока WebSockets не будут закрыты после завершения работы.

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

Если я правильно понимаю документ , то завершение модуля будет выглядеть так:

  1. Пользователь сигнализирует об удалении модуля в API K8s
  2. K8s прекращает маршрутизацию нового трафика на этот модуль и отправляет сигнал SIGTERM
  3. Приложение ДОЛЖНО обработать этот сигнал и начать постепенное завершение самого себя в указанный grace-period (по умолчанию 30 с)
  4. После этого K8s посылает сигнал SIGKILL, чтобы принудительно завершить работу модуля.

Если мое понимание выше верно, ясно, что нет никакого способа сказать K8s:

  1. Не прерывать текущие соединения
  2. Пусть они бегут столько, сколько им нужно (они в конце концов закроются, но период сильно меняется)
  3. Как только все соединения закрыты, завершите работу модуля

Вопрос : Есть ли какие-либо способы убедиться, что K8s:

  1. Не прерывает соединение с WebSocket
  2. Не заставляет приложение прерывать соединение в определенном grace-period
  3. Обнаруживает, когда все соединения WebSocket закрыты, и уничтожает модуль

Если кто-нибудь сможет мне помочь, это будет очень признательно.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Для критически важных приложений перейдите к настроенным сине-зеленым развертываниям.

Сначала разверните развертывание новой версии с новым селектором, а когда все реплики POD включены и готовы к обслуживанию трафика, переключите селектор службы, чтобы указать на развертывание новой версии.

После этого отправьте переключатель kill на более старую версию, которая корректно обрабатывает и отключает все клиенты. Таким образом, все новые переподключения перенаправляются в новую версию, которая уже настроена для обслуживания трафика.

0 голосов
/ 12 апреля 2019

Вы можете использовать lifecycle hook в жизненном цикле pubernetes pod с preStop hook.Этот крюк будет запущен непосредственно перед окончанием вашего стручка.

lifecycle:
  postStart:
    exec:
      command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
  preStop:
    exec:
      command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]

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

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