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

时间:2016-07-02 13:34:12

标签: docker dns consul docker-swarm

情境:

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

HostAmanager0node0node1

HostBmanager1node2node3

通过这种方式,我在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的服务。我不想手动连接到manager0manager1,具体取决于每种情况下哪一个是主要的,我想对整个群集使用单个端点。所以:

如何使用Consul DNS解析使用单个端点指向正确的Swarm管理器?例如:

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

而不是:

docker -H tcp://manager0:3376 version

docker -H tcp://manager1:3376 version

1 个答案:

答案 0 :(得分:2)

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

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

  

DNS查询系统利用健康检查信息来防止   路由到不健康的节点。进行服务查询时,任何服务   未通过健康检查或未通过节点系统检查   从结果中省略。为了允许简单的负载平衡,设置   每次返回的节点也是随机的。这些机制使   它很容易使用DNS以及应用程序级重试   自动修复服务导向架构的基础。