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

44u64gxh  于 2023-03-17  发布在  Docker
关注(0)|答案(2)|浏览(178)

我想找到一种方法来部署一个etcd集群作为Docker Swarm服务,无需任何交互就能自动配置自身。基本上,我认为这是这个命令的精神所在:

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

我假设覆盖网络被配置为安全的,并提供加密和身份验证,所以我相信我不需要TLS,甚至--auto-tls。不想额外的头痛找到一种方法来提供证书,当这可以在另一层上解决。
我需要每个示例都有一个唯一的--name,但是我可以从使用export ETCD_NAME=$(hostname --short)的入口点脚本中获得它。
问题是,我被初始配置卡住了。基于clustering guide,有三个选项,但似乎都不合适:

  • DNS发现场景最接近我正在寻找的,但目前是Docker doesn't support DNS SRV records发现。我可以查找etcd,并将获得我的节点容器的所有IP,但没有_etcd-server._tcp记录。
  • 我不能自动构建ETCD_INITIAL_CLUSTER,因为虽然我知道IP,但我不知道其他节点的名称,也不知道有什么方法可以计算出这些名称(我不打算为此向etcd容器公开Docker API套接字)。
  • 没有预先存在的etcd集群,虽然从www.example.com提供初始配置URIdiscovery.etcd.io是一个可能的解决方案,但我不想这样做。我的目标是“只需从这个docker-compose.yml部署一个堆栈,它将自动做正确的事情,不问任何问题”。

我能耍什么花招吗?

sqougxex

sqougxex1#

正如您正确地指出的,您知道节点容器的IP,因此建议的技巧是简单地构建所需的etcd名称作为每个节点IP地址的派生。

  • 在每个容器中,etcd使用此特定容器的IP命名,即etcd-$ip
  • ETCD_INITIAL_CLUSTER以类似的方式使用其他container的IP进行填充

名称可以像etcd-$ip一样简单,甚至更好,即我们可以使用netmask来计算此网络上节点的IP,以使名称更美观。
在本例中,在简单的3节点配置中,最终可能会使用etcd-02etcd-03等名称
对于name属性没有特定的要求,它只需要是唯一的和人类可读的。

gr8qqesn

gr8qqesn2#

我也在寻找Docker Swarm ETCD集群的简单解决方案,并找到了这个repo
存储库包含一个run.sh bash脚本,该脚本通过与节点玩“乒乓”游戏来完成构建advertise-client-urls参数和初始集群的“魔术”。

相关问题