Machine: 实例更改 ip 后,swarm 代理也必须更改加入地址。

创建于 2015-03-18  ·  4评论  ·  资料来源: docker/machine

经过更多测试 PR #770 我发现这个:

在我今天重新启动 swarm ec2 集群后,我检测到另一个更改的 IP 问题。

主人使用来自群机器的旧 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" 

我分析问题:

swarm 代理加入旧 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

在 swarm 机器的 IP 改变后,实现必须重新配置 swarm 代理,删除旧容器并启动一个新容器。

areswarm driveec2

最有用的评论

这是我更改 docker swarm 节点的 IP 地址后的解决方法:

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

所有4条评论

目前唯一的快速修复是使用这个小脚本重新创建代理:

创建-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 台机器,即使旧条目将被标记为不健康并且不能在 Swarm 中使用,也希望列出其中的 6 个)

作为一种解决方法,如果 Machine 知道实例正在重新启动,它可以直接删除 K/V 中的条目,以便在重新启动后不列出 IP 错误的机器。

这是我更改 docker swarm 节点的 IP 地址后的解决方法:

% 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}"
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

jimfleming picture jimfleming  ·  5评论

jrz picture jrz  ·  5评论

moander picture moander  ·  5评论

masaeedu picture masaeedu  ·  4评论

florentvaldelievre picture florentvaldelievre  ·  3评论