Machine: Después de cambiar la ip de la instancia, el agente de swarm también debe cambiar la dirección de unión.

Creado en 18 mar. 2015  ·  4Comentarios  ·  Fuente: docker/machine

Después de más pruebas PR # 770 encontré esto:

Detecto otro problema de IP modificado, después de reiniciar mi clúster swarm ec2 hoy.

El maestro usa las viejas ip de las máquinas Swarm

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" 

Analizo el problema:

El agente de enjambre se une con la antigua 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

Después de que cambia la IP de la máquina swarm, la implementación debe reconfigurar el agente swarm, quitar el contenedor antiguo y comenzar uno nuevo.

areswarm driveec2

Comentario más útil

Aquí está mi solución después de cambiar la dirección IP del nodo del enjambre de la ventana acoplable:

% 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}"

Todos 4 comentarios

La única solución rápida actualmente es volver a crear el agente con este pequeño script:

create-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}

Creo que a más largo plazo tendremos que admitir algún tipo de "sincronización" con el almacén de configuración, no sé si el servicio de descubrimiento de tokens de Docker Hub admitiría la modificación de las IP del clúster, pero estoy seguro de que los backends de KV lo harían.

cc @aluzzardi @vieux @abronan ¿Cómo imagina el flujo de trabajo para este caso (cambiar las direcciones IP en el enjambre)?

@nathanleclaire Las entradas en el K / V se eliminan después de la expiración del TTL (los nodos se eliminan del descubrimiento). Entonces, si las IP están cambiando, la tienda reflejará el estado del clúster correctamente después de una parada / reinicio (en EC2, por ejemplo). Aún así, puede esperar que las entradas antiguas aparezcan en la lista durante un tiempo hasta que expire su TTL (si tiene 3 máquinas, espere tener 6 de las enumeradas, aunque las entradas antiguas se marcarán como insalubres y no se pueden usar en Swarm )

Como solución alternativa, si la máquina es consciente de que una instancia se está reiniciando, podría eliminar directamente la entrada en el K / V para no enumerar las máquinas con direcciones IP incorrectas después de un reinicio.

Aquí está mi solución después de cambiar la dirección IP del nodo del enjambre de la ventana acoplable:

% 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}"
¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

BretFisher picture BretFisher  ·  5Comentarios

florentvaldelievre picture florentvaldelievre  ·  3Comentarios

diver-sity picture diver-sity  ·  4Comentarios

oobles picture oobles  ·  3Comentarios

iongion picture iongion  ·  4Comentarios