情境:
我正在构建和配置一个Docker Swarm集群。我的想法是在2个独立的主机(HostA
和HostB
)中部署2组3个虚拟机,使用Consul作为发现后端:
HostA
:manager0
,node0
,node1
HostB
:manager1
,node2
,node3
通过这种方式,我在Swarm管理器和节点中获得了所需的冗余。但是,我现在处于一个更早,更简单的阶段:我只是按照以下步骤旋转了一个Docker Swarm管理器:
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
问题:
假设我成功解决了初始计划,并添加了第二个经理,即次要经理。据我所知,Consul维护有关Swarm集群的信息,它知道谁是主要的和次要的,它执行健康检查等等。
现在,我戴着我的部署帽子。我想将我的Docker客户端连接到Swarm集群,以便部署,例如,我的基于nginx的服务。我不想手动连接到manager0
或manager1
,具体取决于每种情况下哪一个是主要的,我想对整个群集使用单个端点。所以:
如何使用Consul DNS解析使用单个端点指向正确的Swarm管理器?例如:
docker -H tcp://swarm.cluster.example.com:3376 version
而不是:
docker -H tcp://manager0:3376 version
或
docker -H tcp://manager1:3376 version
答案 0 :(得分:2)
我认为HostA
和HostB
应该使用Consul作为DNS服务器。为此,您需要将Consul的默认DNS服务器端口更改为53.之后,您将更改主机的域名服务器(文件/etc/resolv.conf)。
请参阅链接https://www.consul.io/docs/agent/dns.html
DNS查询系统利用健康检查信息来防止 路由到不健康的节点。进行服务查询时,任何服务 未通过健康检查或未通过节点系统检查 从结果中省略。为了允许简单的负载平衡,设置 每次返回的节点也是随机的。这些机制使 它很容易使用DNS以及应用程序级重试 自动修复服务导向架构的基础。