我想找到一种方法来部署一个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
部署一个堆栈,它将自动做正确的事情,不问任何问题”。
我能耍什么花招吗?
2条答案
按热度按时间sqougxex1#
正如您正确地指出的,您知道节点容器的IP,因此建议的技巧是简单地构建所需的
etcd
名称作为每个节点IP地址的派生。etcd
使用此特定容器的IP命名,即etcd-$ip
ETCD_INITIAL_CLUSTER
以类似的方式使用其他container的IP进行填充名称可以像
etcd-$ip
一样简单,甚至更好,即我们可以使用netmask
来计算此网络上节点的IP,以使名称更美观。在本例中,在简单的3节点配置中,最终可能会使用
etcd-02
etcd-03
等名称对于name属性没有特定的要求,它只需要是唯一的和人类可读的。
gr8qqesn2#
我也在寻找Docker Swarm ETCD集群的简单解决方案,并找到了这个repo。
存储库包含一个
run.sh
bash脚本,该脚本通过与节点玩“乒乓”游戏来完成构建advertise-client-urls
参数和初始集群的“魔术”。