如何使用Docker 1.12 swarm模式部署consul

Mar*_*rkH 12 docker docker-swarm

我有一个由3台服务器组成的领事群.我还有一个大约6名工人和3名主人的码头工人(主人与领事服务器在同一硬件上,但设置有可用性==排水,以防止他们接受工作).

我通常使用consul-template来阅读领事K/V. 我不能为我的生活弄清楚如何合理地推出一个领事代理服务.如果我使用全局服务,那么每个节点都会获得一个代理,但服务器群集会抱怨,因为客户端代理似乎都具有相同的IP地址.

复制服务似乎是要走的路,但我相信我需要发布客户端端口8301,这似乎会导致我的服务器集群(运行swarm主服务器和consul服务器(不在docker下))发生冲突.

我很欣赏正确方向的一般指导 - 记住这是1.12群模式,因此与早期版本有很大不同.

Ber*_*ard 6

令人困惑的是Docker"Swarm Mode"实际上是一种不同的动物,它仍然被称为Docker Swarm.在群体模式中,您不需要领事.每个主机上的docker守护程序充当键值存储并执行服务发现.它为"旧"Docker Swarm中的Consul所需的一切做了.

请注意查找仅针对"群集模式"的文档/信息.我希望他们实际上使用了不同的名字.


Mar*_*rkH 6

经过深思熟虑和许多死胡同,我们终于想出了一个适合我们的解决方案.问题的一部分在于,在编写本文时,Docker 1.12有些少年,并引入了许多必须在有意义之前理解的概念.在我们的例子中,我们之前使用Swarm 1.12变体的经验阻碍了我们的前瞻性思维而不是帮助.

我们用于为我们的群体部署consul K/V服务的解决方案如下

  1. 创建一个名为"consul"的覆盖网络.这为我们的服务创建了一个地址空间.

    docker network create --driver overlay --subnet 10.10.10.0/24 consul

  2. 将consul服务器群集部署到新的覆盖中.我们有三个主机用作管理器节点,我们希望consul服务器容器在这个集群而不是app服务器上运行,因此'constraint'标志

    docker service create -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' --name consulserver --network consul --constraint 'node.role == manager' --replicas 3 consul agent server -bootstrap-expect=3 -bind=0.0.0.0 -retry-join="10.10.10.2" -data-dir=/tmp

    这里的关键是swarm将在领事网络的起始处分配一个新的VIP(10.10.10.2),映射到三个新实例.

  3. 接下来,我们部署了代理服务

    docker service create \ -e 'CONSUL_BIND_INTERFACE=eth0' \ -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true, "retry_join":["10.10.10.2"]}' \ --publish "8500:8500" \ --replicas 1 \ --network consul \ --name consulagent \ --constraint 'node.role != manager' \ consul agent -data-dir=/tmp -client 0.0.0.0

指定consulserver服务的VIP.(领事不会解析加入的名称 - 其他容器可能做得更好,允许指定服务名称"consulserver"而不是VIP)

这样做,任何其他服务可以通过加入领事网络并解析名称"consulagent"来访问consiggent.可以根据需要缩放(或者可以部署为全局服务)顾问服务.发布端口8500使服务在群集边缘可用,如果您不需要将其提供给非群集服务,则可以将其丢弃.