Traefik Reverse Proxy: современный балансировщик нагрузки для Docker и Kubernetes
Установка Traefik, автоматическое обнаружение сервисов с Docker-провайдером, SSL от Let's Encrypt, настройка middleware, dashboard, Kubernetes Ingress Controller и балансировка нагрузки.
Traefik Reverse Proxy: современный балансировщик нагрузки для Docker и Kubernetes
Traefik — современный edge router и обратный прокси, разработанный для микросервисных архитектур. Благодаря глубокой интеграции с Docker и Kubernetes он автоматически обнаруживает и маршрутизирует сервисы.
Что такое Traefik?
Ключевые особенности Traefik:
Автоматическое обнаружение сервисов: Автоматическая маршрутизация через метки Docker/Kubernetes
Интеграция с Let's Encrypt: Автоматическое управление SSL-сертификатами
Система middleware: Auth, ограничение скорости, перенаправление, заголовки
Dashboard: Интерфейс мониторинга в реальном времени
Несколько провайдеров: Поддержка Docker, Kubernetes, Consul, etcd
TCP/UDP-маршрутизация: Поддержка не-HTTP протоколов
Traefik v3 предлагает лучшую производительность и новые функции по сравнению с v2. Это руководство сосредоточено на Traefik v3.
Установка Traefik v3
Установка с Docker Compose
hljs yaml
# docker-compose.ymlservices:traefik:image:traefik:v3.0container_name:traefikrestart:unless-stoppedports:-"80:80"-"443:443"-"8080:8080"# Dashboard (закрыть в production)volumes:-/var/run/docker.sock:/var/run/docker.sock:ro-./traefik.yml:/etc/traefik/traefik.yml:ro-./config:/etc/traefik/config:ro-traefik_certs:/certsnetworks:-traefik-netlabels:-"traefik.enable=true"# Dashboard-"traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"-"traefik.http.routers.dashboard.service=api@internal"-"traefik.http.routers.dashboard.middlewares=auth"-"traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xyz$$hash"-"traefik.http.routers.dashboard.tls.certresolver=letsencrypt"volumes:traefik_certs:networks:traefik-net:external:true
Конфигурация traefik.yml
hljs yaml
# traefik.ymlglobal:checkNewVersion:truesendAnonymousUsage:falseapi:dashboard:trueinsecure:false# false в productionentryPoints:web:address:":80"http:redirections:entryPoint:to:websecurescheme:httpspermanent:truewebsecure:address:":443"http:tls:certResolver:letsencrypthttp3:advertisedPort:443certificatesResolvers:letsencrypt:acme:email:admin@example.comstorage:/certs/acme.jsonhttpChallenge:entryPoint:web# DNS-challenge (для wildcard)# dnsChallenge:# provider: cloudflare# resolvers:# - "1.1.1.1:53"providers:docker:endpoint:"unix:///var/run/docker.sock"exposedByDefault:falsenetwork:traefik-netfile:directory:/etc/traefik/configwatch:truelog:level:INFOfilePath:/var/log/traefik/traefik.logaccessLog:filePath:/var/log/traefik/access.logbufferingSize:100
Автоматическая маршрутизация с Docker-провайдером
Автоматически регистрируйте сервисы в Traefik с помощью меток Docker:
hljs yaml
# Пример приложенияservices:webapp:image:nginx:alpinenetworks:-traefik-netlabels:# Включить Traefik-"traefik.enable=true"# HTTP-роутер-"traefik.http.routers.webapp.rule=Host(`app.example.com`)"-"traefik.http.routers.webapp.entrypoints=websecure"-"traefik.http.routers.webapp.tls.certresolver=letsencrypt"# Порт сервиса-"traefik.http.services.webapp.loadbalancer.server.port=80"# Применить middleware-"traefik.http.routers.webapp.middlewares=security-headers,rate-limit"networks:traefik-net:external:true
Статический Middleware (traefik.yml или файл конфигурации)
hljs yaml
# config/middlewares.ymlhttp:middlewares:# Заголовки безопасностиsecurity-headers:headers:stsSeconds:31536000stsIncludeSubdomains:truestsPreload:trueforceSTSHeader:truecontentTypeNosniff:trueframeDeny:truereferrerPolicy:"strict-origin-when-cross-origin"customResponseHeaders:X-Powered-By:""Server:""# Ограничение скоростиrate-limit:rateLimit:average:100burst:50period:1msourceCriterion:ipStrategy:depth:1# Basic authbasic-auth:basicAuth:users:-"admin:$apr1$xyz$hashedpassword"removeHeader:true# Белый список IPip-whitelist:ipAllowList:sourceRange:-"192.168.1.0/24"-"10.0.0.0/8"# Перенаправление www на non-wwwwww-redirect:redirectRegex:regex:"^https://www\\.(.*)"replacement:"https://${1}"permanent:true
# Генерация пароля с htpasswdecho $(htpasswd -nB admin) | sed -e s/\\$/\\$\\$/g
# Или с opensslecho"admin:$(openssl passwd -apr1 'вашпароль')" | sed -e 's/\$/\$\$/g'
# Балансировка нагрузки с несколькими экземплярамиservices:api:image:myapi:latestdeploy:replicas:3networks:-traefik-netlabels:-"traefik.enable=true"-"traefik.http.routers.api.rule=Host(`api.example.com`)"-"traefik.http.services.api.loadbalancer.server.port=3000"# Sticky sessions-"traefik.http.services.api.loadbalancer.sticky.cookie=true"-"traefik.http.services.api.loadbalancer.sticky.cookie.name=traefik_session"-"traefik.http.services.api.loadbalancer.sticky.cookie.secure=true"# Проверка работоспособности-"traefik.http.services.api.loadbalancer.healthcheck.path=/health"-"traefik.http.services.api.loadbalancer.healthcheck.interval=10s"-"traefik.http.services.api.loadbalancer.healthcheck.timeout=3s"
Заключение
Traefik — мощное решение обратного прокси и балансировщика нагрузки для современных микросервисных инфраструктур. Благодаря глубокой интеграции с Docker и Kubernetes, автоматическому управлению SSL и богатой экосистеме middleware, это надёжный выбор для production-окружений. Конфигурация на основе меток позволяет каждому сервису определять собственные правила маршрутизации.
Часто задаваемые вопросы
В чём основное отличие Traefik от Nginx?
Traefik имеет глубокую интеграцию с Docker/Kubernetes и автоматически обнаруживает сервисы. Nginx требует статической конфигурации и перезагрузки при каждом изменении. Traefik поддерживает динамическую конфигурацию и обновляется без простоя. Nginx более зрелый и может показывать лучшую производительность при очень высоком трафике. Traefik предпочтителен для микросервисных окружений, Nginx — для традиционных веб-серверов.
Как обеспечить безопасность dashboard Traefik в production?
Никогда не открывайте dashboard в небезопасном режиме (порт 8080) в production. Защитите dashboard с помощью HTTPS и basic auth, добавив метки к контейнеру Traefik. Ограничьте доступ определёнными IP с помощью middleware белого списка IP. Альтернативно можно полностью отключить dashboard и использовать Prometheus/Grafana для мониторинга.
Как настроить DNS-challenge для wildcard-сертификатов Let's Encrypt?
Установите провайдер dnsChallenge в разделе certificatesResolvers в traefik.yml. Для Cloudflare требуются 'provider: cloudflare' и переменная окружения 'CF_DNS_API_TOKEN'. Определите соответствующие API-ключи как переменные окружения для других DNS-провайдеров. DNS-challenge безопаснее HTTP-challenge и позволяет выпускать wildcard-сертификаты.
Важен ли порядок middleware в Traefik?
Да, middleware применяются в порядке их определения. Обычно рекомендуемый порядок: белый список IP → ограничение скорости → аутентификация → заголовки. Неправильный порядок может привести к неожиданному поведению. Например, если поставить middleware аутентификации перед ограничением скорости, неаутентифицированные запросы тоже будут учитываться в лимите.
Как достичь развёртывания без простоя с Traefik?
Используйте rolling updates в Docker Swarm или Kubernetes. Traefik автоматически направляет трафик, когда новые контейнеры готовы. Конфигурация проверки работоспособности критически важна: трафик не отправляется на нездоровые контейнеры. Определите endpoint проверки работоспособности с меткой 'traefik.http.services.myapp.loadbalancer.healthcheck.path=/health'.
Как получить единый сертификат (SAN) для нескольких доменов в Traefik?
Traefik получает отдельные сертификаты для каждого домена. Для нескольких доменов используйте 'Host(`a.com`) || Host(`b.com`)' в правиле роутера. Отдельные сертификаты автоматически выпускаются для каждого домена. DNS-challenge необходим для wildcard-сертификатов. Для SAN-сертификатов может потребоваться ручная настройка или использование внешних сертификатов.
Определение и управление многоконтейнерными приложениями с Docker Compose: зависимости сервисов, переменные окружения, проверки работоспособности, масштабирование и развёртывание в production. Полное руководство.
Создание CI/CD-пайплайнов с GitHub Actions: сборка и публикация Docker, развёртывание на сервере по SSH, автоматизация тестов, управление секретами и оптимизация рабочих процессов.
Установка Ansible, файл инвентаря, написание playbook, структура ролей, переменные, зашифрованный vault, ad-hoc команды и автоматизация конфигурации серверов. Пошаговое руководство.