如何将Docker Swarm连接到多个领事服务器进行故障切换?

如何将Docker Swarm连接到多个领事服务器进行故障切换?,docker,failover,consul,docker-swarm,Docker,Failover,Consul,Docker Swarm,我和领事一起管理docker swarm。我有一个由3个相互连接的节点组成的Consor群集,用于故障切换。问题是,我只能将我的swarm workers和masters连接到单个节点,如果该节点出现故障,swarm将停止工作。那么,我如何将swarm workers和masters连接到我的所有节点?如果从主服务器运行以下命令,则将设置连接到单个Concur服务器的我的swarm环境: #### REFERENCE # {{master_i}} is the IP address of the

我和领事一起管理docker swarm。我有一个由3个相互连接的节点组成的Consor群集,用于故障切换。问题是,我只能将我的swarm workers和masters连接到单个节点,如果该节点出现故障,swarm将停止工作。那么,我如何将swarm workers和masters连接到我的所有节点?如果从主服务器运行以下命令,则将设置连接到单个Concur服务器的我的swarm环境:

#### REFERENCE
# {{master_i}} is the IP address of the master server
# {{consul_i}} is the IP address of the consul server
# {{worker_i}} is the IP address of a worker server


#### START THE MASTER
docker run --restart=unless-stopped --name=swarm-manager0 -d -p 4000:4000 swarm manage -H :4000 --replication \
--advertise {{master_0}}:4000 \
consul://{{consul_0}}:8500

#### START THE WORKERS REMOTELY FROM THE MASTER
docker -H={{worker_0}}:2375 run -d --restart=unless-stopped --name=swarm-worker0 swarm join \
--advertise={{worker_0}}:2375 \
consul://{{consul_0}}:8500/

docker -H={{worker_1}}:2375 run -d --restart=unless-stopped --name=swarm-worker1 swarm join \
--advertise={{worker_1}}:2375 \
consul://{{consul_0}}:8500/

docker -H={{worker_2}}:2375 run -d --restart=unless-stopped --name=swarm-worker2 swarm join \
--advertise={{worker_2}}:2375 \
consul://{{consul_0}}:8500/

#### START THE WORKER SERVICE DISCOVERY
docker -H={{worker_0}}:2375 run -d --restart=unless-stopped \
-h {{worker_0}} --name registrator0 -v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator \
consul://{{consul_0}}:8500

docker -H={{worker_1}}:2375 run -d --restart=unless-stopped \
-h {{worker_1}} --name registrator1 -v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator \
consul://{{consul_0}}:8500

docker -H={{worker_2}}:2375 run -d --restart=unless-stopped \
-h {{worker_2}} --name registrator2 -v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator \
consul://{{consul_0}}:8500

请注意,只需在每个docker运行命令的末尾添加两个额外的
consor://{{consor_i}}:8500
(对于其他两个consor服务器),就不会将容器连接到其他consor服务器;Swarm最终(通过libkv)到达,它只连接到单个指定的端点。更糟糕的是,
libkv
将在传递多个领事主机时引发异常


但是,有一种方法可以通过更多的工作来实现这一点。如果您在运行Swarm的每个节点上启动一个领事代理,并将它们加入其中一个领事服务器,他们将了解集群的状态。如果您随后将领事代理的地址指定为Swarm的发现服务,那么领事代理将把请求转发给一个正常工作的领事服务器。

实际上似乎没有一种方法可以直接做到这一点;Swarm最终(通过libkv)到达,它只连接到单个指定的端点。更糟糕的是,
libkv
将在传递多个领事主机时引发异常


但是,有一种方法可以通过更多的工作来实现这一点。如果您在运行Swarm的每个节点上启动一个领事代理,并将它们加入其中一个领事服务器,他们将了解集群的状态。如果随后将领事代理的地址指定为Swarm的发现服务,则领事代理将把请求转发给一个正常工作的领事服务器。

根据@slugonamission,无法将Swarm连接到多个领事服务器的多个IP地址

然而,我能够创建一个haproxy负载平衡器,它位于我的Consor服务器前面。因此,我的负载平衡器将所有流量从我的负载平衡器端口8500转发到我所有Consor服务器上的端口8500。通过这样做,我能够使用负载平衡器的IP地址来代替
{{CONSUL0}
。这是我最基本的haproxy.cfg

# $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将继续工作。

根据@slugonamission,无法将swarm连接到多个领事服务器的多个IP地址

然而,我能够创建一个haproxy负载平衡器,它位于我的Consor服务器前面。因此,我的负载平衡器将所有流量从我的负载平衡器端口8500转发到我所有Consor服务器上的端口8500。通过这样做,我能够使用负载平衡器的IP地址来代替
{{CONSUL0}
。这是我最基本的haproxy.cfg

# $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

做出更改后,我的Consor服务器可以单独关闭,swarm将继续工作。

另一个解决方案是在您想要运行swarm worker的每台服务器上运行一个Consor客户端。然后,当您创建swarm workers时,只需让他们将自己绑定到本地计算机上运行的领事代理:

docker run -d --restart=unless-stopped --name=swarm-client \
  swarm join \
  --advertise=$(hostname -i):2375 \
  consul://$(hostname -i):8500/

请注意,如果Concur在本地计算机上死亡,这将导致swarm崩溃。

另一种解决方案是在您想要运行swarm worker的每台服务器上运行一个Concur客户端。然后,当您创建swarm workers时,只需让他们将自己绑定到本地计算机上运行的领事代理:

docker run -d --restart=unless-stopped --name=swarm-client \
  swarm join \
  --advertise=$(hostname -i):2375 \
  consul://$(hostname -i):8500/

请注意,如果Concur在本地计算机上死亡,这将导致swarm中断。

如果您在AWS中部署,您可以在ELB后面注册Concur服务器节点,然后将swarm管理器/节点指向ELB DNS


或者,在所有swarm主机上运行领事客户端代理,并将您的swarm管理器/节点指向领事代理,即docker0接口IP,172.17.0.1:8500

如果您在AWS中部署,您可以在ELB后面注册领事服务器节点,然后将swarm管理器/节点指向ELB DNS


或者,在所有swarm主机上运行一个Consor客户端代理,并将您的swarm管理员/节点指向Consor代理,即docker0接口IP,172.17.0.1:8500

使用负载平衡器可以解决我的问题,但我会遇到单点故障的问题,我希望避免这种情况。如果swarm可以像etcd一样连接到多个Consor节点,那就太好了。你可以使用keepalive或Corosyncus为HAproxy安装负载平衡器来解决我的问题,但是我会遇到单点故障的问题,我希望避免这种情况。如果swarm可以像etcd一样连接到多个Consor节点,那就太好了