Traefik не передает соединение через websocket службе, работающей на ECS - PullRequest
0 голосов
/ 29 мая 2019

Моя настройка следующая. У нас есть ECS (AWS) и сервисы, работающие в кластере ECS. Недавно мы развернули службу, которая поддерживает конечные точки REST и WebSocket. REST apis работает как положено. Проблема заключается в установлении соединения WebSocket. Между Application Load Balancer и службами у нас настроен Traefik (v1.7) для передачи запросов к службам и извлечения части URL-адреса до того, как запрос достигнет службы.

Поток запросов выглядит следующим образом:

Client <--- (wss/https) ---> ALB (AWS) - SSL offloading <--- (ws/http) ---> Traefik <--- (ws/http) ---> Service

Я попытался зарегистрировать сервис напрямую в ALB в AWS и мог установить соединение WebSocket, поэтому в Traefik что-то не передает прокси-соединение WebSocket со службой. Я искал все проблемы с Traefik и WebSocket, но в основном ответ был таков: вам не нужно настраивать Traefik для работы с WebSockets, он поддерживается «из коробки». Я пробовал различные настройки, передавая дополнительные метки контейнеру, но, похоже, ничего не работает.

Вот ярлыки, которые я передаю этой конкретной услуге. Для этого конкретного сервиса я добавил traefik.wss.protocol: "http" и traefik.backend.loadbalancer.stickiness: "true", но это не помогло. Для других служб, которые используют только http, конфигурация работает без добавления этих двух дополнительных конфигураций.

traefik.frontend.rule:
  Fn::Sub: "PathPrefixStrip: /${ServiceName}"
traefik.enable: "true"
traefik.protocol: "http"
traefik.wss.protocol: "http" <---------------------- ADDED
traefik.backend.loadbalancer.method: "wrr"
traefik.backend.loadbalancer.stickiness: "true" <--- ADDED
traefik.backend.healthcheck.path: "/health"
traefik.backend.healthcheck.interval: "10s"

Моя конфигурация Traefik:

debug = true

logLevel = "DEBUG"

defaultEntryPoints = ["http", "https"]

[accessLog]

[entryPoints]
  [entryPoints.http]
  address = ":80"
  compress = true
  [entryPoints.webadmin]
  dashboard = true
  address = ":8080"
    [entryPoints.webadmin.auth]
      [entryPoints.webadmin.auth.basic]
      users = ["BASIC_AUTH"]
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.redirect]
    entryPoint = "http"

[file]
  watch = true

[metrics]
  [metrics.influxdb]
  address = "INFLUXDB_HOST:INFLUXDB_PORT"
  pushinterval = "10s"

[api]
  entryPoint = "webadmin"

[ping]
  entryPoint = "http"

[lifeCycle]
  requestAcceptGraceTimeout = "10s"

[ecs]
  clusters = ["CLUSTER_HOST"]
  watch = true
  domain = "DOMAIN"
  autoDiscoverClusters = false
  refreshSeconds = 15
  exposedByDefault = false
  region = "AWS_REGION"

Мне не хватает какой-либо конфигурации или мне нужно много настроек, особенно на уровне контейнера?

...