gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:12:46 24 4
gpt4 key购买 nike

我正在尝试将两个 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 接口(interface)。主机 1 的 IP 为 10.10.10.10,主机 2 的 IP 为 10.10.10.20。我已经运行了 iperf 以确保它们可以相互连接。

有什么想法吗?

最佳答案

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

我按照 etcd documentation 中的说明进行操作并将其应用于我的情况。我没有直接从命令行运行带有所有选项的 etcd,而是创建了一个简单的 bash 脚本。这使得调整选项和重新运行命令变得容易得多。一旦找到正确的选项,将它们单独放置在配置文件中并将 etcd 作为服务运行会很方便,如 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

关于linux - 无法使用 etcd 设置多主机 Docker 覆盖网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36523936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com