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

Модуль 5 / 24

Services, tasks і reconciliation

DOCKER SWARM

Зміст
01

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

Після модуля ви зможете розрізняти service, task і container, читати історію slot та пояснювати, як reconciliation повертає observed state до desired state після відмови або scale.

  • створювати replicated service з явною кількістю replicas
  • зіставляти service slot, task ID і container
  • спостерігати заміну failed task
  • масштабувати desired state вгору і вниз
  • відрізняти локальний restart контейнера від створення нового task
02

2. Теорія: service, task і container

Service — декларація бажаного застосунку: image, replicas, мережі, ресурси та політики. Для replicated service orchestrator створює сталі logical slots. Кожен запуск slot представлений незмінним task. На призначеному node task матеріалізується як container.

Task не перезапускається й не переноситься. Після відмови orchestrator завершує його історію та створює новий task для того самого slot. Тому рядки з відступом у service ps — корисна історія замін, а не зайві containers.

03

3. Теорія: desired state і reconciliation

Manager порівнює desired state сервісу з observed state tasks. Якщо Running replicas менше заданої кількості, scheduler обирає придатний node і створює task. Під час scale up з’являються нові slots; під час scale down зайві slots отримують desired state Shutdown.

Reconciliation асинхронний. Команда зміни може завершитися раніше, ніж container завантажить image і стане Running. Перевіряйте convergence через service ps і service ls, враховуючи Preparing, Starting, Running, Failed та Shutdown.

04

4. Теорія: призначення та заміна

Scheduler враховує availability вузла, platform, constraints, reservations і розподіл уже запущених tasks. Без constraints кілька replicas можуть опинитися на одному node. Один екземпляр на кожному вузлі тут є спостережуваним результатом, але не гарантією replicated mode.

У перевіреній лабораторії примусове завершення container повернуло exit 137. Старий task став Failed, новий task того самого slot перейшов у Running, а сервіс зберіг 3/3 replicas.

05

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

  • Працюйте через manager, а локальні containers досліджуйте на призначеному node
  • До відмови зафіксуйте task ID, slot, node і container ID
  • Зупиняйте лише container тестового сервісу за label
  • Після kill шукайте новий task ID у тому самому slot
  • Не видаляйте історичний рядок: він пояснює причину reconciliation
  • Після scale дочекайтеся повного convergence до наступної зміни
06

6. Лабораторна робота: service і tasks

Створіть три replicas без публікації порту. Зафіксуйте service ID, desired replicas, розподіл slots і незмінний image digest.

terminal
ssh swarm-manager-2 docker service create --detach=true --name swarm-m05-web --replicas 3 nginx:1.29-alpine
ssh swarm-manager-2 docker service ls
ssh swarm-manager-2 docker service ps swarm-m05-web
ssh swarm-manager-2 docker service inspect swarm-m05-web --pretty
07

7. Лабораторна робота: task і container

У перевіреному розміщенні slot на manager-1 був єдиним container сервісу. Фільтр за системним service label виключає сторонні containers. Дослідіть labels, що пов’язують container із service, task і node.

terminal
ssh swarm-manager-1 docker ps --filter label=com.docker.swarm.service.name=swarm-m05-web
ssh swarm-manager-1 docker inspect --format '{{json .Config.Labels}}' $(ssh swarm-manager-1 docker ps --quiet --filter label=com.docker.swarm.service.name=swarm-m05-web)
08

8. Лабораторна робота: відмова та reconciliation

Завершіть container тестового сервісу на manager-1. Потім спостерігайте старий Failed task з exit 137 і новий Running task того самого slot. Загальна кількість готових replicas має повернутися до 3/3.

terminal
ssh swarm-manager-1 docker kill $(ssh swarm-manager-1 docker ps --quiet --filter label=com.docker.swarm.service.name=swarm-m05-web)
ssh swarm-manager-2 docker service ps swarm-m05-web --no-trunc
ssh swarm-manager-2 docker service ls
09

9. Масштабування та діагностика

Збільште desired state до п’яти, дочекайтеся 5/5, потім зменште до двох. Під час scale down очікуються Shutdown tasks: це виконане рішення orchestrator, а не аварія.

terminal
ssh swarm-manager-2 docker service scale swarm-m05-web=5
ssh swarm-manager-2 docker service ps swarm-m05-web
ssh swarm-manager-2 docker service scale swarm-m05-web=2
ssh swarm-manager-2 docker service ps swarm-m05-web

Для завислих або повторно аварійних tasks зіставляйте повну помилку service ps, service spec, локальні containers і журнал Engine.

terminal
ssh swarm-manager-2 docker service inspect swarm-m05-web
ssh swarm-manager-2 docker service ps swarm-m05-web --no-trunc
ssh swarm-manager-1 docker ps --all --filter label=com.docker.swarm.service.name=swarm-m05-web
ssh swarm-manager-1 journalctl -u docker --since today
10

10. Контроль, критерії засвоєння та cleanup

  • Чим service відрізняється від task і container?
  • Чому failed task не перезапускається?
  • Що зберігає identity slot під час заміни?
  • Чому розподіл по одному task на node не гарантований?
  • Як відрізнити штатний Shutdown після scale down і відмову?
  • Які стани показують незавершений convergence?

Модуль засвоєно, якщо ви за service ps відновлюєте ланцюжок заміни, пояснюєте новий task ID у попередньому slot і безпечно змінюєте replicas вгору та вниз.

Видаліть лише service модуля та підтвердьте відсутність його containers і активних Swarm services.

terminal
ssh swarm-manager-2 docker service rm swarm-m05-web
ssh swarm-manager-2 docker service ls
ssh swarm-manager-2 docker node ls