Модуль 15 / 24
Healthchecks, restart policies и завершение
Содержание
1. Цели и результат модуля
После модуля вы сможете связать healthcheck, restart policy и stop grace period с жизненным циклом task и различать unhealthy, crash и hang.
- проектировать health probe
- ограничивать restart attempts
- наблюдать SIGTERM
- задавать bounded graceful shutdown
2. Теория: healthchecks
Healthcheck выполняется Engine внутри container. start period даёт время запуска, interval задаёт частоту, timeout ограничивает probe, retries определяет порог unhealthy.
Probe должен проверять способность обслуживать работу, быть быстрым и локальным. Он не должен зависеть от всего внешнего мира, иначе каскадная проблема вызовет массовые рестарты.
3. Теория: restart policies
Restart condition none, on-failure или any определяет реакцию orchestrator. delay замедляет повтор, max attempts и window ограничивают цикл. Swarm создаёт новый task, а не перезапускает старый task object.
В проверке exit 7 создал три Failed task history entries: исходную попытку и две разрешённые повторные попытки.
4. Теория: завершение
При замене task Engine посылает SIGTERM и ждёт stop grace period. Процесс должен прекратить приём работы, завершить запросы и выйти. После срока применяется SIGKILL.
Shell как PID 1 обязан передавать signal или использовать exec. Процесс, игнорирующий TERM, увеличивает update latency и рискует потерять незавершённую работу.
5. Методические указания
- Проверяйте initial healthy до инъекции
- Меняйте только файл probe тестового task
- Сопоставляйте task history и application logs
- Crash loop ограничивайте max attempts
- Hang тестируйте на одной replica и коротком grace
- Не путайте Complete после TERM с crash
6. Лабораторная работа: healthy baseline
Service создаёт readiness-файл и обрабатывает TERM. Дождитесь State.Health.Status=healthy.
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}}"'7. Лабораторная работа: unhealthy и замена
Удалите файл. После двух failed probes Swarm завершит старый task через TERM и создаст healthy replacement. Log `received-term` подтверждает graceful path.
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-health8. Лабораторная работа: restart budget
Процесс сразу выходит с кодом 7. on-failure разрешает две повторные попытки в window, после чего service остаётся без Running replica вместо бесконечного цикла.
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 --pretty9. Лабораторная работа: ignored TERM
Task игнорирует TERM, stop grace равен 3s. Forced update ждёт grace, затем заменяет task. Полная команда заняла около 10s вместе с scheduling и monitor.
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-truncssh 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. Контроль, критерии освоения и cleanup
- Что делает start period?
- Почему healthcheck должен быть локальным?
- Сколько попыток даёт max attempts?
- Как task отличается от container restart?
- Что происходит после grace?
- Почему shell PID 1 опасен?
Модуль освоен, если вы воспроизводите три failure modes и объясняете историю tasks и signals.
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