Traefik 无法负载平衡 docker 个副本

Traefik can't load balance docker replicas

我正在尝试 运行 docker-compose up --scale apiserver=2 但 Traefic 无法对 api 服务器进行负载平衡。我在仪表板上看到了这两个应用程序,但 traefic 只对第一个进行了负载平衡。当我检查日志时,我看到两个 nodejs 应用程序都已启动

apiserver_1_cff59924db38 | Listening on port 3000. ContainerId: a2793ccb-daee-4a73-b4d0-6cbccb616cb9
apiserver_2_2164f88b7ed4 | Listening on port 3000. ContainerId: a92f516a-d66c-4672-b1b9-e0d8e182b46f

当我检查 Traefik 仪表板时,我看到以下内容,

后端-api服务器-docker测试

|Server                |Weight|
|----------------------|------|
|http://172.18.0.3:3000| 1    |
|http://172.18.0.6:3000| 1    |


Load Balancer
Method wrr

然而,每当我点击 ${API_NAME} 时,我只会从第一个 API 服务器实例得到响应。这给了我第一台服务器的 UUID a2793ccb-daee-4a73-b4d0-6cbccb616cb9

这是我的 docker-compse.yml 文件

version: '3.6'
services:
    traefik:
        container_name: traefik
        image: traefik
        ports:
            - 80:80
            - 443:443
            - 8080:8080 #dashboard
        networks:
            - proxy
        environment:
            - DUCKDNS_TOKEN=${DUCKDNS_TOKEN}
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - ./traefik/traefik.toml:/traefik.toml
            - ./traefik/acme/acme.json:/etc/traefik/acme.json
            - ./log:/var/log/traefik
        labels:
            - traefik.enable=true
            - traefik.port=8080
            - traefik.frontend.rule=Host:${TRAEFIK_NAME}
        restart: unless-stopped

    apiserver:
        build: ./api-server
        networks:
            - proxy
        labels:
            - traefik.frontend.rule=Host:${API_NAME}
            - traefik.frontend.entryPoints=https
            - traefik.docker.network=proxy
            - traefik.protocol=http
            - traefik.enable=true
            - traefik.port=3000
        restart: unless-stopped

    website:
        container_name: website
        build: ./website
        networks:
            - proxy
        labels:
            - traefik.frontend.rule=Host:${DOMAIN_NAME}
            - traefik.frontend.entryPoints=https
            - traefik.docker.network=proxy
            - traefik.protocol=http
            - traefik.enable=true
            - traefik.port=80
        restart: unless-stopped

networks:
    proxy:
        name: proxy

traefik.toml

debug = true
logLevel = "DEBUG"
checkNewVersion = true
defaultEntryPoints = ["http", "https"]

[api]
  # Name of the related entry point
  #
  # Optional
  # Default: "traefik"
  #
  entryPoint = "traefik"

  # Enable Dashboard
  #
  # Optional
  # Default: true
  #
  dashboard = true

[entryPoints]
  [entryPoints.http]
    address = ":80"
    [entryPoints.http.redirect]
      entryPoint = "https"
  [entryPoints.https]
    address = ":443"
    [entryPoints.https.tls]

[docker]
  endpoint = "unix:///var/run/docker.sock"
  exposedbydefault = false
  watch = true

[acme]
  email = "email@address.com"
  storage = "/etc/traefik/acme.json"
  entryPoint = "https"
  acmeLogging = false
  [acme.dnsChallenge]
    provider = "duckdns"
    delayBeforeCheck = 0

[[acme.domains]]
  main = "*.mydomain.duckdns.org"
  sans = ["mydomain.duckdns.org"]

Traefik 将为您的应用程序负载平衡网络连接。然而,Web 浏览器将保持持久的网络连接并将其重新用于未来的请求。最终结果是您将看到多个客户端负载平衡,但单个 Web 浏览器将一直访问相同的后端,直到该持久连接关闭。

curl 起作用的原因是每次 curl 退出时它都会关闭网络连接,类似于多个客户端的行为。