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

Модуль 18 / 24

Ingress, reverse proxy і TLS

DOCKER SWARM

Зміст
01

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

Після модуля ви проведете HTTPS-запит через Cloudflare і зовнішній reverse proxy до Swarm service, розрізните рівні балансування та перевірите виключення backend.

  • пояснити шлях запиту
  • розрізнити edge та origin TLS
  • перевірити health check
  • повернути endpoint
02

2. Теорія: шлях запиту

Запит проходить Cloudflare edge, домашній router, Traefik на devops-vm, один із трьох routing mesh endpoints і task. DNS обирає edge, Traefik — node endpoint, mesh доставляє запит task незалежно від розміщення.

Зовнішній HTTP 200 перевіряє шлях, але не кожен backend. Потрібні direct probes і стан service.

03

3. TLS на edge та origin

Клієнтський сертифікат надає Cloudflare. З’єднання Cloudflare з Traefik — окрема TLS-сесія, залежна від режиму SSL/TLS зони. Client certificate не доводить шифрування origin leg.

Traefik обмежує Host rule шаблоном Swarm, DNS має точний запис. Порти 2377, 7946 і 4789 назовні не публікуються.

04

4. Reverse proxy та health checks

Traefik перевіряє root URL кожного node endpoint кожні 10 секунд. Недоступний endpoint вилучається і повертається після успішних probes.

Routing mesh приймає port на node без локального task. Proxy перевіряє mesh endpoint, а не container.

05

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

  • Перевірте quorum і три backend
  • Зупиняйте один Engine
  • Тримайте restore окремо
  • Перевіряйте direct і public URL
  • Не змінюйте DNS/TLS
  • Дочекайтеся Ready і 3/3
06

6. Лабораторна робота: baseline

Перевірте service spec, tasks і endpoints. Порт 18080 має ingress mode.

terminal
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/"; done
07

7. Лабораторна робота: публічний HTTPS

Порівняйте HTTP та HTTPS, перегляньте certificate за SNI і журнал Traefik. Команди не розкривають secrets.

terminal
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 traefik
08

8. Лабораторна робота: виключення backend

Зупиніть Engine лише на manager-1. Endpoint .11 не відповідає, .12 і .13 відповідають, п’ять public requests успішні. Помилка першого curl очікувана.

terminal
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 traefik
09

9. Відновлення та діагностика

Одразу поверніть Engine і перевірте endpoint, cluster state та HTTPS.

terminal
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

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 зберігаються.