Модуль 18 / 24
Ingress, reverse proxy і TLS
Зміст
1. Цілі та результат модуля
Після модуля ви проведете HTTPS-запит через Cloudflare і зовнішній reverse proxy до Swarm service, розрізните рівні балансування та перевірите виключення backend.
- пояснити шлях запиту
- розрізнити edge та origin TLS
- перевірити health check
- повернути endpoint
2. Теорія: шлях запиту
Запит проходить Cloudflare edge, домашній router, Traefik на devops-vm, один із трьох routing mesh endpoints і task. DNS обирає edge, Traefik — node endpoint, mesh доставляє запит task незалежно від розміщення.
Зовнішній HTTP 200 перевіряє шлях, але не кожен backend. Потрібні direct probes і стан service.
3. TLS на edge та origin
Клієнтський сертифікат надає Cloudflare. З’єднання Cloudflare з Traefik — окрема TLS-сесія, залежна від режиму SSL/TLS зони. Client certificate не доводить шифрування origin leg.
Traefik обмежує Host rule шаблоном Swarm, DNS має точний запис. Порти 2377, 7946 і 4789 назовні не публікуються.
4. Reverse proxy та health checks
Traefik перевіряє root URL кожного node endpoint кожні 10 секунд. Недоступний endpoint вилучається і повертається після успішних probes.
Routing mesh приймає port на node без локального task. Proxy перевіряє mesh endpoint, а не container.
5. Методичні вказівки
- Перевірте quorum і три backend
- Зупиняйте один Engine
- Тримайте restore окремо
- Перевіряйте direct і public URL
- Не змінюйте DNS/TLS
- Дочекайтеся Ready і 3/3
6. Лабораторна робота: baseline
Перевірте service spec, tasks і endpoints. Порт 18080 має ingress mode.
ssh swarm-manager-3 docker service inspect swarm-ingress-demo --pretty
ssh swarm-manager-3 docker service ps swarm-ingress-demo
for ip in 10.77.0.11 10.77.0.12 10.77.0.13; do curl --fail --show-error --connect-timeout 3 "http://${ip}:18080/"; done7. Лабораторна робота: публічний HTTPS
Порівняйте HTTP та HTTPS, перегляньте certificate за SNI і журнал Traefik. Команди не розкривають secrets.
curl --fail --show-error --head http://swarm-demo.goretskiy.pro/
curl --fail --show-error --head https://swarm-demo.goretskiy.pro/
openssl s_client -connect swarm-demo.goretskiy.pro:443 -servername swarm-demo.goretskiy.pro </dev/null
docker logs --since 5m traefik8. Лабораторна робота: виключення backend
Зупиніть Engine лише на manager-1. Endpoint .11 не відповідає, .12 і .13 відповідають, п’ять public requests успішні. Помилка першого curl очікувана.
ssh swarm-manager-1 sudo systemctl stop docker
sleep 12
curl --connect-timeout 2 --max-time 4 http://10.77.0.11:18080/
curl --fail --show-error --connect-timeout 3 http://10.77.0.12:18080/
curl --fail --show-error --connect-timeout 3 http://10.77.0.13:18080/
for n in 1 2 3 4 5; do curl --fail --show-error --output /dev/null https://swarm-demo.goretskiy.pro/; done
docker logs --since 2m traefik9. Відновлення та діагностика
Одразу поверніть Engine і перевірте endpoint, cluster state та HTTPS.
ssh swarm-manager-1 sudo systemctl start docker
sleep 15
ssh swarm-manager-3 docker node ls
ssh swarm-manager-3 docker service ls
curl --fail --show-error --connect-timeout 3 http://10.77.0.11:18080/
curl --fail --show-error --output /dev/null https://swarm-demo.goretskiy.pro/- 502/504 — немає origin
- 404 — Host rule не збігся
- TLS error — SNI, certificate або Cloudflare mode
- direct працює, public ні — DNS, router або Traefik
10. Контроль, критерії засвоєння та cleanup
- Які балансувальники беруть участь?
- Чому task не має бути на обраному node?
- Чим edge TLS відрізняється від origin TLS?
- Що перевіряє Traefik?
- Коли виникає 502?
- Чому допустима відмова одного manager?
Модуль засвоєно, якщо один endpoint відмовив без помилок п’яти public requests, а після restore node Ready і service 3/3. Cleanup — відновлений Engine; demo service і route зберігаються.