作为Docker Swarm服务的etcd集群的自动自配置

18

我希望找到一种方法来部署一个etcd集群作为Docker Swarm服务,它可以自动配置而不需要任何交互。基本上,我想到的是这个命令的精神:

docker service create --name etcd --replicas 3 my-custom-image/etcd

我假设叠加网络已配置为安全,并提供加密和身份验证,因此我认为我不需要TLS,甚至不需要--auto-tls。不想在寻找证书的方法时增加额外的麻烦,因为这可以在另一层上解决。
我需要每个实例的唯一--name,但可以通过入口脚本获取它,该脚本将使用export ETCD_NAME=$(hostname --short)
问题是,我卡在了初始配置上。根据集群指南,有三个选项,但似乎都不适用。
  • DNS发现场景最接近我正在寻找的内容,但是Docker目前不支持DNS SRV记录发现。我可以查找etcd,并获得我的节点容器的所有IP,但没有_etcd-server._tcp记录。
  • 我无法自动构建ETCD_INITIAL_CLUSTER,因为虽然我知道IP地址,但我不知道其他节点的名称,也不知道任何找到它们的方法。(我不会将Docker API套接字暴露给etcd容器来完成这个任务。)
  • 没有预先存在的etcd集群,虽然从discovery.etcd.io提供初始配置URI是一个可能的解决方法,但我不想这样做。我旨在实现“只需部署此docker-compose.yml堆栈,它将自动执行正确的操作,无需询问”的no-brainer场景。

有什么诀窍可以使用吗?

2个回答

3
正如您所说,您知道节点容器的IP地址,因此建议的技巧是仅使用每个节点的IP地址派生所需的etcd名称。
  • 在每个容器内,etcd的名称以特定容器的IP命名,即etcd-$ip
  • ETCD_INITIAL_CLUSTER也是以类似的方式使用其他容器的IP填充的
名称可以非常简单,如etcd-$ip,或者更好的方法是使用netmask计算该网络上节点的IP地址,以使名称更加美观。
在这种情况下,在一个简单的三节点配置中,可能会出现像etcd-02etcd-03等名称。 name属性没有具体要求,只需要是唯一的且易读的。虽然看起来像是技巧,但这确实可行。

1
服务容器更新时IP地址不会改变吗?如果容器被删除,然后在同一节点上启动(因此仍具有相同的数据卷),但它认为自己与之前不同,那将很奇怪。我认为名称的重点是即使网络标识符可能会更改,名称仍然存在,以便节点知道它们的对等方仍然是相同的。 - drdaeman

0

我也在寻找一个简单的解决方案来创建Docker Swarm etcd集群,后来发现了这个 repo

该存储库包含一个run.sh Bash脚本,通过与节点“乒乓球”交互来构建advertise-client-urls参数和初始集群,实现“魔术”操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接