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

Модуль 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 і не замінює healthcheck. Конфлікт порту та firewall перевіряють окремо.

03

3. Теорія: routing mesh

В ingress mode кожен node приймає з’єднання на published port незалежно від task placement. Ingress network та IPVS спрямовують потік до доступного task.

Mesh додає hop і приховує backend. Він дає L4 forwarding, але не hostname routing, TLS termination або HTTP retry.

04

4. Теорія: host mode

У host mode порт слухає лише node із task. Одна replica на manager-1 дала HTTP 200 на 10.77.0.11 і failure на .12/.13.

Host mode корисний зовнішньому load balancer, що знає endpoints, і global agents. Для replicas запобігайте конфлікту однакового порту на node.

05

5. Публічний шлях лабораторії

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

Ця схема не усуває спільні failure domains Windows-хоста, router, живлення та Internet.

06

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

  • Зафіксуйте placement до scale
  • Зменшуйте лише retained demo і повертайте 3/3
  • Перевіряйте кожен node окремо
  • Порівнюйте PublishMode через inspect
  • Очікувані host failures не повинні зупинити cleanup
  • Не публікуйте control ports
07

7. Лабораторна робота: mesh з однією replica

Перевірте baseline, зменште demo до однієї replica та викличте три 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, tunnel health, published port, tasks та 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
  • 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