首页 文章

如何将Docker Swarm连接到多个consul服务器以进行故障转移?

提问于
浏览
0

我正在与 Consul 一起运行码头群 . 我有一个由3个节点组成的consul集群,用于故障转移 . 问题是我只能将我的swarm worker和master连接到一个节点,如果该节点出现故障,那么swarm就会停止工作 . 那么如何将swarm worker和master连接到我的所有节点呢?如果从主服务器运行以下命令将设置连接到单个consul服务器的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 run命令的末尾添加两个额外的 consul://{{consul_i}}:8500 (对于其他两个consul服务器),就不会将容器连接到其他consul服务器 .

4 回答

  • 0

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

    但是我能够创建一个位于我的 Consul 服务器前面的haproxy负载均衡器 . 因此,我的负载均衡器将所有来自我的负载均衡器端口8500的流量转发到我所有 Consul 服务器上的端口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
    

    进行更改后,我的 Consul 服务器可以单独关闭,swarm将继续工作 .

  • 0

    实际上似乎没有办法直接开箱即用; Swarm最终(通过libkv)下来Consul HTTP API,它只连接到单个指定的 endpoints . 更糟糕的是,如果传递多个Consul主机, libkv 将抛出异常 .

    有一种方法可以通过更多的工作来实现这一目标 . 如果在运行Swarm的每个节点上启动Consul代理并将其连接到其中一个Consul服务器,他们将了解群集的状态 . 如果您随后将Consul代理的地址指定为Swarm的发现服务,则Consul代理会将请求转发给其中一个正常运行的Consul服务器 .

  • 2

    另一个解决方案是在每个要运行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中断 .

  • 0

    如果要在AWS中部署,则可以在ELB后面注册consul服务器节点,然后将群集管理器/节点指向ELB DNS

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

相关问题