Pull to refresh
803.36
OTUS
Цифровые навыки от ведущих экспертов

Обзор балансировщика traefik

Level of difficultyEasy
Reading time6 min
Views9.8K

Привет, Хабр!

Traefik - современный и мощный балансировщик нагрузки.

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

Сравнение с другими балансировщиками:

Функционал

Traefik

Nginx

HAProxy

Автоматическое обнаружение сервисов

Да

Нет (требует доп. настройки)

Нет (требует доп. настройки)

Поддержка контейнеров и оркестраторов

Docker, Kubernetes, и др.

Ограниченная

Ограниченная

Динамическая конфигурация

Да

Ограниченно (с перезагрузкой)

Ограниченно (с перезагрузкой)

Поддержка HTTPS и автоматическое получение сертификатов

Да

Да

Да

Плагины и расширяемость

Есть

Есть (через модули)

Ограниченная

Архитектура

Traefik разделяет свою архитектуру на два основных компонента: Control plane и Data plane:

Control plane

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

Основные компоненты Control plane:

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

API и Dashboard: интерфейс позволяет просматривать текущую конфигурацию, статистику и управлять Traefik через веб-интерфейс или программно.

Система хранения конфигураций: хранит текущую конфигурацию Traefik, полученную от всех подключенных провайдеров. Эта конфигурация динамически обновляется по мере изменения состояния сервисов или их конфигураций.

Когда Traefik запускается, Control plane начинает процесс обнаружения сервисов, подключаясь к настроенным провайдера.

Traefik устанавливает соединения с настроенными провайдерами для получения информации о сервисах и их состоянии. Control plane собирает конфигурации от всех провайдеров, объединяя их в единую конфигурацию маршрутизации.

При изменении состояния сервиса или его конфигурации в одном из провайдеров, Control plane автоматически обновляет конфигурацию маршрутизации в Traefik.

Data plane

Data plane отвечает за непосредственную обработку и маршрутизацию входящего трафика к соответствующим сервисам.

На основе правил, определенных в Control plane, Data plane направляет входящие запросы к соответствующим бэкендам или сервисам, а также распределяет запросы между несколькими экземплярами сервиса и расшифровывает зашифрованный трафик на стороне балансировщика, уменьшая нагрузку на бэкенды.

Data plane также применяет различные промежуточные обработчики для модификации запросов/ответов или выполнения дополнительных проверок безопасности.

Data plane очень тесно интегрирован с Control plane, способен динамически обновлять свою конфигурацию без перезапусков и прерывания обслуживания трафика.

Конфигурация traefik

Файл конфигурации Traefik может быть в TOML, YAML и JSON форматах

Global:

global:
  checkNewVersion: true
  sendAnonymousUsage: true

checkNewVersion: проверять наличие новых версий при запуске.

sendAnonymousUsage: отправлять анонимную статистику использования для улучшения Traefik.

EntryPoints:

entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"

Определяет точки входа, через которые трафик поступает в Traefik, настраиваются прослушиваемые порты и если нужно настройки TLS.

Providers:

providers:
  file:
    filename: /path/to/dynamic/conf.yaml
  docker:
    exposedByDefault: false

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

API and dashboards:

api:
  dashboard: true

Включает Dashboard Traefik

Log:

log:
  level: ERROR
  filePath: /path/to/log/file.log
  format: common

Настройки логирования, включая уровень логирования, путь к файлу лога и формат логирования.

Access log:

accessLog:
  filePath: /path/to/access/log/file.log
  bufferingSize: 100

Конфигурация логов доступа, включая путь к файлу и размер буфера для логирования.

Certificates Resolvers for TLS:

certificatesResolvers:
  myresolver:
    acme:
      email: email@example.com
      storage: acme.json
      httpChallenge:
        entryPoint: web

Настройка резолверов сертификатов для автоматического получения и обновления SSL/TLS сертификатов через ACME, указывается метод получения сертификатов и точка входа для проверки.

Middlewares:

http:
  middlewares:
    testHeader:
      headers:
        customRequestHeaders:
          X-Script-Name: "traefik"

Определение промежуточных обработчиков, которые могут быть использованы для модификации запросов/ответов, добавления заголовков, перенаправления и т.д.

services and loadbalancer:

http:
  routers:
    myRouter:
      rule: "Host(`example.com`)"
      service: "myService"
  services:
    myService:
      loadBalancer:
        servers:
        - url: "http://127.0.0.1:80"

