Модуль 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 має бути швидким і локальним. Залежність від усього зовнішнього світу може спричинити каскадні restart.
3. Теорія: restart policies
Restart condition none, on-failure або any визначає реакцію orchestrator. delay, max attempts і window обмежують цикл. Swarm створює новий task.
Exit 7 створив три Failed history entries: початкову та дві повторні спроби.
4. Теорія: завершення
Під час заміни Engine надсилає SIGTERM і чекає stop grace period. Процес припиняє приймання роботи та виходить; після строку застосовується SIGKILL.
Shell як PID 1 має передавати signal або використовувати exec.
5. Методичні вказівки
- Підтвердьте healthy до ін’єкції
- Змінюйте лише probe-файл
- Зіставляйте task history і logs
- Обмежуйте crash loop
- Тестуйте hang на одній replica
- Не плутайте Complete після TERM із crash
6. Лабораторна робота: healthy baseline
Service створює readiness-файл і обробляє TERM. Дочекайтеся 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 і створить replacement. `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 дозволяє дві повторні спроби, потім 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, grace дорівнює 3s. Forced update чекає, потім замінює task.
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?
- Чому probe має бути локальним?
- Що дає max attempts?
- Чим task відрізняється від restart?
- Що після grace?
- Чому shell PID 1 небезпечний?
Модуль засвоєно, якщо ви відтворюєте три failure modes і пояснюєте history та 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