根据@slugonamission,无法将swarm连接到多个consul服务器的多个IP地址。
但是我能够创建一个位于我的领事服务器前面的haproxy负载均衡器。因此,我的负载均衡器将所有来自我的负载均衡器端口8500的流量转发到我所有领事服务器上的端口8500。通过这样做,我能够使用我的负载均衡器的IP地址代替 {{CONSUL0}} 。这是我非常基本的haproxy.cfg
{{CONSUL0}}
# $CONSUL0 $CONSUL0 and $CONSUL0 are the IP addresses of my consul servers global log 127.0.0.1 local0 notice maxconn 2000 user haproxy group haproxy defaults log global mode http option httplog option dontlognull retries 3 option redispatch timeout connect 5000 timeout client 10000 timeout server 10000 listen appname 0.0.0.0:8500 mode http stats enable stats uri /haproxy?stats stats realm Strictly\ Private stats auth ubuntu balance roundrobin option httpclose option forwardfor server consul0 $CONSUL0:8500 check server consul1 $CONSUL1:8500 check server consul2 $CONSUL2:8500 check
进行更改后,我的领事服务器可以单独关闭,swarm将继续工作。
实际上似乎没有办法直接开箱即用; Swarm最终(通过libkv)下来了 Consul HTTP API ,仅连接到单个指定端点。更差, libkv 如果传递了多个Consul主机,则会抛出异常。
libkv
有一种方法可以通过更多的工作来实现这一目标。如果在运行Swarm的每个节点上启动Consul代理并将其连接到其中一个Consul服务器,他们将了解群集的状态。如果您随后将Consul代理的地址指定为Swarm的发现服务,则Consul代理会将请求转发给其中一个正常运行的Consul服务器。
另一个解决方案是在每个要运行swarm worker的服务器上运行consul客户端。然后当你创建你的swarm worker时,让他们将自己绑定到在本地机器上运行的consul代理:
docker run -d --restart=unless-stopped --name=swarm-client \ swarm join \ --advertise=$(hostname -i):2375 \ consul://$(hostname -i):8500/
请注意,如果consul在本地计算机上死亡,这将导致swarm中断。
如果要在AWS中部署,则可以在ELB后面注册consul服务器节点,然后将群集管理器/节点指向ELB DNS
或者,在所有swarm主机上运行consul客户端代理,并将您的swarm管理器/节点指向consul agent,即docker0 interface IP,172.17.0.1:8500