Помогите, пожалуйста, разобраться с конфигом 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 запросов на один и тот же сервер. А они всегда идут на разные.