Модуль 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. Поэтому нужны прямые probes и состояние service.
3. TLS на edge и origin
Клиентский сертификат предъявляет Cloudflare. Соединение Cloudflare с Traefik — отдельная TLS-сессия и зависит от режима SSL/TLS зоны. Клиентский сертификат не доказывает шифрование origin leg.
Traefik ограничивает Host rule шаблоном Swarm, а DNS использует точную запись. Control-plane порты 2377, 7946 и 4789 наружу не публикуются.
4. Reverse proxy и health checks
Traefik проверяет root URL каждого node endpoint раз в 10 секунд. Недоступный endpoint исключается из пула и возвращается после успешных probes.
Routing mesh принимает published port на node без локального task. Proxy проверяет mesh endpoint, а не конкретный container.
5. Методические указания
- Подтвердите quorum и три backend
- Останавливайте только один Engine
- Держите restore отдельным блоком
- Проверяйте direct и public URL
- Не меняйте DNS/TLS во время drill
- Дождитесь Ready и 3/3
6. Лабораторная работа: baseline
Проверьте service spec, tasks и каждый endpoint. Порт 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, изучите сертификат по SNI и журнал Traefik. Команды не раскрывают tokens или private keys.
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 сохраняются.