Модуль 11 / 24
Routing mesh і публікація портів
Зміст
1. Цілі та результат модуля
Після модуля ви зможете порівняти ingress routing mesh і host publication, простежити публічний запит через Cloudflare та Traefik і обрати режим для ingress.
- читати Endpoint.Ports і PublishMode
- доводити mesh на node без task
- розуміти межі host mode
- діагностувати зовнішні та внутрішні ділянки
2. Теорія: target, published і protocol
Target port слухає застосунок усередині task. Published port резервується сервісом на nodes. Protocol обирає tcp або udp, а publish mode — ingress чи host.
Публікація не змінює EXPOSE image і не замінює healthcheck. Конфлікт порту та firewall перевіряють окремо.
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.
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.
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.
6. Методичні вказівки
- Зафіксуйте placement до scale
- Зменшуйте лише retained demo і повертайте 3/3
- Перевіряйте кожен node окремо
- Порівнюйте PublishMode через inspect
- Очікувані host failures не повинні зупинити cleanup
- Не публікуйте control ports
7. Лабораторна робота: mesh з однією replica
Перевірте baseline, зменште demo до однієї replica та викличте три endpoints. Усі мають відповісти, хоча task один. Потім перевірте публічний HTTPS.
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.servicessh 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/8. Лабораторна робота: host publication
Створіть service на manager-1. Перший запит успішний; .12 і .13 очікувано повертають ненульовий код, показуючи відсутність mesh.
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-hostssh 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/'9. Діагностика
Рухайтеся ззовні всередину: DNS/TLS Cloudflare, router, Traefik, tunnel health, published port, tasks та logs.
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. Контроль, критерії засвоєння та cleanup
- Де слухають ingress і host ports?
- Чому node без task відповідає в ingress mode?
- Чого routing mesh не робить на L7?
- Коли host mode кращий?
- Які спільні failure domains залишаються?
- Як відрізнити Traefik 404 від backend failure?
Модуль засвоєно, якщо ви доводите три ingress endpoints за однієї replica, відтворюєте локальність host mode та пояснюєте публічний шлях.
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