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

Модуль 11 / 24

Routing mesh и публикация портов

DOCKER SWARM

Содержание
01

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

После модуля вы сможете сравнить ingress routing mesh и host publication, проследить публичный запрос через Cloudflare и Traefik и выбрать режим под архитектуру ingress.

  • читать Endpoint.Ports и PublishMode
  • доказывать mesh на node без task
  • понимать границы host mode
  • диагностировать внешний и внутренний участки пути
02

2. Теория: target, published и protocol

Target port слушает приложение внутри task. Published port резервируется сервисом на nodes. Protocol выбирают tcp или udp, а publish mode определяет ingress либо host.

Публикация не меняет EXPOSE image и не заменяет application healthcheck. Конфликт published port и доступность firewall проверяют отдельно.

03

3. Теория: routing mesh

В ingress mode каждый node принимает соединение на published port независимо от размещения task. Ingress network и IPVS направляют поток к доступному task. Поэтому node без replica остаётся входной точкой.

Mesh добавляет hop и скрывает фактический backend. Он обеспечивает L4 forwarding, но не маршрутизацию по hostname, TLS termination или retry HTTP-запроса.

04

4. Теория: host mode

В host mode порт слушает только node с task. В лаборатории одна replica на manager-1 дала HTTP 200 на 10.77.0.11 и connection failure на .12/.13.

Host mode полезен внешнему load balancer, который знает реальные endpoints, и global agents. При replicated service нужно предотвращать несколько tasks с одинаковым port на одном node.

05

5. Публичный путь лаборатории

Запрос к swarm-demo.goretskiy.pro проходит Cloudflare, router, Traefik на devops-vm, health-checked SSH tunnel через Windows и один из трёх routing-mesh endpoints 10.77.0.x:18080.

Три VM, туннели и Traefik не устраняют общие failure domains Windows-хоста, router, питания и Internet. Cloudflare 200 доказывает путь запроса, но не физическую HA площадки.

06

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

  • Зафиксируйте placement до scale
  • Уменьшайте только retained demo service и обязательно возвращайте 3/3
  • Проверяйте каждый внутренний node отдельной командой
  • Сравнивайте PublishMode через inspect
  • Ожидаемые host-mode failures фиксируйте без остановки cleanup
  • Не публикуйте Swarm control ports
07

7. Лабораторная работа: mesh с одной replica

Проверьте baseline, уменьшите demo до одной replica и вызовите все три internal endpoints. Все должны ответить, хотя task один. Затем подтвердите публичный HTTPS.

terminal
ssh swarm-manager-2 docker node ls
ssh swarm-manager-2 docker service ls --filter name=swarm-ingress-demo
ssh swarm-manager-2 docker service inspect swarm-ingress-demo --format '{{json .Endpoint.Ports}}'
systemctl is-active swarm-routing-mesh-tunnel@manager-1.service
systemctl is-active swarm-routing-mesh-tunnel@manager-2.service
systemctl is-active swarm-routing-mesh-tunnel@manager-3.service
terminal
ssh swarm-manager-2 docker service scale swarm-ingress-demo=1
ssh swarm-manager-2 docker service ps swarm-ingress-demo
ssh swarm-hyperv-host 'curl.exe --fail --silent --output NUL http://10.77.0.11:18080/'
ssh swarm-hyperv-host 'curl.exe --fail --silent --output NUL http://10.77.0.12:18080/'
ssh swarm-hyperv-host 'curl.exe --fail --silent --output NUL http://10.77.0.13:18080/'
curl --fail --show-error https://swarm-demo.goretskiy.pro/
08

8. Лабораторная работа: host publication

Создайте отдельный service, жёстко размещённый на manager-1. Первый запрос успешен; запросы к .12 и .13 ожидаемо завершаются ненулевым кодом и показывают отсутствие mesh.

terminal
ssh swarm-manager-2 docker service create --detach=true --name swarm-m11-host --replicas 1 --constraint node.hostname==swarm-manager-1 --publish published=18081,target=80,mode=host nginx:1.29-alpine
ssh swarm-manager-2 docker service inspect swarm-m11-host --format '{{json .Endpoint.Ports}}'
ssh swarm-manager-2 docker service ps swarm-m11-host
terminal
ssh swarm-hyperv-host 'curl.exe --max-time 3 --fail --silent --output NUL http://10.77.0.11:18081/'
ssh swarm-hyperv-host 'curl.exe --max-time 3 --silent --output NUL http://10.77.0.12:18081/'
ssh swarm-hyperv-host 'curl.exe --max-time 3 --silent --output NUL http://10.77.0.13:18081/'
09

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

Идите снаружи внутрь: DNS/TLS Cloudflare, router, Traefik router, tunnel health, node published port, service tasks и application logs.

terminal
ssh swarm-manager-2 docker service inspect swarm-ingress-demo --pretty
ssh swarm-manager-2 docker service ps swarm-ingress-demo --no-trunc
ssh swarm-manager-1 ss -lnt
systemctl status swarm-routing-mesh-tunnel@manager-1.service
curl --fail --show-error https://swarm-demo.goretskiy.pro/
  • Cloudflare 52x — проверяйте origin и router
  • Traefik 404 — hostname rule
  • connection refused на одном tunnel — health check должен исключить backend
  • Running task и HTTP 5xx — исследуйте приложение
10

10. Контроль, критерии освоения и cleanup

  • Где слушаются ingress и host ports?
  • Почему node без task отвечает в ingress mode?
  • Что routing mesh не делает на L7?
  • Когда host mode предпочтительнее?
  • Какие общие failure domains остаются?
  • Как отличить Traefik 404 от backend failure?

Модуль освоен, если вы доказываете три ingress endpoints при одной replica, воспроизводите локальность host mode и объясняете публичный путь.

terminal
ssh swarm-manager-2 docker service rm swarm-m11-host
ssh swarm-manager-2 docker service scale swarm-ingress-demo=3
ssh swarm-manager-2 docker service ls
ssh swarm-manager-2 docker node ls