LINUX.ORG.RU
решено ФорумAdmin

Конфиг Traefik в качестве балансировщика

 , ,


0

2

Помогите, пожалуйста, разобраться с конфигом Traefik. Требуется настроить его для балансировки нескольких веб-серверов. На 2.0.0 я стабильно получаю ошибку 404.

Дополнение: Переписал конфиг с учётом изменений в версии 2 (https://docs.traefik.io/v2.0/) Новый конфиг под TCP:

[global]
sendanonymoususage = false

[entrypoints]
  [entrypoints.sdb]
    address = ":7100"
# [entrypoints.sdb.proxyProtocol]
#   trustedIPs = ["127.0.0.1/32", "192.168.56.1/24"]

[tcp]
  [tcp.routers]
    [tcp.routers.toDBplain]
      entrypoints = ["sdb"]
      rule = "HostSNI(`*`)"
      service = "toDBplain"
      [tcp.routers.toDBplain.tls]

  [tcp.services]
    [tcp.services.toDBplain.LoadBalancer]
      [[tcp.services.toDBplain.LoadBalancer.servers]]
        address = "192.168.56.1:7201"
      [[tcp.services.toDBplain.LoadBalancer.servers]]
        address = "192.168.56.1:7202"

[accessLog]
  format = "json"
  logLevel = "debug"
[log]
  format = "json"
  logLevel = "debug"

Лог с новым конфигом:

{«level»:«info»,«msg»:«Using TOML configuration file /home/powtest/traefik/new.toml»,«time»:«2019-03-23T11:47:47+03:00»}
{«level»:«info»,«msg»:«Traefik version 2.0.0-alpha1 built on 2019-03-18T14:26:35Z»,«time»:«2019-03-23T11:47:47+03:00»}
{«level»:«debug»,«msg»:«Static configuration loaded {\„Global\“:{\„Debug\“:false,\„CheckNewVersion\“:false,\„SendAnonymousUsage\“:false},\„ServersTransport\“:{\„InsecureSkipVerify\“:false,\„RootCAs\“:null,\„MaxIdleConnsPerHost\“:200,\„ForwardingTimeouts\“:null},\„EntryPoints\“:{\„sdb\“:{\„Address\“:\»:7100\",\«Transport\»:{\«LifeCycle\»:{\«RequestAcceptGraceTimeout\»:0,\«GraceTimeOut\»:10000000000},\«RespondingTimeouts\»:{\«ReadTimeout\»:0,\«WriteTimeout\»:0,\«IdleTimeout\»:180000000000}},\«ProxyProtocol\»:null,\«ForwardedHeaders\»:{\«Insecure\»:false,\«TrustedIPs\»:null}}},\«Providers\»:{\«ProvidersThrottleDuration\»:2000000000,\«Docker\»:null,\«File\»:null,\«Marathon\»:null,\«Kubernetes\»:null,\«KubernetesCRD\»:null,\«Rest\»:null},\«API\»:null,\«Metrics\»:null,\«Ping\»:null,\«Log\»:{\«LogLevel\»:\«debug\»,\«format\»:\«json\»},\«AccessLog\»:{\«format\»:\«json\»},\«Tracing\»:null,\«HostResolver\»:null,\«ACME\»:null}",«time»:«2019-03-23T11:47:47+03:00»}
{«level»:«info»,«msg»:«\nStats collection is disabled.\nHelp us improve Traefik by turning this feature on :)\nMore details on: https://docs.traefik.io/basics/#collected-data\n»,«time»:«2019-03-23T11:47:47+03:00»}
{«level»:«debug»,«msg»:«No default certificate, generate one»,«time»:«2019-03-23T11:47:47+03:00»}
{«level»:«info»,«msg»:«Starting provider aggregator.ProviderAggregator {}»,«time»:«2019-03-23T11:47:47+03:00»}
{«entryPointName»:«sdb»,«level»:«debug»,«msg»:«Start TCP Server»,«time»:«2019-03-23T11:47:47+03:00»}
{«ClientAddr»:«192.168.56.147:46164»,«ClientHost»:«192.168.56.147»,«ClientPort»:«46164»,«ClientUsername»:"-",«DownstreamContentSize»:19,«DownstreamStatus»:404,«Duration»:13552163,«Overhead»:13552163,«RequestAddr»:«192.168.56.147:7100»,«RequestContentSize»:0,«RequestCount»:1,«RequestHost»:«192.168.56.147»,«RequestMethod»:«GET»,«RequestPath»:«/api»,«RequestPort»:«7100»,«RequestProtocol»:«HTTP/1.1»,«RetryAttempts»:0,«StartLocal»:«2019-03-23T11:47:52.614208064+03:00»,«StartUTC»:«2019-03-23T08:47:52.614208064Z»,«downstream_Content-Type»:«text/plain; charset=utf-8»,«downstream_X-Content-Type-Options»:«nosniff»,«level»:«info»,«msg»:"",«request_Accept»:«*/*»,«request_User-Agent»:«curl/7.52.1»,«time»:«2019-03-23T11:47:52+03:00»}
^C{«level»:«info»,«msg»:«I have to go...»,«time»:«2019-03-23T11:47:56+03:00»}
{«level»:«info»,«msg»:«Stopping server gracefully»,«time»:«2019-03-23T11:47:56+03:00»}
{«entryPointName»:«sdb»,«level»:«debug»,«msg»:«Waiting 10s seconds before killing connections.»,«time»:«2019-03-23T11:47:56+03:00»}
{«level»:«error»,«msg»:«accept tcp [::]:7100: use of closed network connection»,«time»:«2019-03-23T11:47:56+03:00»}
{«entryPointName»:«sdb»,«level»:«debug»,«msg»:«Entry point sdb closed»,«time»:«2019-03-23T11:47:56+03:00»}
{«level»:«info»,«msg»:«Server stopped»,«time»:«2019-03-23T11:47:56+03:00»}
{«level»:«info»,«msg»:«Shutting down»,«time»:«2019-03-23T11:47:56+03:00»}

Конфиг для HTTP:

[global]
sendanonymoususage = false
[entrypoints]
  [entrypoints.sdb]
    address = ":7100"
[http]
  [http.routers]
    [http.routers.toDBr1]
      entrypoints = ["sdb"]
      rule = "Host(`*`)"
      service = "toDBs1"
  [http.services]
    [http.services.toDBs1.LoadBalancer]
      [[http.services.toDBs1.LoadBalancer.servers]]
        url = "http://192.168.56.1:7201"
      [[http.services.toDBs1.LoadBalancer.servers]]
        url = "http://192.168.56.1:7202"
[accessLog]
  format = "json"
  logLevel = "debug"
[log]
  format = "json"
  logLevel = "debug"
Результат тот же:
{«ClientAddr»:«192.168.56.147:46166»,«ClientHost»:«192.168.56.147»,«ClientPort»:«46166»,«ClientUsername»:"-",«DownstreamContentSize»:19,«DownstreamStatus»:404,«Duration»:57476,«Overhead»:57476,«RequestAddr»:«192.168.56.147:7100»,«RequestContentSize»:0,«RequestCount»:1,«RequestHost»:«192.168.56.147»,«RequestMethod»:«GET»,«RequestPath»:«/api»,«RequestPort»:«7100»,«RequestProtocol»:«HTTP/1.1»,«RetryAttempts»:0,«StartLocal»:«2019-03-23T12:44:06.053655548+03:00»,«StartUTC»:«2019-03-23T09:44:06.053655548Z»,«downstream_Content-Type»:«text/plain; charset=utf-8»,«downstream_X-Content-Type-Options»:«nosniff»,«level»:«info»,«msg»:"",«request_Accept»:«*/*»,«request_User-Agent»:«curl/7.52.1»,«time»:«2019-03-23T12:44:06+03:00»}

Как заставить его работать?

И спасибо тому, кто добавил тэг «traefik»!

Рабочие конфиги (всё на локалхосте):

Старая версия 1.7:

[file]

[entryPoints]
  [entryPoints.http]
  address = ":7100"

[backends]
  [backends.backend1]
    [backends.backend1.servers]
      [backends.backend1.servers.server0]
        url = "http://localhost:8001"
        weight = 1
      [backends.backend1.servers.server1]
        url = "http://localhost:8002"
        weight = 1

[frontends]
  [frontends.frontend1]
  backend = "backend1"
    [frontends.frontend1.routes.test_1]
    rule = "HostRegexp: {domain:.+}"
Альфа 2.0 для HTTP:
[global]
sendanonymoususage = false

[providers.file]

[entrypoints]
  [entrypoints.http]
    address = ":7100"

[http]
  [http.routers]
    [http.routers.toDBr1]
      entrypoints = ["http"]
      rule = "PathPrefix(`/`)"
      service = "toDBs1"
  [http.services]
    [http.services.toDBs1.LoadBalancer]
      method = "wrr"
      [[http.services.toDBs1.LoadBalancer.servers]]
        url = "http://localhost:8001"
        weight = 1
      [[http.services.toDBs1.LoadBalancer.servers]]
        url = "http://localhost:8002"
        weight = 1

[accessLog]
[log]
Альфа 2.0 для TCP:
[global]
sendanonymoususage = false

[providers.file]

[entrypoints]
  [entrypoints.tcp]
    address = ":7100"

[tcp]
  [tcp.routers]
    [tcp.routers.toDBr1]
      entrypoints = ["tcp"]
      rule = "HostSNI(`*`)"
      service = "toDBs1"
  [tcp.services]
    [tcp.services.toDBs1.LoadBalancer]
      method = "wrr"
      [[tcp.services.toDBs1.LoadBalancer.servers]]
        address = "127.0.0.1:8001"
        weight = 1
      [[tcp.services.toDBs1.LoadBalancer.servers]]
        address = "127.0.0.1:8002"
        weight = 1
[docker]
exposedByDefault = false

[accessLog]
[log]

Мои ошибки: TCP требует «address» вместо «url», weight нужно указывать явно, т.к. по умолчанию 0. Не понял, должны ли точки входа иметь имена «tcp» и «http», но без этого не работало.

P.S. Но так как обслуживаемый клиент не умеет пользоваться куками, а Traefik не умеет без них организовывать «липкие» сессии, а балансировка сводится к dynamic/weighted round robin, всё это оказалось бесполезно. Для аутентификации нужно послать 6 запросов на один и тот же сервер. А они всегда идут на разные.

★★★

Последнее исправление: olegd (всего исправлений: 7)
Ответ на: комментарий от Anoxemian

Докера здесь быть не должно — отключил как в официальном примере. TOML я понял. traefik пишется иначе.

olegd ★★★
() автор топика
Ответ на: комментарий от anonymous

Окончательная конфигурация будет на линуксе. Пока это тестовая машина, где веб-сервер работает стабильнее, а фаерволы не мешают.

Или Traefik под ней сильно глючит?

olegd ★★★
() автор топика
Последнее исправление: olegd (всего исправлений: 1)
Ответ на: комментарий от Anoxemian

20-летний баян. Только в оригинали были PCP и PHP. Возможно, во времена CP/M шутили про PSP...

По теме идеи есть?

olegd ★★★
() автор топика
Последнее исправление: olegd (всего исправлений: 1)
Ответ на: комментарий от Anoxemian

Какие проблемы? 192.168.56.1 и 192.168.56.147 — машины в моей локалке. curl 192.168.56.1:720[1-2] стабильно выдаёт требуемый результат.

Если не знаешь анекдот, то версия конца 1990-х - начала 2000-х звучала примерно так: «Британские школы выражают беспокойство в связи с ширящимся увлечением PHP среди учащихся. Родители требуют принять меры по борьбе с этим новым наркотиком.»

olegd ★★★
() автор топика

Но так как обслуживаемый клиент не умеет пользоваться куками, а Traefik не умеет без них организовывать «липкие» сессии, а балансировка сводится к dynamic/weighted round robin, всё это оказалось бесполезно. Для аутентификации нужно послать 6 запросов на один и тот же сервер. А они всегда идут на разные.

olegd ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.