Изучение Traefik: обратный прокси для Docker
31 марта 2022 г.В этом руководстве по Traefik мы покажем вам, как проксировать сайты и API на нескольких примерах, автоматизировать получение сертификатов и даже добавить промежуточное ПО (например, для добавления заголовков).
Обратите внимание, что мы используем символ решетки (#) в примерах кода, где мы хотим что-то объяснить.
Что такое Траефик?
Это обратный прокси, предназначенный для работы с Docker. Это позволяет вам проксировать службы в контейнерах очень простым и декларативным способом. Поначалу вас могут пугать ярлыки, но вы к этому привыкнете.
Почему, например, Traefik, а не nginx? Мы считаем, что Traefik проще в управлении. Он использует только docker=compose (вместо этого плюс nginx.conf с nginx), но все еще выполняет свою функцию.
Создать конфигурацию трафика
Для начала создадим конфиг трафика:
``ямл
traefik.yml
установить уровень лога
журнал:
уровень: ОТЛАДКА
включить дашборд с полезной информацией
API:
приборная панель: правда
небезопасно: правда
провайдеры: в нашем случае это то, что мы проксируем.
сначала нам нужен только Докер,
вот как проксировать внешние сервисы
провайдеры:
докер:
здесь вы указываете сеть для добавления
сервис для "подхвата" трафика
сеть: трафик
отключаем "автозачистку" контейнеров по трафику
иначе он попытается проксировать все контейнеры
экспобидефаулт: ложь
точки входа - это просто порты, к которым будет осуществляться доступ
к Traefik и, следовательно, к службам, которые он проксирует
точки входа:
это имя точки входа для обычного http-трафика, обычно называемого
http или web, но сюда можно поместить что угодно
http:
номер порта входа
адрес: :80
http:
настраиваем редирект для всех запросов на точку входа https
перенаправления:
входная точка:
на: https
схема: https
постоянный: правда
создаем точку входа https на порт 443, обычно называемый
https или веб-безопасность
https:
адрес: :443
преобразователь сертификатов ssl: используется для получения сертификатов для доменов.
На данный момент у нас есть только один, а позже мы добавим еще один, который называется Wildcard Resolver.
сертификатыResolvers:
простой преобразователь:
акме:
тип вызова acme, он нам нужен, чтобы letsenscript мог понять, что это наш
домен нам нужно указать точку входа, на которой будет запускаться челлендж
больше информации о вызовах здесь https://letsencrypt.org/docs/challenge-types/
httpвызов:
точка входа: http
letsencript нужна ваша электронная почта, она отправит туда всю информацию,
например ваш сертификат вот-вот испортится
электронная почта: me@example.com
вот куда Traefik будет класть сертификаты, лучше запустить Volumetric
этим мы и займемся ниже
хранилище: /letsencrypt/acme.json
журнал доступа: правда
``ямл
Докерфайл
ОТ траефик: v2.5.2
РАБОЧИЙ КАТАЛОГ /traefik
КОПИРОВАТЬ ./traefik.yml
CMD ["траефик"]
docker-compose.yml
версия: "3.8"
Сервисы:
трафик:
строить: .
имя_контейнера: трафик
перезапуск: всегда
порты:
открытые порты для http, https и приборной панели Traefik,
последний не должен быть доступен за пределами вашей локальной сети
он будет доступен по ssh (см. ниже)
- 80:80
- 443:443
- 127.0.0.1:8080:8080
тома:
трафику нужен доступ к docker.sock для мониторинга контейнеров
- /var/run/docker.sock:/var/run/docker.sock:ro
а вот и объемный доступ к сертификатам
- /данные/letsencrypt:/letsencrypt
сети:
- траефик
для примера подключим whoami, простой сервис, отображающий
информация о запросе в текстовом виде
кто я:
изображение: "traefik/whoami"
перезапуск: всегда
этикетки:
включить Traefik для этого контейнера
- traefik.enable=true
установить сеть Traefik
- traefik.docker.network=traefik
самое интересное: добавление маршрутизатора и правила для него
в этом случае роутер будет называться whoami
и будет доступен на example.com
обязательно добавьте имя роутера, оно должно быть
быть уникальным, в нашем случае это whoami (следует после
traefik.http.routers.)
- traefik.http.routers.whoami.rule=Хост(
example.com
)
Указываем, через какую точку входа будет доступен роутер
- traefik.http.routers.whoami.entrypoints=https
установить certresolver
- traefik.http.routers.whoami.tls.certresolver=простой-преобразователь
на самом деле вам не нужно явно указывать порт
traefik может определить, какой порт прослушивает служба,
Может случиться так, что один контейнер слушает несколько портов одновременно.
port слушает несколько # портов (например, RabbitMq делает это), то вы будете
создать несколько роутеров и явно указать несколько портов
- traefik.http.services.whoami.loadbalancer.server.port=80
сети:
- траефик
и сети
сети:
трафик:
внешний:
имя: Трафик
Вот и все, теперь вы можете запустить его и быть довольным тем, что сделали.
Если вы хотите потыкать дашборд, вы можете сделать это, пробросив порты через ssh
ssh -L 8080:localhost:8080 root@example.com
и откройте localhost:8080 в браузере.
Проксирование внешних сервисов
Вы знаете, чего не хватает этому учебнику Traefik? Информация о внешних услугах!
Traefik можно использовать не только для сервисов в Docker, но и для внешних сервисов. Он поддерживает балансировку нагрузки из коробки, т.е. если у вас есть реплицированный сервис, вы просто указываете все хосты, а Traefik сделает все остальное.
Для проксирования внешних сервисов (вне сети Docker) нужно добавить провайдера в traefik.yml
``ямл
traefik.yml
провайдеры:
докер:
сеть: трафик
выставлено по умолчанию: ложь
добавить поставщика файлов, который будет получать данные из
внешний каталог
файл:
каталог: ./внешний
К прокси-сервисам в локальной сети надо добавить сервис docker-host, т.к. localhost внутри контейнера будет указывать на сеть самого контейнера, а не на локальную сеть машины
``ямл
docker-compose.yml
версия: "3.8"
Сервисы:
трафик:
сети:
- траефик
добавляем общую сеть для dockerhost и Traefik
- местный
докер-хост:
изображение: qoomon/докер-хост
cap_add: [ "NET_ADMIN", "NET_RAW" ]
перезапуск: всегда
сети:
- местный
сети:
трафик:
внешний:
имя: Трафик
местный:
``ямл
Докерфайл
ОТ траефик: v2.5.2
РАБОЧИЙ КАТАЛОГ /traefik
КОПИРОВАТЬ ./traefik.yml
копируем папку с конфигами внешнего сервиса
КОПИРОВАТЬ ./внешний
CMD ["траефик"]
А также конфиг самого внешнего сервиса (все конфиги поместить во внешнюю директорию).
``ямл
внешний/example.yml
http:
Сервисы:
пример API:
loadBalancer:
серверы:
если сервис находится на внешнем хосте,
пишем просто ip или домен
- адрес: "http://123.456.789.123:4716"
пример-веб-клиент:
loadBalancer:
серверы:
если это на локальном хосте, введите docker-host
- URL-адрес: "http://docker-host:8132"
маршрутизаторы:
пример-веб-клиент:
Точки входа:
- https
веб-клиент будет доступен по любым путям в домене
web.example.com
правило: "Хост(site.example.com
)"
сервис: пример-веб-клиент
тлс:
certResolver: простой преобразователь
пример API:
Точки входа:
- https
API будет доступен только на site.example.com/api(.*)
не нужно добавлять никаких дополнительных правил для веб-сервера
Traefik будет направлять запросы в /api,
это работает так же, как специфичность css
правило: "Хост(site.example.com
) && PathPrefix(/api
)"
служба: пример API
тлс:
certResolver: простой преобразователь
Подстановочные сертификаты
Траефик тоже может! Давайте перепишем docker-compose.yml так, чтобы whoami был доступен *.example.com.
Во-первых, мы должны добавить wildcard-resolver в конфигурацию трафика.
``ямл
traefik.yml
сертификатыResolvers:
подстановочный знак-преобразователь:
акме:
dnschallenge:
укажите провайдера DNS, в данном примере это будет godaddy,
но Traefik умеет работать с другими:
https://doc.traefik.io/traefik/https/acme/#dnschallenge
провайдер: годэдди
электронная почта: me@example.com
хранилище: /letsencrypt/acme.jso
``ямл
docker-compose.yml
версия: "3.8"
Сервисы:
трафик:
сборка: ./прокси
имя_контейнера: трафик
перезапуск: всегда
окружающая обстановка:
указываем апи ключи нашего провайдера из переменных окружения
- GODADDY_API_KEY=${GODADDY_API_KEY}
- GODADDY_API_SECRET=${GODADDY_API_SECRET}
- GODADDY_POLLING_INTERVAL=10
- GODADDY_PROPAGATION_TIMEOUT=300
порты:
- 80:80
- 443:443
- 127.0.0.1:8080:8080
тома:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /данные/letsencrypt:/letsencrypt
этикетки:
- traefik.enable=true
- traefik.http.routers.api.entrypoints=http
сети:
- местный
- траефик
кто я:
изображение: "traefik/whoami"
перезапуск: всегда
этикетки:
- traefik.enable=true
- traefik.docker.network=traefik
меняем правила для роутера
- traefik.http.routers.whoami.rule="Host(
example.com
) || HostRegexp({subdomain:.+}.example.com
)"
- traefik.http.routers.whoami.entrypoints=https
установить подстановочный знак
- traefik.http.routers.whoami.tls.certresolver=преобразователь подстановочных знаков
домены, на которых резолвер будет получать сертификаты
- traefik.http.routers.whoami.tls.domains[1].main=example.com
- traefik.http.routers.whoami.tls.domains[1].sans=*.example.com
- traefik.http.services.whoami.loadbalancer.server.port=80
сети:
- траефик
ПО промежуточного слоя
Traefik позволяет создавать промежуточное ПО и применять его на маршрутизаторах и даже точках входа!
Например, если вам нужно удалить какой-то сервис из результатов поиска, вы всегда можете просто прикрепить X-Robots-Tag: noindex, nofollow.
``ямл
docker-compose.yml
кто я:
изображение: "traefik/whoami"
перезагрузка: всегда
этикетки:
- traefik.enable=true
- traefik.docker.network=traefik
- traefik.http.routers.whoami.rule="Host(
example.com
) || HostRegexp({subdomain:.+}.example.com
)"
- traefik.http.routers.whoami.entrypoints=https
- traefik.http.routers.whoami.tls.certresolver=преобразователь подстановочных знаков
- traefik.http.routers.whoami.tls.domains[1].main=example.com
- traefik.http.routers.whoami.tls.domains[1].sans=*.example.com
- traefik.http.services.whoami.loadbalancer.server.port=80
Создание промежуточного программного обеспечения, где
noindex - это заголовок
заголовки являются промежуточными типами
- "traefik.http.middlewares.noindex.headers.customresponseheaders.X-Robots-Tag=noindex, nofollow"
Добавляем наше промежуточное ПО в роутер.
- traefik.http.routers.whoami.middlewares=noindex@docker
К вашему маршрутизатору может быть подключено несколько промежуточных программ, и в этом случае они должны быть указаны через запятую.
– «traefik.http.routers.whoami.middlewares=noindex@docker, something@docker, example@file»
Middleware также можно применять не только к маршрутизаторам, но и ко всем точкам входа. В этом случае вы все равно создаете промежуточное ПО в ярлыках, вы можете сделать это в самом Traefik.
``ямл
docker-compose.yml
трафик:
этикетки:
- "traefik.enable=true"
- "traefik.docker.network=traefik"
- "traefik.http.routers.api.entrypoints=http"
- "traefik.http.middlewares.noindex.headers.customresponseheaders.X-Robots-Tag=noindex, nofollow"
И добавьте промежуточное ПО traefik.yml в точку входа.
traefik.yml
точки входа:
http:
адрес: :80
http:
перенаправления:
входная точка:
на: https
схема: https
постоянный: правда
https:
адрес: :443
добавляем промежуточное ПО http
http:
промежуточное ПО:
- "noindex@докер"
Заключение
Это наш краткий учебник по Traefik. Мы надеемся, что вы узнали что-то новое или, по крайней мере, поняли, насколько великолепен и многофункционален Traefik. Мы могли бы продолжать и продолжать рассказывать о Traefik, но лучше, если вы пойдете и прочитаете их официальную документацию 🙂
Также опубликовано здесь
Оригинал