← К программе курса

Модуль 15 / 24

Healthchecks, restart policies и завершение

DOCKER SWARM

Содержание
01

1. Цели и результат модуля

После модуля вы сможете связать healthcheck, restart policy и stop grace period с жизненным циклом task и различать unhealthy, crash и hang.

  • проектировать health probe
  • ограничивать restart attempts
  • наблюдать SIGTERM
  • задавать bounded graceful shutdown
02

2. Теория: healthchecks

Healthcheck выполняется Engine внутри container. start period даёт время запуска, interval задаёт частоту, timeout ограничивает probe, retries определяет порог unhealthy.

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

03

3. Теория: restart policies

Restart condition none, on-failure или any определяет реакцию orchestrator. delay замедляет повтор, max attempts и window ограничивают цикл. Swarm создаёт новый task, а не перезапускает старый task object.

В проверке exit 7 создал три Failed task history entries: исходную попытку и две разрешённые повторные попытки.

04

4. Теория: завершение

При замене task Engine посылает SIGTERM и ждёт stop grace period. Процесс должен прекратить приём работы, завершить запросы и выйти. После срока применяется SIGKILL.

Shell как PID 1 обязан передавать signal или использовать exec. Процесс, игнорирующий TERM, увеличивает update latency и рискует потерять незавершённую работу.

05

5. Методические указания

  • Проверяйте initial healthy до инъекции
  • Меняйте только файл probe тестового task
  • Сопоставляйте task history и application logs
  • Crash loop ограничивайте max attempts
  • Hang тестируйте на одной replica и коротком grace
  • Не путайте Complete после TERM с crash
06

6. Лабораторная работа: healthy baseline

Service создаёт readiness-файл и обрабатывает TERM. Дождитесь State.Health.Status=healthy.

terminal
ssh swarm-manager-3 docker service create --detach=true --name swarm-m15-health --replicas 1 --constraint node.hostname==swarm-manager-1 --health-cmd 'test -f /tmp/healthy' --health-interval 2s --health-timeout 1s --health-retries 2 --health-start-period 1s --restart-condition any --restart-delay 2s --restart-max-attempts 3 alpine:3.22 sh -c 'touch /tmp/healthy; trap "echo received-term; exit 0" TERM; while true; do sleep 1; done'
ssh swarm-manager-1 'id=$(docker ps -q --filter label=com.docker.swarm.service.name=swarm-m15-health); docker inspect "$id" --format "{{json .State.Health}}"'
07

7. Лабораторная работа: unhealthy и замена

Удалите файл. После двух failed probes Swarm завершит старый task через TERM и создаст healthy replacement. Log `received-term` подтверждает graceful path.

terminal
ssh swarm-manager-1 'id=$(docker ps -q --filter label=com.docker.swarm.service.name=swarm-m15-health); docker exec "$id" rm /tmp/healthy'
ssh swarm-manager-3 docker service ps swarm-m15-health --no-trunc
ssh swarm-manager-3 docker service logs --raw swarm-m15-health
08

8. Лабораторная работа: restart budget

Процесс сразу выходит с кодом 7. on-failure разрешает две повторные попытки в window, после чего service остаётся без Running replica вместо бесконечного цикла.

terminal
ssh swarm-manager-3 docker service create --detach=true --name swarm-m15-crash --replicas 1 --constraint node.hostname==swarm-manager-2 --restart-condition on-failure --restart-delay 1s --restart-max-attempts 2 --restart-window 10s alpine:3.22 sh -c 'echo crash; exit 7'
ssh swarm-manager-3 docker service ps swarm-m15-crash --no-trunc
ssh swarm-manager-3 docker service inspect swarm-m15-crash --pretty
09

9. Лабораторная работа: ignored TERM

Task игнорирует TERM, stop grace равен 3s. Forced update ждёт grace, затем заменяет task. Полная команда заняла около 10s вместе с scheduling и monitor.

terminal
ssh swarm-manager-3 docker service create --detach=true --name swarm-m15-hang --replicas 1 --constraint node.hostname==swarm-manager-3 --stop-grace-period 3s alpine:3.22 sh -c 'trap "" TERM; while true; do sleep 1; done'
ssh swarm-manager-3 docker service update --detach=false --force --args 'sh -c "while true; do sleep 1; done"' swarm-m15-hang
ssh swarm-manager-3 docker service ps swarm-m15-hang --no-trunc
terminal
ssh swarm-manager-3 docker service ps swarm-m15-health --no-trunc
ssh swarm-manager-3 docker service logs --raw swarm-m15-health
ssh swarm-manager-1 docker inspect $(ssh swarm-manager-1 docker ps -aq --filter label=com.docker.swarm.service.name=swarm-m15-health)
ssh swarm-manager-1 journalctl -u docker --since today
  • unhealthy — исследуйте probe output
  • exit code — исследуйте process
  • 137 — SIGKILL/OOM требует контекста
  • update stalled — проверяйте grace и termination
10

10. Контроль, критерии освоения и cleanup

  • Что делает start period?
  • Почему healthcheck должен быть локальным?
  • Сколько попыток даёт max attempts?
  • Как task отличается от container restart?
  • Что происходит после grace?
  • Почему shell PID 1 опасен?

Модуль освоен, если вы воспроизводите три failure modes и объясняете историю tasks и signals.

terminal
ssh swarm-manager-3 docker service rm swarm-m15-health swarm-m15-crash swarm-m15-hang
ssh swarm-manager-3 docker service ls
ssh swarm-manager-3 docker node ls