如何为Docker Swarm ManagerconfigurationDNS(和/或负载平衡)

场景:

我正在构build和configuration一个Docker Swarm集群。 我的想法是在两个分离的主机( HostAHostB )中使用Consul作为发现后端部署两组3个虚拟机:

HostAmanager0node0node1

HostBmanager1node2node3

通过这种方式,我可以在Swarmpipe理器和节点中获得所需的冗余。 不过, 我目前的情况是在一个更早,更简单的阶段 :我刚刚纺了一个Docker Swarmpipe理器,如下所示:

 docker \ run -d \ -p 3376:3376 \ swarm manage \ -H :3376 --advertise manager0:3376 \ --replication consul://consul0:8500/ 

(注意:上面的命令已经适用于这个问题,因为一些无关的论证,如TLSvalidation已经被清除。)

Swarm集群的第一颗种子按预期工作:

 docker -H tcp://manager0:3376 version Client: Version: 1.11.2 API version: 1.23 Go version: go1.5.4 Git commit: b9f10c9 Built: Wed Jun 1 21:47:50 2016 OS/Arch: linux/amd64 Server: Version: swarm/1.2.3 API version: 1.22 Go version: go1.5.4 Git commit: eaa53c7 Built: Fri May 27 17:25:03 UTC 2016 OS/Arch: linux/amd64 

题:

比方说,我成功地解决了最初的计划,我添加了第二个经理,第二个经理。 据我所知,领事维护关于Swarm群集的信息,它知道谁是主要和次要的,执行健康检查等等。

现在,我戴上我的部署帽子。 我想将我的Docker客户端连接到Swarm集群,以便部署我的基于nginx的服务。 我不想手动连接到manager0manager1取决于哪一个是主要在每种情况下,我想使用一个端点到整个群集。 所以:

如何使用Consul DNSparsing指向使用单个端点的正确的Swarmpipe理器? 例如:

 docker -H tcp://swarm.cluster.example.com:3376 version 

而不是:

 docker -H tcp://manager0:3376 version 

要么

 docker -H tcp://manager1:3376 version 

我认为HostAHostB应该使用Consul作为DNS服务器。 为此,需要将Consul的默认DNS服务器端口更改为53.之后,更改主机的域名服务器(文件/etc/resolv.conf)。

请参阅链接https://www.consul.io/docs/agent/dns.html

DNS查询系统利用健康检查信息来防止路由到不健康的节点。 当进行服务查询时,任何未通过健康检查或节点系统检查失败的服务都将被忽略。 为了实现简单的负载均衡,每次返回的节点集也是随机的。 这些机制使得使用DNS和应用程序级重试作为自动修复面向服务架构的基础变得很容易。