加入位于不同 Docker 容器中的 serf 节点时出现问题

2023-12-26

上下文:主机是 AWS-EC2 / Ubuntu 14.04.5,带有 Docker 版本 17.05.0-ce。容器是根据公开可用的存储库映像构建的cbhihe/serf-alpine-bash。所有容器都位于同一个 EC2 实例上,并与网络接口“docker0”共享相同的默认桥接网络。

尝试通过从主机的 shell 传递 cmd 来加入节点 serfDC1 (id d4fd90692e18) 和 serfDC2 (id 6353e7f6134d):

$ 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

发现 Node1 容器的 IP=172.17.0.4 后,我可以发出serf agent -joincmd 到节点2:

$ 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

导致加入失败,如下所示:

$ 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 节点需要用可路由的地址“宣告”自己。在你的情况下,他们互相告诉对方:“嗨,我是本地主机:...”,所以每个人都试图回答本地主机,这是错误的,因为每个容器都有自己的本地主机。

有一个选项可以配置代理以使用eth0ip 向网络中的其他节点通告:-iface。然后你需要丢弃-bind选项。这些端口是默认的,因此无需自定义。

因此,对于节点1:

serf agent -node=Node1 -iface=eth0

对于节点2:

serf agent -node=Node2 -join=172.17.0.2 -iface=eth0

From docs https://www.serf.io/docs/agent/options.html:

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

它对我来说工作正常:

Node1:

==> 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:

==> 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

Edit:

如果每个容器都在自己的VM(EC2实例)中,则由于每个实例都有自己的docker网络并且不互连,因此您必须提供EC2实例IP并公开相应的端口。使用-advertise https://www.serf.io/docs/agent/options.html#advertise

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

Node1:

serf agent -node=Node1 -iface=eth0 -advertise=INSTANCE_IP

Node2:

serf agent -node=Node2 -join=NODE1_INSTANCE_IP -iface=eth0

并记住expose农奴口在docker run

docker run -p 7946:7946 (...rest of the command...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加入位于不同 Docker 容器中的 serf 节点时出现问题 的相关文章

随机推荐

  • UIAutomation:在没有实际执行的情况下点击警报视图上的取消按钮

    我在 UIAutomation 中面临这个奇怪的问题 我正在检查警报 在其中 我试图记录警报标题和警报消息 我的代码是 UIATarget onAlert function onAlert alert UIALogger logMessag
  • 将文本文件写入 blob 时无法保留换行符

    我有一个文本区域 其中包含我想要输出到文本文件以供用户下载的文本 当用户单击 保存 按钮时 我使用此功能来获取它 function saveTextAsFile var textToWrite document getElementById
  • NodeJS 中的提示模块重复输入

    我正在使用 NodeJS 及其 CLI 应用程序创建一个应用程序 为了获取用户的输入 我使用 提示 模块 我可以使用它 但是在输入提示符时 每个字符都会重复 但是输出很好 代码如下 请帮忙 prompt start prompt get p
  • 使用身份主键将新实体插入到上下文中

    我想将一条新记录插入到我的 SQL 表中 我试过 public void CreateComment int questionId string comment QuestionComment questionComment context
  • 如何删除Github上和本地的最后n次提交?

    我正在尝试从我的 GitHub 存储库之一删除最后 2 次提交 我已经按照建议尝试了here https stackoverflow com questions 448919 how can i remove a commit on git
  • Yesod、WebSockets 和持久性

    我正在尝试在 Haskell 中实现一个基于回合的游戏的服务器 我的选择是使用 Yesod 进行管理和元信息 例如 用户参与哪些游戏等 我想使用网络套接字来保持游戏内数据开销较小 看看 ws chat 示例 我不确定如何访问 Handler
  • lockCanvas 不断抛出异常

    我从 opencv4android 人脸检测 复制了示例代码 我通过了NDK部分 并在手机上运行该应用程序 然而 SurfaceView 仅显示相机预览 看来 OnCameraFrame 中所做的任何操作都不会影响 SurfaceView
  • C# - 使用反射比较两个 .net dll

    我想比较位于不同位置的两个相同的 net dll 因此 我使用加载 dllSystem Reflection Assembly LoadFile filename 代替System Reflection Assembly LoadFrom
  • Pod 文件中的“平台”指的是什么?

    当你在顶部创建一个新的 pod 文件时 会有 platform ios 9 0 我应该将此 平台 值设置为我的项目的部署目标吗 它指定您要支持 pod 项目的最低操作系统版本 如果您的应用程序项目的部署目标低于提到的 pod 项目的 iOS
  • ThreadPoolExecutor:: 来自执行器的 TaskRejectedException

    我的应用程序正在通过 Jms MessageListener 类读取消息 并且在某个时间点它会抛出异常任务拒绝异常 我知道你们大多数人都会说线程数超出了最大池大小而且队列也满了 但我观察到一些事情 发送到 MessageListener 类
  • 创建与数据库表同名的缓冲区

    我在很多地方都遇到过这段代码 DEFINE BUFFER Customer FOR Customer 我有两个问题 这样做的目的是什么 为什么创建与表同名的缓冲区是有益的 当编写代码访问该表 缓冲区时 Progress 如何知道是直接访问
  • Foreman 不使用 NGINX

    我正在尝试使用Foreman https github com ddollar foreman 版本 0 31 0 来管理我们应用程序的进程 但我对 nginx nginx 1 0 10 Phusion Passenger 3 0 11 的
  • 为什么 C 代码中的 1.0f 在生成的程序集中表示为 1065353216?

    在 C 中我有这个代码块 if x 1 a j i 1 else a j i 0 a是一个浮点值矩阵 如果我尝试以 nasm 语法查看此代码的编译程序集 线a j i 0 作业 以这种方式编码 dword rsi rdi 0 但这条线a j
  • Java 中箭头运算符“->”有什么作用?

    在搜索一些代码时 我遇到了箭头运算符 它到底是做什么的 我以为Java没有箭头运算符 return Collection
  • Entity Framework 5 的新迁移功能是否完全支持枚举更改?

    假设我们有以下简单模型 public class Car public int Year get set public string Make get set public string Model get set public CarTy
  • 如何编辑 jquery 函数

    我正在尝试修改 jQuery V 6 1 核心中的 attr 函数 我有一个plugins js 文件 该文件包含在jquery 6 1 js 文件之后的页面中 plugins js 文件包含对各种 jQuery 核心函数的改进 以适应某些
  • Scrapy获取任何网站的所有链接

    我有以下 Python 3 网络爬虫代码 import requests from bs4 import BeautifulSoup import re def get links link return links r requests
  • C++ 使用构造函数参数初始化成员数组

    我有一个模板类 其中包含编译时常量长度的单个成员数组 我希望这个数组是常量 但根据构造函数提供的输入初始化它被证明很困难 struct Input int value template
  • 正则表达式:理解音节计数器代码

    我用过迪伦的问题 https stackoverflow com questions 5686483 how to compute number of syllables in a word in javascript这里关于 JavaSc
  • 加入位于不同 Docker 容器中的 serf 节点时出现问题

    上下文 主机是 AWS EC2 Ubuntu 14 04 5 带有 Docker 版本 17 05 0 ce 容器是根据公开可用的存储库映像构建的cbhihe serf alpine bash 所有容器都位于同一个 EC2 实例上 并与网络