我有一个由3台服务器组成的领事群。我还有一个大约6名工人和3名主人的码头工人(主人与领事服务器位于相同的硬件上但设置为可用性==排水以防止他们接受工作)。
我通常使用consul-template来阅读领事K / V.我不能为我的生活弄清楚如何合理地推出一个领事代理服务。如果我使用全局服务,那么每个节点都会获得一个代理,但服务器群集会抱怨,因为客户端代理似乎都具有相同的IP地址。
复制服务似乎是要走的路,但我相信我需要发布客户端端口8301,这似乎会导致与我的服务器集群(运行swarm主服务器和consul服务器(不在docker下)的冲突) 。
我很欣赏正确方向的一般指导 - 记住这是1.12群模式,因此与早期版本有很大不同。
答案 0 :(得分:6)
令人困惑的是Docker" Swarm Mode"真的是一种不同的动物,仍称为Docker Swarm。在群体模式中,您不需要领事。每个主机上的docker守护程序充当键值存储并执行服务发现。它为“老人”中需要的领事做了一切。 Docker Swarm。
请小心查找特定于" swarm模式"的文档/信息。只要。我希望他们实际上使用了不同的名称。
答案 1 :(得分:6)
经过深思熟虑和许多死胡同,我们终于想出了一个适合我们的解决方案。问题的一部分在于,在编写本文时,Docker 1.12有些少年,并且在它有意义之前引入了许多必须被理解的概念。在我们的例子中,我们之前使用Swarm 1.12变体的经验阻碍了我们的前瞻性思维而不是帮助。
我们用于为我们的群体部署领事K / V服务的解决方案如下
创建名为' consul'的覆盖网络。这为我们的服务创建了一个地址空间。
docker network create --driver overlay --subnet 10.10.10.0/24 consul
将consul服务器群集部署到新的覆盖中。我们有三个主机用作管理器节点,我们希望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
这里的关键是swarm将在领事网络的开头分配一个新的VIP(10.10.10.2),映射到三个新实例。
接下来,我们部署了代理服务
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不会解决加入的名称 - 其他容器可能做得更好,允许指定服务名称" consulserver"而不是VIP)
完成此操作后,任何其他服务都可以通过加入领事网络并解析名称" consiggent"来访问其他人。可以根据需要缩放(或者可以部署为全局服务)顾问服务。 发布端口8500使服务在群集边缘可用,如果您不需要将其提供给非群组服务,则可以将其删除。
答案 2 :(得分:3)
在我的blog中,我探索了与MarkH的答案类似的方法,但关键的区别在于,我指的是前三个加入了服务器的节点,而不是指向新服务器的VIP。网络。这可能是有益的,因为VIP存在问题,它将指向自身与在该VIP上的所有节点上的负载平衡。根据我的经验,最好以这种方式为服务创建。
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节点群中使用全局模式,因此您可以将其交换为副本并放置约束。
答案 3 :(得分:3)
对于那些喜欢从docker-compose.yml文件运行我们服务的人,我设法" docker stack deploy"
https://github.com/thechane/consul/blob/master/docker-compose.yml
...将Consul作为Docker服务运行。
---编辑,糟糕的形式只是回答链接,所以这里是:
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
另请注意,我后来发现,如果没有种子,则无法添加更多的consul实例。因此,如果您打算扩展您的swarm节点计数,我将从种子入口点删除带有其选项的timeout命令。