web-dev-qa-db-ja.com

Traefikを使用するDockerSwarmWindowsワーカーがゲートウェイタイムアウトを返す

目的は、LinuxサーバーとDocker ForWindowsを実行しているWindows10マシンを使用して混合OSDockerスウォームを実行することです。

現在、Windowsワーカーは、-endpoint-modeフラグが「dnsrr」に設定されている場合、混合OSスウォームで理論的にサポートされています。これは説明されています ここ 。ただし、traefikを使用して単純なdocker whoamiイメージにルーティングしようとすると stefanscherer/whoami イメージが失敗しました。

最小限の失敗例

// On (Linux) Manager Node:
docker swarm init --advertise-addr <hostaddress> --listen-addr <hostaddress>:2377

// On (Windows 10) Worker Node:
docker swarm join <jointoken>

// On Manager Node:
docker network create --driver=overlay traefik-net

docker service create \
    --name traefik \
    --constraint=node.role==manager \
    --publish 80:80 --publish 8080:8080 \
    --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
    --network traefik-net \
    traefik \
    --docker \
    --docker.swarmmode \
    --docker.domain=traefik \
    --docker.watch \
    --web

docker service create \
    --name whoami \
    --label traefik.enable=true \
    --label traefik.frontend.rule=Host:whoami.docker \
    --label traefik.protocol=http \
    --label traefik.docker.network=traefik-net \
    --label traefik.backend.loadbalancer.method=drr \
    --label traefik.backend=whoami \
    --network traefik-net \
    --mode global\
    --label traefik.port=80 \
    stefanscherer/whoami

Traefikはバックエンドルールを正常に設定しました。ルーティングを確認するために、traefikダッシュボードを使用して、ルールによってルーティングされるURLを見つけました。 「10.0.0.12:8080」。次に、これを各タスクのIPアドレスと比較します。タスクは、docker service psで表示でき、アドレス 'は

docker inspect <taskID> \
    --format '{{ range .NetworksAttachments }}{{ .Addresses }}{{ end }}'

問題

ヘッダー「Host:whoami.docker」がマネージャーのIPに送信されたHTTPリクエストは、マネージャーにルーティングされると成功し、WindowsワーカーのWindowsタスクにルーティングされると504ゲートウェイタイムアウトで失敗します。

29
Matt Hawes

Whoamiサービスへの--endpoint-mode = dnsrrの設定がありません。

docker service create \
--name whoami \
--label traefik.enable=true \
--label traefik.frontend.rule=Host:whoami.docker \
--label traefik.protocol=http \
--label traefik.docker.network=traefik-net \
--label traefik.backend.loadbalancer.method=drr \
--label traefik.backend=whoami \
--network traefik-net \
--mode global\
--label traefik.port=80 \
--endpoint-mode=dnsrr
stefanscherer/whoami

エンドポイントモードdnsrrを設定すると、VIPアドレスが無効になり、おそらく問題が発生します。

2
Miq

stefanscherer/whoami画像を使用したときに同じ問題が発生しました。ただし、Microsoft/dotnet-samples:aspnetappの使用は機能するため、エラーは画像に関連しているようです。

私は次の設定を使用しています:

buntu 16.04

  • Docker 18.03.1-ce
  • マネージャーとして実行
  • Traefikを実行します

Windows 18

  • Docker 18.03.1-ee-2
  • ワーカーとして実行(マネージャーとして参加しなかった)
  • Microsoft/dotnet-samples:aspnetappを実行します
0
Dresel