首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接位于不同码头容器中的serf节点时发出的问题

连接位于不同码头容器中的serf节点时发出的问题
EN

Stack Overflow用户
提问于 2017-06-04 01:26:06
回答 1查看 671关注 0票数 2

上下文:主机是AWS-EC2 /Ubuntu14.04.5,带有Docker 17.05.0-ce版本。容器是由公开可用的回购映像cbhihe/serf-alpine-bash__构建的。所有容器都位于同一个EC2实例上,并与网络接口"docker0“共享相同的默认网桥网络。

通过从主机的外壳传递cmds,尝试连接节点serfDC1 (id d4fd90692e18)和serfDC2 (id 6353e7f6134d):

代码语言:javascript
复制
$ docker exec serfDC1 serf agent -node=Node1 -bind=0.0.0.0:7946
==> Starting Serf agent…
==> Starting Serf agent RPC...
==> Serf agent running!
         Node name: 'd4fd90692e18'
         Bind addr: '0.0.0.0:7946'
          RPC addr: '127.0.0.1:7373'
         Encrypted: false
          Snapshot: false
           Profile: lan
==> Log data will now stream in as it occurs:
    2017/06/04 00:01:10 [INFO] agent: Serf agent starting
    2017/06/04 00:01:10 [INFO] serf: EventMemberJoin: d4fd90692e18 127.0.0.1
    2017/06/04 00:01:11 [INFO] agent: Received event: member-join
    ^C

在发现节点1的容器的IP=172.17.0.4之后,我可以向Node2发出serf agent -join cmd:

代码语言:javascript
复制
$ docker exec serfDC2 serf agent -node=Node2 -join=172.17.0.4
==> Starting Serf agent...
==> Starting Serf agent RPC...
==> Serf agent running!
         Node name: '6353e7f6134d'
         Bind addr: '0.0.0.0:7946'
          RPC addr: '127.0.0.1:7373'
         Encrypted: false
          Snapshot: false
           Profile: lan
==> Joining cluster...(replay: false)
    Join completed. Synced with 1 initial agents
==> Log data will now stream in as it occurs:
    2017/06/04 00:18:35 [INFO] agent: Serf agent starting
    2017/06/04 00:18:35 [INFO] serf: EventMemberJoin: 6353e7f6134d 127.0.0.1
    2017/06/04 00:18:35 [INFO] agent: joining: [172.17.0.4] replay: false
    2017/06/04 00:18:35 [INFO] serf: EventMemberJoin: d4fd90692e18 127.0.0.1
    2017/06/04 00:18:35 [INFO] agent: joined: 1 nodes
    2017/06/04 00:18:36 [WARN] memberlist: Got ping for unexpected node 'd4fd90692e18' from=127.0.0.1:7946
    2017/06/04 00:18:36 [INFO] agent: Received event: member-join
    2017/06/04 00:18:37 [WARN] memberlist: Got ping for unexpected node d4fd90692e18 from=127.0.0.1:34876
    2017/06/04 00:18:37 [ERR] memberlist: Failed TCP fallback ping: EOF
    2017/06/04 00:18:37 [INFO] memberlist: Suspect d4fd90692e18 has failed, no acks received
    2017/06/04 00:18:38 [WARN] memberlist: Got ping for unexpected node 'd4fd90692e18' from=127.0.0.1:7946
    2017/06/04 00:18:39 [WARN] memberlist: Got ping for unexpected node d4fd90692e18 from=127.0.0.1:34879
    2017/06/04 00:18:39 [ERR] memberlist: Failed TCP fallback ping: EOF
    2017/06/04 00:18:40 [INFO] memberlist: Suspect d4fd90692e18 has failed, no acks received
    2017/06/04 00:18:41 [WARN] memberlist: Got ping for unexpected node 'd4fd90692e18' from=127.0.0.1:7946
    2017/06/04 00:18:42 [WARN] memberlist: Got ping for unexpected node d4fd90692e18 from=127.0.0.1:34881
    2017/06/04 00:18:42 [ERR] memberlist: Failed TCP fallback ping: EOF
    2017/06/04 00:18:42 [INFO] memberlist: Marking d4fd90692e18 as failed, suspect timeout reached (0 peer confirmations)
    2017/06/04 00:18:42 [INFO] serf: EventMemberFailed: d4fd90692e18 127.0.0.1
    2017/06/04 00:18:43 [INFO] agent: Received event: member-failed
    2017/06/04 00:18:44 [INFO] memberlist: Suspect d4fd90692e18 has failed, no acks received
    2017/06/04 00:19:05 [INFO] serf: attempting reconnect to d4fd90692e18 127.0.0.1:7946
   ^C

如以下所示,导致未能加入:

代码语言:javascript
复制
$ docker exec serfDC2 serf members
6353e7f6134d  127.0.0.1:7946  alive
d4fd90692e18  127.0.0.1:7946  failed  
$ docker exec serfDC1 serf members
d4fd90692e18  127.0.0.1:7946  alive 
6353e7f6134d  127.0.0.1:7946  failed

我已经做了很长一段时间了,不知该往哪里去。Hashicorp和Docker的文档似乎没有涵盖两个不同容器中的两个serf代理之间初始握手的这一方面。

,谁能告诉我我在哪里拐错了弯?,任何答案都会很好,真的。Tx。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-04 02:01:53

农奴节点需要用一个可路由的地址“宣布”自己。在您的示例中,它们互相告诉对方:“嗨,我是localhost:.”,所以每个容器都试图回答localhost,这是错误的,因为每个容器都有自己的localhost。

有一个选项可以将代理配置为使用eth0 ip向网络中的其他节点做广告:-iface。然后,您需要放弃-bind选项。这些端口是默认的,因此不需要自定义。

因此,对于node1:

代码语言:javascript
复制
serf agent -node=Node1 -iface=eth0

对于node2:

代码语言:javascript
复制
serf agent -node=Node2 -join=172.17.0.2 -iface=eth0

来自文档

-iface -此标志可用于提供绑定接口。如果接口是已知的,而不是地址,则可以使用它来代替-bind。

对我来说是正常的:

Node1:

代码语言:javascript
复制
==> Log data will now stream in as it occurs:

    2017/06/04 01:56:40 [INFO] agent: Serf agent starting
    2017/06/04 01:56:40 [INFO] serf: EventMemberJoin: Node1 172.17.0.2
    2017/06/04 01:56:41 [INFO] agent: Received event: member-join
    2017/06/04 01:57:02 [INFO] serf: EventMemberJoin: Node2 172.17.0.3
    2017/06/04 01:57:03 [INFO] agent: Received event: member-join

Node2:

代码语言:javascript
复制
==> Log data will now stream in as it occurs:

    2017/06/04 01:57:02 [INFO] agent: Serf agent starting
    2017/06/04 01:57:02 [INFO] serf: EventMemberJoin: Node2 172.17.0.3
    2017/06/04 01:57:02 [INFO] agent: joining: [172.17.0.2] replay: false
    2017/06/04 01:57:02 [INFO] serf: EventMemberJoin: Node1 172.17.0.2
    2017/06/04 01:57:02 [INFO] agent: joined: 1 nodes
    2017/06/04 01:57:03 [INFO] agent: Received event: member-join

编辑:

如果每个容器都在自己的VM (EC2实例)中,因为每个实例都有自己的停靠网络,并且没有互联,您必须提供EC2实例IP并公开相应的端口。使用-advertise

-advertise -广告标志用于更改我们向集群中的其他节点发布的地址。

Node1:

代码语言:javascript
复制
serf agent -node=Node1 -iface=eth0 -advertise=INSTANCE_IP

Node2:

代码语言:javascript
复制
serf agent -node=Node2 -join=NODE1_INSTANCE_IP -iface=eth0

并记住公开( docker run中的农奴端口)。

代码语言:javascript
复制
docker run -p 7946:7946 (...rest of the command...)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44349963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档