将etcd集群自动配置为Docker swarm服务

drd*_*man 18 deployment configuration docker etcd docker-swarm-mode

我想找到一种方法将etcd集群部署为Docker Swarm服务,该服务将自动配置而无需任何交互.基本上,我想到了这个命令的精神:

docker service create --name etcd --replicas 3 my-custom-image/etcd
Run Code Online (Sandbox Code Playgroud)

我假设覆盖网络配置为安全并提供加密和身份验证,所以我相信我不需要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,它就会自动做正确的事情,没有问题就是这样".

有什么技巧可以拉吗?

ffe*_*ast 3

正如您正确所说,您知道节点\xe2\x80\x99 容器的 IP,因此建议的技巧是简单地将所需名称构建etcd为每个节点\xe2\x80\x99s IP 地址的派生物。

\n\n
    \n
  • 每个容器内部etcd都使用该特定容器的 IP 进行命名,即etcd-$ip
  • \n
  • ETCD_INITIAL_CLUSTER以类似的方式使用其他容器的 IP 进行填充
  • \n
\n\n

名称可以简单etcd-$ip甚至更好,即我们可以使用 来netmask计算该网络上的节点\xe2\x80\x99s IP,以使名称更漂亮。

\n\n

在这种情况下,在一个简单的 3 节点配置中,最终可能会具有诸如等的etcd-02 etcd-03名称

\n\n

name属性没有具体要求,只需唯一且人类可读即可。虽然它确实看起来像一个技巧,但它可能会起作用

\n