← До програми курсу

Модуль 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 має бути швидким і локальним. Залежність від усього зовнішнього світу може спричинити каскадні restart.

03

3. Теорія: restart policies

Restart condition none, on-failure або any визначає реакцію orchestrator. delay, max attempts і window обмежують цикл. Swarm створює новий task.

Exit 7 створив три Failed history entries: початкову та дві повторні спроби.

04

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

Під час заміни Engine надсилає SIGTERM і чекає stop grace period. Процес припиняє приймання роботи та виходить; після строку застосовується SIGKILL.

Shell як PID 1 має передавати signal або використовувати exec.

05

5. Методичні вказівки

  • Підтвердьте healthy до ін’єкції
  • Змінюйте лише probe-файл
  • Зіставляйте task history і logs
  • Обмежуйте crash loop
  • Тестуйте hang на одній replica
  • Не плутайте Complete після TERM із crash
06

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

Service створює readiness-файл і обробляє TERM. Дочекайтеся 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 і створить replacement. `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 дозволяє дві повторні спроби, потім 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, grace дорівнює 3s. Forced update чекає, потім замінює task.

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?
  • Чому probe має бути локальним?
  • Що дає max attempts?
  • Чим task відрізняється від restart?
  • Що після grace?
  • Чому shell PID 1 небезпечний?

Модуль засвоєно, якщо ви відтворюєте три failure modes і пояснюєте history та 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