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

Cannot setup multi-host Docker overlay network with 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 以确保它们可以相互连接。

有什么想法吗?

所以我终于想出了如何连接两台主机,老实说,我不明白为什么我花了这么长时间才解决这个问题。但如果其他人 运行 遇到同样的问题,我将 post 我的解决方案放在这里。如前所述,我从 Github release page 下载了 etcd 并提取了 tar 文件。

我遵循了 etcd documentation and applied it to my situation. Instead of running etcd with all the options directly from the command line I created a simple bash script. This makes it a lot easier to adjust the options and rerun the command. Once you figured out the right options it would be handy to place them separately in a config file and run etcd as a service as explaind in this tutorial 的说明。所以这是我的 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)。 --initial-cluster 选项未修改。

然后我先在host1上执行脚本,然后在host2上执行脚本。我不确定顺序是否重要,但就我而言,当我以相反的方式执行时收到错误消息。

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

./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

如果您想真正确定,请在 host1 上向您的商店添加一个值并在 host2 上检索它:

host1$ ./etcdctl set myKey myValue
host2$ ./etcdctl get myKey

设置docker覆盖网络

为了设置 docker 覆盖网络,我不得不使用 --cluster-store--cluster-advertise 选项重新启动 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 ls