Руководство пользователя Traefik 2, приятный опыт разработки

Traefik
Руководство пользователя Traefik 2, приятный опыт разработки

В этой статье используется лицензионное соглашение «Signature 4.0 International (CC BY 4.0)», добро пожаловать на перепечатку или изменение для использования, но вам необходимо указать источник.Атрибуция 4.0 Международная (CC BY 4.0)

Автор этой статьи: Су Ян

Создано: 28 января 2020 г. Статистические слова: 7118 слов Время чтения: 15 минут на чтение Ссылка на эту статью:Поиск teay.com/2020/01/28/…


Руководство пользователя Traefik 2, приятный опыт разработки

Написано в 2018 годуУлучшите опыт разработки с помощью обнаружения служб, в котором упоминаются некоторые болевые точки в процессе разработки, в котором Traefik используется в качестве сервисного шлюза/инструмента обнаружения сервисов.

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

Давайте поговорим о том, как лучше использовать Traefik 2.

написать впереди

По сравнению с Traefik 1, 2.x сильно изменился от дизайна до функций, и исходная конфигурация и правила в основном столкнутся с проблемами несовместимости.

Например, если версия 1.x представляет собой большое одиночное приложение, то в версии 2.x каждый модуль был разобран очень мелко, что позволило пользователям использовать его как Lego, и стала поддерживать протокол TCP, степень свобода значительно улучшена. Однако из-за улучшения степени свободы стоимость использования также в определенной степени увеличилась.

Конечно, официальная коммерческая версия по-прежнему основана на v1.x, поэтому обновления пока нет, и проблема не такая уж большая, но если вы хотите использовать Traefik для обработки TCP-трафика, как Hadoop, то обновление несомненно лучший выбор.

Превью нового интерфейса

Перед тем, как это сделать, вы можете взглянуть на новую версию интерфейса.

Он выглядит более интуитивно понятным, чем старая версия. По типу ресурса он делится на разные области «Точка доступа», «HTTP», «TCP», «Другое», что очень удобно для отладки или устранения неполадок.

新版 Dashboard

В новой версии наконец-то разделены маршруты и можно визуально увидеть полную ссылку маршрута.

路由列表

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

应用详情页

Подготовьте среду

Рекомендуется использовать следующую версию программного обеспечения или более позднюю версию.На момент написания этой статьи я использовал версию программного обеспечения:

  • Docker version 19.03.5
  • docker-compose version 1.25.2
  • Traefik version 2.1.3

Обновление профиля Compose от Traefik

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

version: '3.6'

services:

  traefik:
    container_name: traefik
    image: traefik:v1.7-alpine
    restart: always
    ports:
      - 80:80
      - 443:443
      - 4399:4399
      - 4398:4398
    networks:
      - traefik
    command: traefik -c /etc/traefik.toml
    labels:
      - "traefik.enable=false"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.toml:/etc/traefik.toml
      - ./ssl/:/data/ssl/
    healthcheck:
      test: ["CMD-SHELL", "wget -q --spider --proxy off localhost:4398/ping || exit 1"]

# 先创建外部网卡
# docker network create traefik
networks:
  traefik:
    external: true

Видно, что обновленная конфигурация практически не изменилась и даже стала немного короче../config/:/etc/traefik/config/:ro.

version: '3.7'

services:

  traefik:
    container_name: traefik
    image: traefik:v2.1.3
    restart: always
    ports:
      - 80:80
      - 443:443
    networks:
      - traefik
    command: traefik --configFile /etc/traefik.toml
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./ssl/:/data/ssl/:ro
      - ./traefik.toml:/etc/traefik.toml:ro
      - ./config/:/etc/traefik/config/:ro
    healthcheck:
      test: ["CMD-SHELL", "wget -q --spider --proxy off localhost:8080/ping || exit 1"]

# 先创建外部网卡
# docker network create traefik
networks:
  traefik:
    external: true

Конечно, в качестве сервисного шлюза должна быть самопроверка работоспособности сервиса. Время по умолчанию слишком велико. Рекомендуется проверять каждые 3-5 секунд.

healthcheck:
  test: ["CMD-SHELL", "wget -q --spider --proxy off localhost:8080/ping || exit 1"]
  interval: 3s
  timeout: 5s

Обновление конфигурации приложения Traefik

Давайте сначала посмотрим на файл конфигурации Traefik traefik.toml версии 1.7:

debug = false
logLevel = "WARN"
defaultEntryPoints = ["http", "https"]
sendAnonymousUsage = false

[entryPoints]

    [entryPoints.http]
        address = ":80"
        compress = true
    [entryPoints.https]
        address = ":443"
    [entryPoints.https.tls]
        [[entryPoints.https.tls.certificates]]
            certFile = "/data/ssl/lab.io.crt"
            keyFile = "/data/ssl/lab.io.key"
        [[entryPoints.https.tls.certificates]]
            certFile = "/data/ssl/lab.com.crt"
            keyFile = "/data/ssl/lab.com.key"
    [entryPoints.traefik-api]
        address = ":4399"
    [entryPoints.traefik-ping]
        address = ":4398"

[file]
    [backends]
        [backends.dashboard]
            [backends.dashboard.servers.server1]
                url = "http://127.0.0.1:4399"
        [backends.ping]
            [backends.ping.servers.server1]
                url = "http://127.0.0.1:4398"

[frontends]
    [frontends.dashboard]
        entrypoints = ["http", "https"]
        backend = "dashboard"
        [frontends.dashboard.routes.route01]
            rule = "Host:dashboard.lab.io"
    [frontends.ping]
        entrypoints = ["http", "https"]
        backend = "ping"
        [frontends.ping.routes.route01]
            rule = "Host:ping.lab.com"
        [frontends.ping.routes.route02]
            rule = "ReplacePathRegex: ^/ /ping"

[api]
    entryPoint = "traefik-api"
    dashboard = true
    defaultEntryPoints = ["http"]

[ping]
    entryPoint = "traefik-ping"

[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "lab.io"
watch = true
exposedbydefault = false
usebindportip = false
swarmmode = false

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

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

[global]
  checkNewVersion = false
  sendAnonymousUsage = false

[log]
  level = "WARN"
  format = "common"

[api]
  dashboard = true
  insecure = true

[ping]

[accessLog]

[providers]
  [providers.docker]
    watch = true
    exposedByDefault = false
    endpoint = "unix:///var/run/docker.sock"
    swarmMode = false
    useBindPortIP = false
    network = "traefik"
  [providers.file]
    watch = true
    directory = "/etc/traefik/config"
    debugLogGeneratedTemplate = true

[entryPoints]
  [entryPoints.http]
    address = ":80"
  [entryPoints.https]
    address = ":443"

Основной файл менее 40 строк реализует большинство функций старой конфигурации выше.Далее мы займемся проблемами управления SSL-сертификатами и динамическим обнаружением сервисов соответственно.Поговорим сначала об управлении сертификатами.

[tls]
  [tls.options]
    [tls.options.default]
      minVersion = "VersionTLS12"
      maxVersion = "VersionTLS12"
    [tls.options.test-tls13]
      minVersion = "VersionTLS13"
      cipherSuites = [
        "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
        "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
        "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
        "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
        "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
        "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
      ]

  [[tls.certificates]]
    certFile = "/data/ssl/lab.io.crt"
    keyFile = "/data/ssl/lab.io.key"

  [[tls.certificates]]
    certFile = "/data/ssl/lab.com.crt"
    keyFile = "/data/ssl/lab.com.key"

Сохраните вышеуказанный файл какtls.tomlИ сохраните его в каталоге config, просто отлично. По сравнению со старой версией Traefik, новая версия Traefik может не только настраивать версию TLS, используемую для каждого запроса и ответа, но также настраивать алгоритм шифрования и настраивать его независимо для некоторых доменных имен (например, выше)!

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

[entryPoints.http.redirect]
  entryPoint = "https"

Новую версию нужно настроить следующим образом:

[http.middlewares.https-redirect.redirectScheme]
  scheme = "https"
[http.middlewares.content-compress.compress]

# tricks
# https://github.com/containous/traefik/issues/4863#issuecomment-491093096
[http.services]
  [http.services.noop.LoadBalancer]
     [[http.services.noop.LoadBalancer.servers]]
        url = "" # or url = "localhost"

[http.routers]
  [http.routers.https-redirect]
    entryPoints = ["http"]
    rule = "HostRegexp(`{any:.*}`)"
    middlewares = ["https-redirect"]
    service = "noop"

Здесь мы эквивалентны определению нескольких общедоступных методов, но преимущество в том, что мы можем индивидуально настроить, выполнять ли переходы HTTP->HTTPS для каждой службы, которая использует Traefik в будущем, и сохранить указанный выше контент какdefault.toml, чтобы продолжить обработку конфигурации обнаружения службы.

[http.middlewares.dash-compress.compress]
[http.middlewares.dash-auth.basicAuth]
  users = [
    "test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/",
    "test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0",
  ]

[http.routers.dashboard-redirect-https]
  rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`)"
  entryPoints = ["http"]
  service = "noop"
  middlewares = ["https-redirect"]
  priority = 100

[http.routers.dashboard]
  rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`)"
  entrypoints = ["https"]
  service = "dashboard@internal"
  middlewares = ["dash-auth", "dash-compress"]
  [http.routers.dashboard.tls]

[http.routers.api]
  rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`) && PathPrefix(`/api`)"
  entrypoints = ["https"]
  service = "api@internal"
  middlewares = ["dash-auth", "dash-compress"]
  [http.routers.api.tls]

[http.routers.ping]
  rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`) && PathPrefix(`/ping`)"
  entrypoints = ["https"]
  service = "ping@internal"
  middlewares = ["dash-auth", "dash-compress"]
  [http.routers.ping.tls]

Сохраните конфигурацию какdashboard.lab.com, на данный момент все функции старой конфигурации Traefik в основном завершены.Если есть "правила", которые необходимо изменить в будущем, вам нужно только изменить файлы прямо сейчас, и это вступит в силу без перезапуска Traefik .

разное

При отладке и изучении Traefik я обнаружил, что файл entrypoint.sh в образе контейнера Traefik очень интересен.

#!/bin/sh
set -e

# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
    set -- traefik "$@"
fi

# if our command is a valid Traefik subcommand, let's invoke it through Traefik instead
# (this allows for "docker run traefik version", etc)
if traefik "$1" --help >/dev/null 2>&1
then
    set -- traefik "$@"
else
    echo "= '$1' is not a Traefik command: assuming shell execution." 1>&2
fi

exec "$@"

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

Наконец

В следующей статье речь пойдет о том, как обновить предыдущие старые приложения.

--EOF


Теперь у меня есть небольшая группа по метанию, в которую входят друзья, которые любят метать.

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

Друзья, которые любят бросать, могут отсканировать код, чтобы добавить друзей. (Пожалуйста, укажите источник и цель, иначе не пройдет проверку)

Эти вещи о том, чтобы бросить группу в группу