Определяет маршрутизаторы и сервисы. Маршрутизаторы определяют правила для направления трафика к сервисам, а сервисы описывают, как трафик должен быть распределен между бэкендами.

Настройка Traefik в Docker и Kubernetes

Docker

Для начала нужно подготовить docker-compose.yml файл для Traefik. В этом файле определяем, как Traefik будет запущен и как он будет обнаруживать контейнеры Docker:

version: '3'

services:
  traefik:
    image: traefik:v2.5
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"

Монтируем Docker socket, чтобы Traefik мог общаться с Docker daemon и автоматом обнаруживать запущенные контейнеры. Открываем порт 80 для веб-трафика и порт 8080 для доступа к Dashboard Traefik. Указываем Traefik не рассматривать все контейнеры по умолчанию, чтобы избежать нежелательной публикации сервисов.

Далее добавим сервис, который Traefik должен автоматически обнаружить и к которому он должен маршрутизировать трафик. Для этого добавим еще один сервис в docker-compose.yml файл:

services:
  my-service:
    image: my-service-image
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.my-service.rule=Host(`my-service.local`)"
      - "traefik.http.routers.my-service.entrypoints=web"

Запускаем my-service с образом my-service-image.

traefik.enable=true говорит Traefik обрабатывать этот контейнер.

traefik.http.routers.my-service.rule=Host(my-service.local) определяет правило маршрутизации на основе хоста.

traefik.http.routers.my-service.entrypoints=web указывает на entrypoint, который мы определили в конфигурации Traefik.

После настройки docker-compose.yml, запускаем:

docker-compose up -d

Traefik автоматически обнаруживает my-service и начинает маршрутизировать к нему трафик. Можно чекнуть это через Dashboard Traefik по адресу http://localhost:8080.

Kubernetes

Устанавливаем Traefik в качестве Ingress Controller в нашем Kubernetes кластере. Можно сделать это, используя Helm:

helm repo add traefik https://helm.traefik.io/traefik
helm repo update
helm install traefik traefik/traefik

Можно настроить установку, используя файл values.yaml или передавая параметры непосредственно через кмд

Далее нужно настроить Ingress, чтобы трафик мог быть направлен к сервисам:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.class: "traefik"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80

Манифест создает правило Ingress, которое направляет весь трафик для example.com к сервису example-service на порт 80.

Traefik автоматически обнаруживает сервисы и Ingress ресурсы в вашем благодаря интеграции с Kubernetes API.

Плагины

Плагины в Traefik разрабатываются с использованием Go и реализованы как отдельные модули, которые могут быть загружены и активированы во время выполнения.

Traefik Pilot - это SaaS-платформа от разрабов Traefik, которая позволяет управлять и мониторить экземпляры Traefik. Для использования плагинов необходимо зарегистрировать свой экземпляр Traefik в Pilot и активировать нужные плагины через веб-интерфейс.

После активации плагина в Pilot, его можно настроить и использовать в своем экземпляре Traefik, добавив соответствующие настройки в конфигурацию Traefik.

Некоторые из популярных плагинов:

  • Traefik Custom Log Fields: позволяет добавлять пользовательские поля в логи Traefik.

  • CORS: добавляет поддержку CORS к запросам.

  • Authelia: интегрирует Traefik с Authelia для сильной аутентификации и авторизации.

  • OAuth: поддержка OAuth для аутентификации пользователей.

Конфигурация к примеру для плагина CORS в dynamic_conf.toml может выглядеть примерно так:

[http.middlewares]
  [http.middlewares.myCorsPlugin.plugin.cors]
    accessControlAllowMethods = ["GET", "OPTIONS", "PUT"]
    accessControlAllowHeaders = ["Content-Type", "Authorization"]
    accessControlAllowOriginList = ["https://example.com"]
    accessControlMaxAge = 100
    addVaryHeader = true

Пример конфигурации настраивает CORS для разрешения запросов с https://example.com, поддерживая методы GET, OPTIONS, PUT и устанавливая максимальное время кэширования предварительных запросов в 100 секунд.


В завершение хочу напомнить о том, что у моих друзей из OTUS есть ряд курсов по инфраструктуре, где преподают практикующие эксперты отрасли. Подробности в каталоге.

Tags:
Hubs:
Total votes 10: ↑6 and ↓4+6
Comments7

Articles

Information

Website
otus.ru
Registered
Founded
Employees
101–200 employees
Location
Россия
Representative
OTUS