Модуль 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 и не заменяет application healthcheck. Конфликт published port и доступность firewall проверяют отдельно.
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-запроса.
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.
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 площадки.
6. Методические указания
- Зафиксируйте placement до scale
- Уменьшайте только retained demo service и обязательно возвращайте 3/3
- Проверяйте каждый внутренний node отдельной командой
- Сравнивайте PublishMode через inspect
- Ожидаемые host-mode failures фиксируйте без остановки cleanup
- Не публикуйте Swarm control ports
7. Лабораторная работа: mesh с одной replica
Проверьте baseline, уменьшите demo до одной replica и вызовите все три internal 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 router, tunnel health, node published port, service tasks и application 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 и router
- 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