Как стать автором
Обновить

Комментарии 6

Начиная с Kubernetes 1.30 больше не нужно вызывать команду `sleep N` в контейнере и хранить бинариник sleep для preStop hook: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/

lifecycle:
  preStop:
    sleep:
      seconds: 15

Кстати, использовать лучше не command: ["sleep", "15"] , а что-то вида `/bin/sh -c /bin/sleep 15` т.к. не во всех образах корректно задана переменная $PATH

Дополнительно: Если используете HPA, уберите секцию replicas из ваших Deployment: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/#migrating-deployments-and-statefulsets-to-horizontal-autoscaling (как альтернативное решение: выставьте replicas в максимальный лимит реплик HPA)

Спасибо за дополнение!

K8s создаст первый новый под и завершит работу старого.

Уточнение - пошлет сигнал SIGTERM.

Про вебсокеты интересно. В общем случае мы не знаем сколько времени клиент их может использовать. Если это потоковый обмен с другой системой, то ждать окончания бессмысленно. Самое простое, не давать клиенту гарантий, пусть переподключается сам. Но если дать гарантию хочется, мы же облако, как реализуется неразрываемый вебсокет?

КМК разумно будет использовать gateway между пользовательским приложением и подом, обслуживающим вебсокеты. Пусть клиентское подключения на себе терминирует именно gateway.
Так получится сделать прозрачное для клиента переключение между подами.

Пару недель назад тоже наткнулся на эту статью на Learnk8s. Очень удивился, что в таком комбайне нужно делать sleep 15 с надеждой, что через это время запросы перестанут идти на завершающийся Под.

Я правильно понимаю, что другого решения не было. Какое-нибудь отслеживание iptables перед отправкой SIGTERM приводило бы к более глубокому пересечению завершающихся и стартующих процессов и это бы съедало бы больше ресурсов. И разработчики k8s решили отдать это решение пользователям.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий