В этой статье используется лицензионное соглашение «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», «Другое», что очень удобно для отладки или устранения неполадок.
В новой версии наконец-то разделены маршруты и можно визуально увидеть полную ссылку маршрута.
На странице сведений о приложении вы можете четко понять все, что вам нужно знать, от точки входа до маршрутизации службы, до промежуточного программного обеспечения, и отчетливо видно конечное бэкэнд-приложение.
Подготовьте среду
Рекомендуется использовать следующую версию программного обеспечения или более позднюю версию.На момент написания этой статьи я использовал версию программного обеспечения:
- 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 и вопросах программирования, а также время от времени будем делиться технической информацией о салоне в группе.
Друзья, которые любят бросать, могут отсканировать код, чтобы добавить друзей. (Пожалуйста, укажите источник и цель, иначе не пройдет проверку)