如何部署使用Docker 1.12群集模式的领事

我有一个3个服务器的领事集群。 我还有一个大约6名工人和3个主人(主人在与领事服务器相同的硬件,但设置可用性==排水,以防止他们接受工作)的docker群。

我通常使用领事模板来阅读领事K / V。 我不能为了我的生活而弄清楚如何明智地推出代理服务。 如果我使用全局服务,则每个节点只能获得一个代理,但服务器集群抱怨,因为客户代理看起来都具有相同的IP地址。

复制服务似乎是要走的路,但我相信我需要发布客户端端口8301,这似乎与我的服务器群集(这是运行群集主和领事服务器(不在docker下))的冲突。

我会感激一个正确的方向 – 考虑到这是1.12群模式,因此与早期版本非常不同。

这是令人困惑的,但是Docker“Swarm Mode”实际上是一个与Docker Swarm不同的动物。 在群模式下,你不需要领事。 每个主机上的docker守护程序充当关键值存储并执行服务发现。 它为“旧”Docker群中需要的Consul做了一切。

只是要小心查找只针对“群模式”的文档/信息。 我希望他们实际上用了一个不同的名字。

经过深思熟虑,我们终于find了一个适合我们的解决scheme。 部分问题是,在编写本文的时候,Docker 1.12有点less年,并且介绍了一些必须要理解的概念。 在我们的例子中,我们以前的Swarm 1.12版本的经验阻碍了我们的前瞻性思维,而不是帮助。

我们用来为我们的群体部署一个领事K / V服务的解决scheme如下

  1. 创build一个名为“领事”的覆盖networking。 这为我们的服务在内部创build了一个地址空间。

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

  2. 将领事服务器集群部署到新的覆盖中。 我们有三个主机,我们用作pipe理器节点,我们希望consul服务器容器运行在这个集群而不是应用服务器上,因此“约束”标志

    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

    这里的关键是,群组将在领事networking开始时分配一个新的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。 (Consul不会为联接parsing名称 – 其他容器可能会更好,允许指定服务名称“consulserver”而不是VIP)

这样做,任何其他的服务都可以通过join到领事networking来接入顾问,并解决“consulagent”的名字。 顾问服务可以根据需要进行扩展(或者可以部署为全球服务)。 发布端口8500使得该服务在群集的边缘可用,并且如果您不需要使其可用于非群集服务,则可以放弃该服务。

在我的博客中,我探索了一个与MarkH的答案类似的方法,但主要区别在于,我没有指向新服务器的VIP,而是指向joinnetworking的前三个节点。 这可能是有益的,因为VIP会在指向自身的问题上与该VIP上的所有节点上的负载平衡有关。 根据我的经验,最好是用这种方式来创build服务。

 docker service create \ --network=consul \ --name=consul \ -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \ -e CONSUL_BIND_INTERFACE='eth0' \ --mode global \ -p 8500:8500 \ consul agent -server -ui -client=0.0.0.0 \ -bootstrap-expect 3 \ -retry-join 172.20.0.3 \ -retry-join 172.20.0.4 \ -retry-join 172.20.0.5 \ -retry-interval 5s 

我在这里使用全局模式在一个3节点群,所以你可以交换出副本,并把你的约束。

对于像我这样喜欢从docker-compose.yml文件运行我们的服务,我设法“docker堆栈部署”

https://github.com/thechane/consul/blob/master/docker-compose.yml

…作为Docker服务运行Consul。

—编辑,可怜的forms,只是回答与链接,所以这里是:

 version: '3.1' #customise this with options from #https://www.consul.io/docs/agent/options.html services: seed: hostname: seed image: consul:0.8.0 deploy: restart_policy: condition: none #we do not want this to be restarted on timeout (see entrypoint options below) replicas: 1 placement: constraints: - "engine.labels.access == temp" - "engine.labels.access != consul" environment: - "CONSUL_LOCAL_CONFIG={\"disable_update_check\": true}" - "CONSUL_BIND_INTERFACE=eth0" entrypoint: - timeout #this seed fires up the cluster after which it is no longer needed - -sTERM #this is the same signal as docker would send on a scale down / stop - -t300 #terminate after 5 mins - consul - agent - -server - -bootstrap-expect=5 - -data-dir=/tmp/consuldata - -bind={{ GetInterfaceIP "eth0" }} networks: - "consul" cluster: image: consul:0.8.0 depends_on: - "seed" deploy: mode: global ##this will deploy to all nodes that placement: constraints: - "engine.labels.access == consul" ##have the consul label - "engine.labels.access != temp" environment: - "CONSUL_LOCAL_CONFIG={\"disable_update_check\": true}" - "CONSUL_BIND_INTERFACE=eth0" - "CONSUL_HTTP_ADDR=0.0.0.0" entrypoint: - consul - agent - -server - -data-dir=/tmp/consuldata - -bind={{ GetInterfaceIP "eth0" }} - -client=0.0.0.0 - -retry-join=seed:8301 - -ui ##assuming you want the UI on networks: - "consul" ports: - "8500:8500" - "8600:8600" networks: consul: driver: overlay 

另外请注意,我后来发现,没有种子,更多的领事实例不能被添加。 所以,如果你打算扩大你的swarm节点计数,我会从种子入口点的选项中删除超时命令。