Изучение Traefik: обратный прокси для Docker

Изучение 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? Информация о внешних услугах!


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, но лучше, если вы пойдете и прочитаете их официальную документацию 🙂


Также опубликовано здесь



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE