无法使用etcd设置多主机Docker覆盖网络

时间:2016-04-09 23:25:15

标签: linux networking docker etcd

我正在尝试使用覆盖网络连接两个Docker主机并使用etcd作为KV存储。 etcd直接在第一台主机上运行(不在容器中)。我终于设法将第一台主机的Docker守护进程连接到etcd,但无法在第二台主机上建立连接Docker守护进程。

我从Github releases页面下载了etcd,并按照“Linux”部分下的说明进行操作。 启动etcd后,它正在侦听以下端口:

etcdmain: listening for peers on http://localhost:2380
etcdmain: listening for peers on http://localhost:7001
etcdmain: listening for client requests on http://localhost:2379
etcdmain: listening for client requests on http://localhost:4001

我在第一台主机上启动了Docker守护程序(也运行了etcd),如下所示:

docker daemon --cluster-advertise eth1:2379 --cluster-store etcd://127.0.0.1:2379

之后,我还可以创建一个覆盖网络:

docker network create -d overlay <network name>

但我无法弄清楚如何在第二台主机上启动守护进程。无论我为--cluster-advertise--cluster-store尝试了哪些值,我都会收到以下错误消息:

discovery error: client: etcd cluster is unavailable or misconfigured

我的主机都在使用eth1界面。 host1的IP为10.10.10.10,host2的IP为10.10.10.20。我已经运行iperf以确保它们可以相互连接。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

所以我终于想出了如何连接这两台主机,说实话,我不明白为什么我花了这么长时间来解决这个问题。但如果其他人遇到同样的问题,我会在这里发布我的解决方案。如前所述,我从Github release page下载了etcd并解压缩了tar文件。

我按照etcd documentation的说明将其应用到我的情况中。我没有直接从命令行运行带有所有选项的etcd,而是创建了一个简单的bash脚本。这使得调整选项和重新运行命令变得更加容易。一旦找到正确的选项,将它们分别放在配置文件中并在this tutorial中将etcd作为explainind作为服务运行是很方便的。所以这是我的bash脚本:

#!/bin/bash

./etcd --name infra0 \
  --initial-advertise-peer-urls http://10.10.10.10:2380 \
  --listen-peer-urls http://10.10.10.10:2380 \
  --listen-client-urls http://10.10.10.10:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.10.10.10:2379 \
  --initial-cluster-token etcd-cluster-1 \
  --initial-cluster infra0=http://10.10.10.10:2380,infra1=http://10.10.10.20:2380 \
  --initial-cluster-state new

我将此文件放在etcd-vX.X.X-linux-amd64目录(我刚刚下载并解压缩)中,该目录还包含etcd二进制文件。在第二台主机上,我做了同样的事情,但将--nameinfra0更改为infra1,并将IP调整为第二台主机(10.10.10.20)。 <{1}}选项未被修改。

然后我先在host1上执行脚本,然后在host2上执行。我不确定订单是否重要,但在我的情况下,当我反过来时,我收到了一条错误消息。

要确保您的群集设置正确,您可以运行:

--initial-cluster

如果输出看起来类似于此(列出两个成员),它应该可以工作。

./etcdctl cluster-health

如果您想确定,请在host1上为商店添加值并在host2上检索它:

member 357e60d488ae5ab3 is healthy: got healthy result from http://10.10.10.10:2379
member 590f234979b9a5ee is healthy: got healthy result from http://10.10.10.20:2379

设置泊坞窗覆盖网络

为了设置docker overlay网络,我必须使用host1$ ./etcdctl set myKey myValue host2$ ./etcdctl get myKey --cluster-store选项重新启动Docker守护程序。我的解决方案可能不是最干净的,但它有效。因此,在两台主机上首先停止了docker服务,然后使用以下选项重新启动守护程序:

--cluster-advertise

请注意,在host2上需要调整IP地址。然后我在其中一个主机上创建了这样的覆盖网络:

sudo service docker stop
sudo /usr/bin/docker daemon --cluster-store=etcd://10.10.10.10:2379 --cluster-advertise=10.10.10.10:2379

如果一切正常,现在可以在另一台主机上看到覆盖网络。请检查此命令:

sudo docker network create -d overlay <network name>