Комментарии 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.
Про вебсокеты интересно. В общем случае мы не знаем сколько времени клиент их может использовать. Если это потоковый обмен с другой системой, то ждать окончания бессмысленно. Самое простое, не давать клиенту гарантий, пусть переподключается сам. Но если дать гарантию хочется, мы же облако, как реализуется неразрываемый вебсокет?
Пару недель назад тоже наткнулся на эту статью на Learnk8s. Очень удивился, что в таком комбайне нужно делать sleep 15 с надеждой, что через это время запросы перестанут идти на завершающийся Под.
Я правильно понимаю, что другого решения не было. Какое-нибудь отслеживание iptables перед отправкой SIGTERM приводило бы к более глубокому пересечению завершающихся и стартующих процессов и это бы съедало бы больше ресурсов. И разработчики k8s решили отдать это решение пользователям.
Корректное завершение работы подов в Kubernetes