Поиск по сайту:

Как направить трафик в контейнеры Docker с обратным прокси-сервером Traefik


Traefik — ведущий обратный прокси-сервер и балансировщик нагрузки для облачных операций и контейнерных рабочих нагрузок. Он функционирует как пограничный маршрутизатор, который публикует ваши услуги в Интернете.

Traefik направляет запросы в ваши контейнеры, сопоставляя атрибуты запроса, такие как домен, URL-адрес и порт. Прокси-сервер включает автоматическое обнаружение службы, поэтому вы можете добавлять новые контейнеры в режиме реального времени, не перезапуская службу Traefik.

В этом руководстве мы создадим простое развертывание Traefik v2, которое будет публиковать несколько контейнеров Docker. Это позволяет использовать одну установку Docker для предоставления нескольких служб через один и тот же порт, таких как веб-приложение, API и панель администрирования.

Начиная

Проще всего развернуть Traefik, используя собственный образ Docker. Мы предполагаем, что вы используете Traefik с Docker до конца этого руководства. Однофайловые двоичные файлы доступны в качестве альтернативного варианта, если вы предпочитаете, чтобы Traefik находился вне вашей установки Docker.

Вы должны создать файл конфигурации, прежде чем сможете начать использовать Traefik. Добавьте следующий контент в файл traefik.toml — мы объясним, что он делает ниже:

[entryPoints]
  [entryPoints.http]
      address = ":80"
      [entryPoints.http.http.redirections.entryPoint]
          to = "https"
          scheme = "https"
  [entryPoints.https]
      address = ":443"
 
[providers]
  [providers.docker]
    network = "traefik"

Этот файл конфигурации настраивает Traefik с двумя «точками входа». Точки входа описывают, как запросы достигают службы Traefik. Точки входа HTTP и HTTPS создаются для прослушивания портов 80 и 443 соответственно. В случае HTTP-запроса вместо этого используется правило перенаправления, чтобы перенаправить его на точку входа https. Удалите раздел перенаправления, если вы хотите иметь возможность обслуживать контент по обычному HTTP.

Раздел «провайдеры» настраивает источники, которые определяют ваши сетевые маршруты. Провайдеры — это просто компоненты инфраструктуры, которые могут выдавать Traefik инструкции по маршрутизации. Если вы хотите, вы можете написать пользовательскую конечную точку HTTP API для определения ваших маршрутов.

В этом примере мы сохраняем простоту и используем поставщика docker. Это отслеживает контейнеры Docker, работающие на вашем хосте. Когда появится новый контейнер с метками, характерными для Traefik, эти значения будут использоваться для настройки маршрута к контейнеру. Контейнеры должны быть подключены к сети traefik Docker, чтобы это работало, поскольку эта сеть указана в файле конфигурации. Создайте сеть сейчас:

docker network create traefik

Запуск Траефик

Теперь вы готовы запустить Traefik! Разверните новый контейнер с образом Traefik. Привяжите порты 80 и 443 к вашему хосту, что позволит Traefik прослушивать входящие запросы. Вы также должны подключить контейнер к сети traefik, созданной ранее.

Смонтируйте сокет Docker вашего хоста в контейнер Traefik с флагом -v. Это дает Traefik возможность доступа к другим контейнерам, работающим на вашем хосте, что позволяет автоматически определять маршруты через поставщика docker, настроенного в вашем файле конфигурации. Сам файл конфигурации монтируется в /traefik.toml внутри контейнера Traefik.

docker run -d 
  -p 80:80 
  -p 443:443 
  -v $PWD/traefik.toml:/traefik.toml 
  -v /var/run/docker.sock:/var/run/docker.sock 
  --name traefik 
  --network traefik 
  traefik:2.6

Затем запустите пару контейнеров, чтобы проверить, работает ли Traefik:

docker run -d 
  --label traefik.http.routers.apache.rule=Host(`apache.example.com`) 
  --name apache 
  --network traefik 
  httpd:latest

docker run -d 
  --label traefik.http.routers.nginx.rule=Host(`nginx.example.com`) 
  --name nginx 
  --network traefik 
  nginx:latest

Убедитесь, что вы добавили записи DNS для apache.example.com и nginx.example.com, которые сопоставляются с вашим хостом Traefik. Вы должны иметь возможность посетить эти домены в своем браузере, чтобы увидеть целевые страницы Apache и NGINX по умолчанию соответственно. Два контейнера подключены к сети Traefik; их метки traefik.http.routers устанавливают базовые маршруты, соответствующие входящим запросам по значению их заголовка Host.

Маршрутизация трафика

Traefik поддерживает несколько различных «сопоставителей» для маршрутизации вашего трафика. Мы использовали сопоставление хостов выше, но вы также можете маршрутизировать по методу HTTP, заголовкам, URI, IP-адресу и параметрам строки запроса. Добавьте несколько сопоставителей в свои контейнеры, чтобы создать более сложные правила маршрутизации.

Traefik также поддерживает промежуточное программное обеспечение, которое позволяет вам изменять запрос до того, как он попадет в ваши службы. Вы можете добавить префикс, настроить заголовки или применить обычную аутентификацию на уровне прокси. Вот пример использования промежуточного программного обеспечения Headers для добавления дополнительного заголовка запроса X-Proxied-By:

docker run -d 
  --label traefik.http.routers.nginx.rule=Host(`nginx.example.com`) 
  --label traefik.http.middlewares.demo.headers.customrequestheaders.X-Proxied-By=traefik
  --name nginx 
  --network traefik 
  nginx:latest

