web-dev-qa-db-fra.com

Docker Swarm Windows Worker avec Traefik renvoie le délai d'attente de la passerelle

L’objectif est d’obtenir un essaim mixte de systèmes d'exploitation Docker fonctionnant sous des serveurs Linux et des machines Windows 10 exécutant Docker pour Windows.

Actuellement, les travailleurs Windows sont théoriquement pris en charge sur des essaims OS mixtes à condition que l'indicateur --endpoint-mode soit défini sur 'dnsrr'. Ceci est expliqué ici . Cependant, les tentatives d'utilisation de traefik pour se rendre vers un simple menu fixe whoami image stefanscherer/whoami image ont échoué.

Exemple d'échec minimal

// 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 a configuré avec succès les règles du backend afin de vérifier le routage. J'ai utilisé le tableau de bord Traefik pour rechercher l'URL vers laquelle la règle est acheminée, par exemple. "10.0.0.12: 8080". Je compare ensuite cela avec l'adresse IP de chaque tâche, celle-ci peut être visualisée avec docker service ps, et leur adresse 'trouvée à l'aide de 

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

Le problème

Une demande HTTP avec un en-tête 'Host: whoami.docker' envoyée à l'adresse IP du gestionnaire réussira si elle est routée vers le gestionnaire et échouera avec 504 Gateway Timeout lorsqu'elle sera routée vers la tâche Windows sur l'agent Windows.

28
Matt Hawes

Vous manquez le paramètre --endpoint-mode = dnsrr à votre service whoami.

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

Si vous définissez dnsrr en mode point de terminaison, l'adresse VIP qui est probablement à l'origine du problème est désactivée.

2
Miq

J'ai eu le même problème lors de l'utilisation de l'image stefanscherer/whoami. Utiliser Microsoft/dotnet-samples:aspnetapp fonctionne cependant, donc l'erreur semble liée à l'image.

J'utilise la configuration suivante:

Ubuntu 16.04

  • Docker 18.03.1-ce
  • Exécuter en tant que gestionnaire
  • Courses traefik

Windows 1803

  • Docker 18.03.1-ee-2
  • Fonctionne en tant que travailleur (l'adhésion en tant que gestionnaire n'a pas fonctionné)
  • Lance Microsoft/dotnet-samples: aspnetapp
0
Dresel