我正在尝试使用覆盖网络连接两个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
以确保它们可以相互连接。
有什么想法吗?
答案 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
二进制文件。在第二台主机上,我做了同样的事情,但将--name
从infra0
更改为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>