Traefik направляет трафик на открытые порты ваших контейнеров. Вы можете указать другой порт, установив метку traefik.http.services..loadbalancer.server.port=8080.

Добавление SSL

Затем вы должны добавить SSL, чтобы обеспечить полную защиту вашего трафика. Traefik включает интеграцию Let’s Encrypt, поэтому мы будем использовать ее сейчас для автоматизации создания сертификатов.

Добавьте следующий раздел в файл traefik.toml:

[certificatesResolvers.lets-encrypt.acme]
  email = "you@example.com"
  storage = "/acme.json"
  [certificatesResolvers.lets-encrypt.acme.tlsChallenge]

Это настраивает Traefik на использование провайдера Let’s Encrypt ACME при разрешении запросов сертификатов. Обязательно замените адрес электронной почты на свой, чтобы получать напоминания об истечении срока действия сертификата, отправленные Let’s Encrypt. Раздел tlsChallenge определяет, как происходит проверка сертификации; оставив его пустым, будет использоваться поток по умолчанию для обслуживания уникального файла, который Let’s Encrypt будет запрашивать и проверять во время выдачи сертификата.

Перезапустите или замените контейнер Traefik, чтобы применить новую конфигурацию. Вы также должны смонтировать новый файл в /acme.json внутри контейнера — Traefik будет использовать его для хранения сертификатов.

docker run -d 
  -p 80:80 
  -p 443:443 
  -v $PWD/acme.json:/acme.json 
  -v $PWD/traefik.toml:/traefik.toml 
  -v /var/run/docker.sock:/var/run/docker.sock 
  --name traefik 
  --network traefik 
  traefik:2.6

Использование панели инструментов

Traefik включает веб-интерфейс, который предлагает графическое представление конечных точек, поставщиков и служб (контейнеров), активных в вашем развертывании. Вы можете открыть пользовательский интерфейс, настроив для него маршрут в файле конфигурации.

Сначала измените существующий traefik.toml, добавив следующий раздел:

[api]
  dashboard = true
 
[providers.file]
  filename = "/traefik_dashboard.toml"

Затем создайте traefik_dashboard.toml со следующим содержимым:

[http.middleware.dashboard_auth.basicAuth]
  users = [
    "admin:$123..."
  ]
 
[http.routers.api]
  rule = "Host(`traefik.example.com`)"
  entrypoints = ["https"]
  middlewares = ["dashboard_auth"]
  service = "api@internal"
  [http.routers.api.tls]
    certResolver = "lets-encrypt"

Новый файл необходим, так как Traefik не поддерживает «динамическую» конфигурацию (сервисы и маршрутизаторы) наряду со «статическими» значениями в вашем основном traefik.toml. Файл конфигурации панели мониторинга вручную определяет маршрут, который сопоставляет traefik.example.com с внутренней веб-службой пользовательского интерфейса. Строка providers.file, добавленная в traefik.toml, регистрирует новое определение маршрута в поставщике file.

Используйте htpasswd для создания набора учетных данных HTTP Basic Auth. Добавьте сгенерированную строку в массив users в промежуточном программном обеспечении dashboard_auth. Вам нужно будет использовать это имя пользователя и пароль для доступа к панели инструментов.

sudo apt install apache2-utils
htpasswd -nb admin your_password

# Outputs admin:$123...

Теперь перезапустите Traefik с обновленной конфигурацией, не забыв также смонтировать новый файл traefik_dashboard.toml:

docker run -d 
  -p 80:80 
  -p 443:443 
  -v $PWD/acme.json:/acme.json 
  -v $PWD/traefik.toml:/traefik.toml 
  -v $PWD/traefik_dashboard.toml:/traefik_dashboard.toml 
  -v /var/run/docker.sock:/var/run/docker.sock 
  --name traefik 
  --network traefik 
  traefik:2.6

Вы должны получить доступ к панели инструментов, перейдя на traefik.example.com в браузере. Если вы не хотите предоставлять веб-интерфейс в качестве маршрута и всегда будете получать к нему доступ с вашего локального компьютера, вместо этого вы можете опубликовать порт 8080 в своем контейнере Traefik. Внесите в файл traefik.toml следующий раздел:

[api]
  dashboard = true
  insecure = true
docker run -d 
  -p 8080:8080 
  -p 80:80 
  -p 443:443 
  -v $PWD/acme.json:/acme.json 
  -v $PWD/traefik.toml:/traefik.toml 
  -v /var/run/docker.sock:/var/run/docker.sock 
  --name traefik 
  --network traefik 
  traefik:2.6

Это позволит вам получить доступ к панели управления через http://localhost:8080. Этот подход не следует использовать в безопасных производственных средах, но он позволяет быстрее проводить локальные эксперименты.

Заключение

Traefik — это универсальное решение для обратного прокси-сервера для ваших контейнеров. В этой статье мы рассмотрели только самые основные из его возможностей. Помимо базового использования с Docker, Traefik также работает с ведущими решениями для оркестровки контейнеров, включая Kubernetes, Docker Swarm и Mesos.

Traefik предоставляет REST API, а также метрики в форматах, понятных Prometheus, InfluxDB, Datadog и Statsd. Эти возможности позволяют автоматизировать развертывание Traefik и использовать его вместе с другими компонентами инфраструктуры в вашем стеке. Это идеальный способ публиковать контейнерные рабочие нагрузки в мире без использования полного решения для оркестровки.




Все права защищены. © Linux-Console.net • 2019-2024