← К программе курса

Модуль 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 отсутствует. Published ingress port с DNSRR имеет ограничения, поэтому архитектуру публикации проектируют отдельно.

DNS TTL и кэш resolver влияют на скорость удаления старого адреса. Приложение должно обновлять DNS, ставить таймауты и повторять безопасные операции.

05

5. Методические указания

  • Запрашивайте DNS из container в той же overlay-сети
  • Сравнивайте абсолютные имена с resolver 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 по service name подтверждает полный путь.

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 и повторите запрос после convergence. В проверке 10.88.1.9 сменился на 10.88.1.14; task history сохранила 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 — исследуйте client 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