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

Модуль 10 / 24

Service discovery

DOCKER SWARM

Зміст
01

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

Після модуля ви зможете пояснити вбудований DNS Swarm, порівняти VIP і DNSRR та спостерігати оновлення endpoints після заміни task.

  • розрізняти service name і tasks.<service>
  • читати VIP і набір task IP
  • обирати endpoint mode
  • діагностувати search suffix і stale client DNS
02

2. Теорія: вбудований DNS

Container у user-defined overlay використовує resolver 127.0.0.11. Docker відповідає на імена services у спільній мережі й передає зовнішні запити upstream resolver. Discovery існує лише між endpoints однієї мережі.

Клієнтські search domains можуть змінити запит. Крапка в кінці nslookup позначає абсолютне ім’я і запобігає додаванню mshome.net.

03

3. Теорія: VIP mode

VIP — типовий режим. Ім’я service повертає один virtual IP, а внутрішній load balancer розподіляє з’єднання між здоровими tasks. Адреса tasks.<service> повертає окремі task IP.

VIP приховує churn endpoints від клієнта. Тривале з’єднання залишається прив’язаним до обраного backend.

04

4. Теорія: DNSRR mode

У DNSRR ім’я service повертає набір task IP, а клієнт або зовнішній load balancer обирає endpoint. Endpoint.VirtualIPs відсутній.

DNS TTL і кеш resolver впливають на видалення старої адреси. Застосунок має оновлювати DNS, мати таймаути й повторювати безпечні операції.

05

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

  • Запитуйте DNS із container у тій самій overlay-мережі
  • Порівнюйте абсолютні імена з search suffix
  • Фіксуйте VIP і task IP до відмови
  • Зупиняйте лише task тестового DNSRR service
  • Після reconciliation шукайте зниклу й нову IP
  • Перевіряйте HTTP окремо від DNS
06

6. Лабораторна робота: VIP, DNSRR і client

Створіть спільну мережу, два backend services по три replicas і діагностичний client на manager-2.

terminal
ssh swarm-manager-2 docker network create --driver overlay --attachable swarm-m10-discovery
ssh swarm-manager-2 docker service create --detach=true --name swarm-m10-vip --replicas 3 --network swarm-m10-discovery nginx:1.29-alpine
ssh swarm-manager-2 docker service create --detach=true --name swarm-m10-dnsrr --endpoint-mode dnsrr --replicas 3 --network swarm-m10-discovery nginx:1.29-alpine
ssh swarm-manager-2 docker service create --detach=true --name swarm-m10-client --constraint node.hostname==swarm-manager-2 --network swarm-m10-discovery alpine:3.22 sleep 3600
ssh swarm-manager-2 docker service ls --filter name=swarm-m10
07

7. Лабораторна робота: порівняння відповідей

VIP ім’я має повернути одну адресу, tasks.VIP — три, DNSRR ім’я — три. Перевірений VIP був 10.88.1.2. HTTP підтверджує повний шлях.

terminal
ssh swarm-manager-2 'id=$(docker ps -q --filter label=com.docker.swarm.service.name=swarm-m10-client); docker exec "$id" cat /etc/resolv.conf; docker exec "$id" nslookup swarm-m10-vip.; docker exec "$id" nslookup tasks.swarm-m10-vip.; docker exec "$id" nslookup swarm-m10-dnsrr.; docker exec "$id" wget -qO- http://swarm-m10-vip/ | head -1'
08

8. Лабораторна робота: зміна DNSRR endpoints

Зафіксуйте IP task на manager-1, завершіть container і повторіть запит. У перевірці 10.88.1.9 змінився на 10.88.1.14; історія зберегла exit 137.

terminal
old_ip=$(ssh swarm-manager-1 'id=$(docker ps -q --filter label=com.docker.swarm.service.name=swarm-m10-dnsrr); docker inspect --format "{{(index .NetworkSettings.Networks \"swarm-m10-discovery\").IPAddress}}" "$id"')
ssh swarm-manager-1 'docker kill $(docker ps -q --filter label=com.docker.swarm.service.name=swarm-m10-dnsrr)'
ssh swarm-manager-2 'id=$(docker ps -q --filter label=com.docker.swarm.service.name=swarm-m10-client); docker exec "$id" nslookup swarm-m10-dnsrr.; docker service ps swarm-m10-dnsrr --no-trunc'
09

9. Діагностика

NXDOMAIN перевіряйте за рівнями: спільна network, точне ім’я, search suffix та існування service. Успішний DNS за помилки HTTP переводить пошук до task, порту й застосунку.

terminal
ssh swarm-manager-2 docker service inspect swarm-m10-vip --format '{{json .Endpoint.VirtualIPs}}'
ssh swarm-manager-2 docker service inspect swarm-m10-dnsrr --format '{{json .Endpoint.VirtualIPs}}'
ssh swarm-manager-2 docker network inspect swarm-m10-discovery
ssh swarm-manager-2 docker service ps swarm-m10-dnsrr --no-trunc
  • один IP у VIP — очікувано
  • кілька IP у DNSRR — очікувано
  • tasks.<service> показує endpoints
  • застарілий IP — досліджуйте cache і TTL
10

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

  • Що робить 127.0.0.11?
  • Чим VIP відрізняється від DNSRR?
  • Що повертає tasks.<service>?
  • Навіщо абсолютному імені крапка?
  • Хто балансує DNSRR endpoints?
  • Чому DNS success не гарантує HTTP?

Модуль засвоєно, якщо ви прогнозуєте відповіді, пов’язуєте IP із tasks і спостерігаєте заміну endpoint.

terminal
ssh swarm-manager-2 docker service rm swarm-m10-client swarm-m10-vip swarm-m10-dnsrr
ssh swarm-manager-2 docker network rm swarm-m10-discovery
ssh swarm-manager-2 docker service ls
ssh swarm-manager-2 docker network ls --filter name=swarm-m10