如何为Docker Swarm Manager配置DNS(和/或负载平衡)

如何为Docker Swarm Manager配置DNS(和/或负载平衡),docker,dns,consul,docker-swarm,Docker,Dns,Consul,Docker Swarm,场景: 我正在构建和配置一个Docker Swarm集群。我的想法是在两个独立的主机(HostA和HostB)中部署两组3个虚拟机,使用concur作为发现后端: HostA:manager0,node0,node1 HostB:manager1,node2,node3 通过这种方式,我在群管理器和节点中都获得了所需的冗余。然而,我目前的情况是在一个更早期、更简单的阶段:我刚刚创建了一个Docker Swarm manager,如下所示: docker \ run -d \ -p 337

场景:

我正在构建和配置一个Docker Swarm集群。我的想法是在两个独立的主机(
HostA
HostB
)中部署两组3个虚拟机,使用concur作为发现后端:

HostA
manager0
node0
node1

HostB
manager1
node2
node3

通过这种方式,我在群管理器和节点中都获得了所需的冗余。然而,我目前的情况是在一个更早期、更简单的阶段:我刚刚创建了一个Docker Swarm manager,如下所示:

docker \
  run -d \
  -p 3376:3376 \
  swarm manage \
  -H :3376 --advertise manager0:3376 \
  --replication consul://consul0:8500/
(注意:由于一些不相关的参数(如TLS验证)已被清除,因此上述命令已适用于此问题。)

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
问题:

假设我成功地解决了最初的计划,并添加了第二个管理者,即第二个管理者。据我所知,Concur维护关于Swarm集群的信息,它知道谁是主要的和次要的,它执行健康检查等等

现在,我戴上我的部署帽。我想将Docker客户端连接到Swarm集群,以便部署(例如)基于nginx的服务。我不想手动连接到
manager0
manager1
,这取决于每种情况下哪个是主要的,我希望使用一个端点连接整个集群。因此:

如何使用Consor DNS解析使用单个端点指向正确的Swarm manager?例如:

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

docker -H tcp://manager0:3376 version


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

请参阅链接

DNS查询系统利用健康检查信息来防止 路由到不健康的节点。进行服务查询时,任何服务 未通过运行状况检查或未通过节点系统检查将被视为 从结果中省略。为了实现简单的负载平衡,设置 每次返回的节点数也是随机的。这些机制使得 使用DNS和应用程序级重试作为 面向自动修复服务的架构的基础。
提示:通过添加第二台主机,实际上降低了容错能力。这是因为分布式配置工具需要仲裁,或者超过50%的节点可用。因此,如果一台主机宕机,另一台主机将不再具有运行所需的仲裁。您需要至少3台主机来支持一台主机的宕机。如果您现在正在开发一个新的swarm,我会选择1.12路径,新的
docker swarm
docker service
命令将消除您试图解决的许多难题。您好@BMitch,感谢您对1.12路径的建议。我会为将来考虑这个问题!谢谢@Nguyen-我要试试这个。我对Concur非常陌生,它的文档假定了一些我还无法掌握的基础知识。
docker -H tcp://manager1:3376 version