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

Linux 无法使用etcd设置多主机Docker覆盖网络,linux,networking,docker,etcd,Linux,Networking,Docker,Etcd,我试图用覆盖网络连接两台Docker主机,并使用etcd作为KV存储。etcd直接在第一台主机上运行(不在容器中)。我最终成功地将第一台主机的Docker守护程序连接到etcd,但无法在第二台主机上与Docker守护程序建立连接 我从页面下载了etcd,并按照“Linux”部分的说明进行操作。 启动etcd后,它正在侦听以下端口: etcdmain: listening for peers on http://localhost:2380 etcdmain: listening for peer

我试图用覆盖网络连接两台Docker主机,并使用
etcd
作为KV存储。etcd直接在第一台主机上运行(不在容器中)。我最终成功地将第一台主机的Docker守护程序连接到etcd,但无法在第二台主机上与Docker守护程序建立连接

我从页面下载了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>
我的两台主机都在使用
eth1
接口。主机1的IP为
10.10.10.10
,主机2的IP为
10.10.10.20
。我已经运行了
iperf
,以确保它们可以相互连接


有什么想法吗?

所以我终于找到了连接两台主机的方法,老实说,我不明白为什么我花了这么长时间才解决这个问题。但如果其他人遇到同样的问题,我会在这里发布我的解决方案。如前所述,我从下载了etcd并提取了
tar
文件

我遵循了经理的指示,并将其应用于我的情况。我没有直接从命令行运行带有所有选项的etcd,而是创建了一个简单的bash脚本。这使得调整选项和重新运行命令更加容易。一旦您找到了正确的选项,就可以方便地将它们分别放在配置文件中,并将etcd作为服务运行,如中所述。下面是我的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调整为第二台主机的IP(
10.10.10.20
)。
--initial cluster
选项未修改

然后我先在主机1上执行脚本,然后在主机2上执行脚本。我不确定顺序是否重要,但在我的情况下,当我以另一种方式执行时,我收到了一条错误消息

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

./etcdctl cluster-health
如果输出与此类似(列出了两个成员),则应该可以工作

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
如果您想真正确定,请在主机1上向您的存储添加一个值,然后在主机2上检索该值:

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

sudo service docker stop
sudo /usr/bin/docker daemon --cluster-store=etcd://10.10.10.10:2379 --cluster-advertise=10.10.10.10:2379
请注意,在host2上,需要调整IP地址。然后,我在其中一台主机上创建了如下覆盖网络:

sudo docker network create -d overlay <network name>
sudo docker network create -d overlay <network name>
sudo docker network ls