Machine: Après le changement d'adresse IP, l'agent swarm doit également modifier l'adresse de jointure.

Créé le 18 mars 2015  ·  4Commentaires  ·  Source: docker/machine

Après plus de tests PR #770, j'ai trouvé ceci :

Je détecte un autre problème d'IP modifié après avoir redémarré mon cluster swarm ec2 aujourd'hui.

Le maître utilise les anciennes adresses IP des machines en essaim

time="2015-03-18T18:23:54Z" level=error msg="Get https://54.69.29.90:2376/v1.15/info: dial tcp 54.69.29.90:2376: i/o timeout" 
time="2015-03-18T18:23:54Z" level=error msg="Get https://54.69.230.35:2376/v1.15/info: dial tcp 54.69.230.35:2376: i/o timeout" 
time="2015-03-18T18:23:54Z" level=error msg="Get https://54.69.255.39:2376/v1.15/info: dial tcp 54.69.255.39:2376: i/o timeout" 
time="2015-03-18T18:23:54Z" level=error msg="Get https://52.10.167.59:2376/v1.15/info: dial tcp 52.10.167.59:2376: i/o timeout" 

J'analyse le problème :

L'agent swarm est joint à l'ancienne ip 52.10.167.59

$ docker-machine ls
NAME               ACTIVE   DRIVER       STATE     URL                        SWARM
amazonec2-03                amazonec2    Stopped                              
dev                         virtualbox   Stopped                              
ec2-swarm-01                amazonec2    Running   tcp://54.149.27.239:2376   ec2-swarm-master
ec2-swarm-02                amazonec2    Running   tcp://52.10.108.31:2376    ec2-swarm-master
ec2-swarm-03       *        amazonec2    Running   tcp://54.148.5.178:2376    ec2-swarm-master
ec2-swarm-master            amazonec2    Running   tcp://52.11.98.189:2376    ec2-swarm-master (master)
$ $(docker-machine env ec2-swarm-master)
$ docker ps --no-trunc
CONTAINER ID                                                       IMAGE               COMMAND                                                                                                                                                                                          CREATED             STATUS              PORTS                              NAMES
13d27667155b3b1962b99b8d817c7a9865b47fe5b0d5d9c0af08735b26163efa   swarm:latest        "/swarm join --addr 52.10.167.59:2376 token://5a57a53a13470b1e680c6904ce5b34d1"                                                                                                                  35 hours ago        Up 11 minutes       2375/tcp                           swarm-agent          
810f7ce04b6439c191470a2116197088ee2a3d2e5ed1cc7f4742aacef46317f9   swarm:latest        "/swarm manage --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:3376 token://5a57a53a13470b1e680c6904ce5b34d1"   35 hours ago        Up 11 minutes       2375/tcp, 0.0.0.0:3376->3376/tcp   swarm-agent-master   
$ docker-machine ip ec2-swarm-master
52.11.98.189

Une fois l'adresse IP de la machine swarm modifiée, l'implémentation doit reconfigurer l'agent swarm, supprimer l'ancien conteneur et en démarrer un nouveau.

areswarm driveec2

Commentaire le plus utile

Voici ma solution de contournement après avoir changé l'adresse IP du nœud docker swarm :

% docker-machine env docker-node
% docker-machine regenerate-certs docker-node
(I sometimes need to run multiple times when error occurs.)
% eval $(docker-machine env docker-node)
% export TOKEN=$(docker inspect -f "{{ index .Config.Cmd 3}}" swarm-agent)
% docker rm -f swarm-agent
% docker run -d --name=swarm-agent --restart=always swarm:latest join --advertise "${DOCKER_HOST##tcp://}" "${TOKEN}"

Tous les 4 commentaires

La seule solution rapide est actuellement de recréer l'agent avec ce petit script :

créer-swam-agent.sh

#!/bin/bash
TOKEN=$(docker inspect -f "{{ index .Config.Cmd 3 }}" swarm-agent)
IP=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
docker stop swarm-agent
docker rm swarm-agent
docker run -d --name swarm-agent --restart=always swarm \
  join --addr ${IP}:2376 \
  ${TOKEN}

Je pense qu'à plus long terme, nous devrons prendre en charge une sorte de "synchronisation" avec le magasin de configuration, je ne sais pas si le service de découverte de jetons Docker Hub prendrait en charge la modification des adresses IP du cluster, mais je suis sûr que les backends KV le feraient.

cc @aluzzardi @vieux @abronan Comment envisagez-vous le workflow pour ce cas (changement d'IP dans l'essaim) ?

@nathanleclaire Les entrées dans le K/V sont supprimées après l'expiration du TTL (les nœuds sont supprimés de la découverte). Donc si les IP changent, le store reflétera correctement l'état du cluster après un arrêt/redémarrage (sur EC2 par exemple). Néanmoins, vous pouvez vous attendre à ce que les anciennes entrées soient répertoriées pendant un certain temps jusqu'à ce que leur durée de vie expire (si vous avez 3 machines, attendez-vous à en avoir 6 répertoriées même si les anciennes entrées seront marquées comme non saines et ne pourront pas être utilisées dans l'essaim )

En guise de solution de contournement, si la machine sait qu'une instance redémarre, elle peut directement supprimer l'entrée dans le K/V pour ne pas répertorier les machines avec des adresses IP erronées après un redémarrage.

Voici ma solution de contournement après avoir changé l'adresse IP du nœud docker swarm :

% docker-machine env docker-node
% docker-machine regenerate-certs docker-node
(I sometimes need to run multiple times when error occurs.)
% eval $(docker-machine env docker-node)
% export TOKEN=$(docker inspect -f "{{ index .Config.Cmd 3}}" swarm-agent)
% docker rm -f swarm-agent
% docker run -d --name=swarm-agent --restart=always swarm:latest join --advertise "${DOCKER_HOST##tcp://}" "${TOKEN}"
Cette page vous a été utile?
0 / 5 - 0 notes