Моя настройка следующая. У нас есть 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"
Мне не хватает какой-либо конфигурации или мне нужно много настроек, особенно на уровне контейнера?