Модуль 10 / 24
Service discovery
Зміст
1. Цілі та результат модуля
Після модуля ви зможете пояснити вбудований DNS Swarm, порівняти VIP і DNSRR та спостерігати оновлення endpoints після заміни task.
- розрізняти service name і tasks.<service>
- читати VIP і набір task IP
- обирати endpoint mode
- діагностувати search suffix і stale client DNS
2. Теорія: вбудований DNS
Container у user-defined overlay використовує resolver 127.0.0.11. Docker відповідає на імена services у спільній мережі й передає зовнішні запити upstream resolver. Discovery існує лише між endpoints однієї мережі.
Клієнтські search domains можуть змінити запит. Крапка в кінці nslookup позначає абсолютне ім’я і запобігає додаванню mshome.net.
3. Теорія: VIP mode
VIP — типовий режим. Ім’я service повертає один virtual IP, а внутрішній load balancer розподіляє з’єднання між здоровими tasks. Адреса tasks.<service> повертає окремі task IP.
VIP приховує churn endpoints від клієнта. Тривале з’єднання залишається прив’язаним до обраного backend.
4. Теорія: DNSRR mode
У DNSRR ім’я service повертає набір task IP, а клієнт або зовнішній load balancer обирає endpoint. Endpoint.VirtualIPs відсутній.
DNS TTL і кеш resolver впливають на видалення старої адреси. Застосунок має оновлювати DNS, мати таймаути й повторювати безпечні операції.
5. Методичні вказівки
- Запитуйте DNS із container у тій самій overlay-мережі
- Порівнюйте абсолютні імена з search suffix
- Фіксуйте VIP і task IP до відмови
- Зупиняйте лише task тестового DNSRR service
- Після reconciliation шукайте зниклу й нову IP
- Перевіряйте HTTP окремо від DNS
6. Лабораторна робота: VIP, DNSRR і client
Створіть спільну мережу, два backend services по три replicas і діагностичний client на manager-2.
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-m107. Лабораторна робота: порівняння відповідей
VIP ім’я має повернути одну адресу, tasks.VIP — три, DNSRR ім’я — три. Перевірений VIP був 10.88.1.2. HTTP підтверджує повний шлях.
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'8. Лабораторна робота: зміна DNSRR endpoints
Зафіксуйте IP task на manager-1, завершіть container і повторіть запит. У перевірці 10.88.1.9 змінився на 10.88.1.14; історія зберегла exit 137.
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'9. Діагностика
NXDOMAIN перевіряйте за рівнями: спільна network, точне ім’я, search suffix та існування service. Успішний DNS за помилки HTTP переводить пошук до task, порту й застосунку.
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. Контроль, критерії засвоєння та cleanup
- Що робить 127.0.0.11?
- Чим VIP відрізняється від DNSRR?
- Що повертає tasks.<service>?
- Навіщо абсолютному імені крапка?
- Хто балансує DNSRR endpoints?
- Чому DNS success не гарантує HTTP?
Модуль засвоєно, якщо ви прогнозуєте відповіді, пов’язуєте IP із tasks і спостерігаєте заміну endpoint.
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