2017-06-04 138 views
18

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

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

我假设覆盖网络配置是安全的,并提供加密和认证,所以我相信我不需要TLS,甚至没有--auto-tls。不希望额外的头痛找到配置证书的方式,这可以在另一层上解决。

对于每个实例,我都需要一个独特的--name,但是我可以从使用export ETCD_NAME=$(hostname --short)的入口点脚本中获得。

问题是,我卡在初始配置。基于该clustering guide有三个选项,但没有一个似乎适合:

  • 的DNS发现的情况是最接近于我正在寻找,但码头工人此刻doesn't support DNS SRV records发现。我可以查询etcd,我将获取节点容器的所有IP,但没有_etcd-server._tcp记录。
  • 我无法自动构建ETCD_INITIAL_CLUSTER,因为虽然我知道IP,但我不知道其他节点的名称,而且我也不知道如何解决这些问题。 (我不打算将Docker API套接字暴露给etcd容器)
  • 没有预先存在的etcd集群,并且在discovery.etcd.io中提供初始配置URI是我感兴趣的一种可能的解决方法不这样做。我的目标是“从这个docker-compose.yml部署一个堆栈,它会自动做正确的事情,没有任何问题问”毫无疑问的情况。

有什么窍门可以拉动?

回答

2

正如您已经正确地说知道节点容器的IP, ,所以建议的技巧是简单地将所需的etcd名称构建为每个节点的IP地址的衍生名称。

  • 每个容器etcd内部使用命名这个特殊的容器的IP即
  • ETCD_INITIAL_CLUSTER使用其他集装箱的IP地址以类似的方式

名称可以像甚至简单填充更好的是,我们可以使用netmask来计算该网络上的节点的IP,以使名称更漂亮。

在这种情况下在一个简单的3节点配置中的一个可能最终具有类似于etcd-02etcd-03

name属性存在无特殊要求的名字,它只是需要是唯一的,人类可读的。虽然它看起来像一个诡计,它可能会工作

+0

服务容器更新上不要更改IP地址吗?如果容器被移除,在同一个节点上启动(因此它仍然具有相同的数据量),但它认为它不是以前的东西,这会很奇怪。我认为名称的重点在于即使网络标识符可能发生变化,名称仍然存在,因此节点知道其对等点仍然是相同的。 – drdaeman