После дополнительного тестирования PR # 770 я обнаружил следующее:
Я обнаружил еще одну проблему с измененным IP-адресом после перезапуска кластера swarm ec2 сегодня.
Мастер использует старые ip от роевых машин
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"
Анализирую проблему:
Агент роя соединяется со старым 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
После изменения IP-адреса машины роя реализация должна перенастроить агент роя, удалить старый контейнер и запустить новый.
Единственное быстрое решение - воссоздать агент с помощью этого крошечного скрипта:
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}
Я думаю, что в долгосрочной перспективе нам придется поддерживать какую-то «синхронизацию» с хранилищем конфигурации, я не знаю, будет ли служба обнаружения токенов Docker Hub поддерживать изменение IP-адресов кластера, но я уверен, что серверные части KV будут.
cc @aluzzardi @vieux @abronan Как бы вы себе представляли рабочий процесс для этого случая (изменение IP-адресов в рое)?
@nathanleclaire Записи в K / V удаляются по истечении TTL (узлы удаляются из обнаружения). Таким образом, если IP-адреса меняются, хранилище будет правильно отражать состояние кластера после остановки / перезапуска (например, на EC2). Тем не менее, вы можете ожидать, что старые записи будут перечислены в течение некоторого времени, пока их TTL не истечет (если у вас есть 3 машины, ожидайте, что в списке будет 6 из них, даже если старые записи будут помечены как нездоровые и не могут быть использованы в Swarm )
В качестве обходного пути, если Machine знает, что экземпляр перезагружается, он может напрямую удалить запись в K / V, чтобы не отображать машины с неправильными IP-адресами после перезапуска.
Вот мой обходной путь после изменения IP-адреса узла 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}"
Самый полезный комментарий
Вот мой обходной путь после изменения IP-адреса узла docker swarm: