本文介绍了在 Windows 10 上基于 Docker 搭建 Consul 多数据中心集群的步骤,包括 Consul 镜像的拉取和容器的创建,每个数据中心对应服务端节点和客户节点的创建,节点之间相互加入组成集群,数据中心之间进行关联。多数据中心集群建立之后,通过 Consul 提供的 WEB UI 可以对集群中每个节点健康状况和服务的监控。最后列出了几个常用的命令,用于查看数据中心和节点的状态,以及对节点进行一些操作。

1 准备工作

1.1 环境说明

操作系统:Windows 10

Docker:V18.06.1-ce, build e68fc7a

Consul:V1.2.2

1.2 准备环境

1.2.1 安装 Docker

在 Windows 10 中下载 Docker 并进行安装,安装过程请参考其他教程。

注意:

1、请确认你的 Windows 10 支持虚拟化(CPU 支持 VMX 指令集);

2、后面所述的集群搭建过程中,有些步骤不适用于其他版本的 Windows 系统,即使你安装的是 Docker Toolbox;

1.2.2 拉取 Consul 镜像

Docker 安装成功后,我们使用 Windows PowerShell 来拉取 Consul 镜像,你也可以使用其他任何命令行工具。

docker pull consul

2 搭建数据中心(dc1)

2.1 节点1

docker run -d -p 8500:8500 --name node1 consul agent -server -bootstrap-expect 3 -data-dir=/tmp/consul -client="0.0.0.0" -ui

启用 WEB UI,并将端口映射到 8500,方便通过 WEB 的方式查看群集状态,默认数据中心为 dc1

为了后续创建的节点能够加入到该节点,我们先获取节点 node1 的 IP 地址并绑定到 JOIN_IP 变量:

JOIN_IP="$(docker inspect -f '{{.NetworkSettings.IPAddress}}' node1)"

上述命令在 Windows 10 的 PowerShell 下运行时会报以下错误:

PS C:\Users\Administrator> JOIN_IP="$(docker inspect -f '{{.NetworkSettings.IPAddress}}' node1)"
JOIN_IP=$(docker inspect -f '{{.NetworkSettings.IPAddress}}' node1) : 无法将“JOIN_IP=$(docker inspect -f '{{.NetworkSe
ttings.IPAddress}}' node1)”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路
径正确,然后再试一次。
所在位置 行:1 字符: 1
+ JOIN_IP="$(docker inspect -f '{{.NetworkSettings.IPAddress}}' node1)"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (JOIN_IP=$(docke...dress}}' node1):String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

我们直接使用以下命令查看 node1 的 IP 地址:

docker inspect -f '{{.NetworkSettings.IPAddress}}' node1

PS C:\Users\Administrator> docker inspect -f '{{.NetworkSettings.IPAddress}}' node1
172.17.0.2

2.2 节点2

docker run -d --name node2 consul agent -server -join 172.17.0.2

如果 JOIN_IP 绑定成功,则可以使用以下命令创建:

docker run -d --name node2 consul agent -server -join $JOIN_IP

2.3 节点3

docker run -d --name node3 consul agent -server -join 172.17.0.2

2.4 节点4

docker run -d --name node4 consul agent -server -join 172.17.0.2

接下来查看一下数据中心 dc1 的节点

docker exec node1 consul members

PS C:\Users\Administrator> docker exec node1 consul members
Node          Address          Status  Type    Build  Protocol  DC   Segment
227adc80c8e4  172.17.0.3:8301  alive   server  1.2.2  2         dc1  <all>
d22c4d8ccc50  172.17.0.2:8301  alive   server  1.2.2  2         dc1  <all>
e78cba259433  172.17.0.4:8301  alive   server  1.2.2  2         dc1  <all>
f05abd19bb5f  172.17.0.5:8301  alive   server  1.2.2  2         dc1  <all>

3 搭建数据中心(dc2)

3.1 节点5

docker run -d --name node5 consul agent -server -bootstrap-expect 2 -datacenter=dc2

使用以下命令查看 node5 的 IP 地址:

docker inspect -f '{{.NetworkSettings.IPAddress}}' node5

3.2 节点6

docker run -d --name node6 consul agent -server -datacenter=dc2 -join 172.17.0.6

注意一定要加上 -datacenter=dc2,不然不能加入数据中心2

3.3 节点7

docker run -d --name node7 consul agent -server -datacenter=dc2 -join 172.17.0.6

3.4 节点8

这里我们添加一个客户端节点,注意没有 -server 参数。一个数据中心 Consul 一般建议 3~5 个 Server 节点,而客户端节点并没有限制,你可以添加数万个节点都没有问题。

docker run -d --name node8 consul agent -datacenter=dc2 -join 172.17.0.6

接下来我们查看一下数据中心 dc2 的节点:

docker exec node5 consul members

PS C:\Users\Administrator> docker exec node5 consul members
Node          Address          Status  Type    Build  Protocol  DC   Segment
19ee3676f49b  172.17.0.6:8301  alive   server  1.2.2  2         dc2  <all>
7859fe7002fe  172.17.0.7:8301  alive   server  1.2.2  2         dc2  <all>
fce88e9c0ffc  172.17.0.8:8301  alive   server  1.2.2  2         dc2  <all>
318fa22df7c9  172.17.0.9:8301  alive   client  1.2.2  2         dc2  <default>

4 关联数据中心

这里我们选择数据中心2的节点 node5 关联到数据中心1中 IP 地址为 172.17.0.2 的 node1 节点,你也可以选择其他节点进行关联,只要这两个节点分别位于两个数据中心即可。

docker exec node5 consul join -wan 172.17.0.2

看到以下信息说明关联数据中心成功

PS C:\Users\Administrator> docker exec node5 consul join -wan 172.17.0.2
Successfully joined cluster by contacting 1 nodes.

5 在 WEB 界面查看

在浏览器中访问 http://127.0.0.1:8500 地址,即可看到所有的服务和节点,还可以通过切换数据中心查看其下的服务和节点,点击每个节点可以进一步查看具体节点的健康状况、运行的服务以及响应时间等信息。

使用docker部署spark集群 docker consul集群_ui

6 常用命令

6.1 列出数据中心

docker exec node5 consul catalog datacenters

PS C:\Users\Administrator> docker exec node5 consul catalog datacenters
dc2
dc1

6.2 列出节点

docker exec node5 consul catalog nodes

PS C:\Users\Administrator> docker exec node5 consul catalog nodes
Node          ID        Address     DC
19ee3676f49b  8f6b15db  172.17.0.6  dc2
318fa22df7c9  3d1d2c28  172.17.0.9  dc2
7859fe7002fe  d49c88c2  172.17.0.7  dc2
fce88e9c0ffc  fca52e5e  172.17.0.8  dc2

可以将 node5 换成其他节点名称,该命令会列出指定节点所在数据中心的所有节点。

6.3 移除节点

docker exec node8 consul operator raft remove-peer -id=172.17.0.9:8301

(该命令没有运行成功,先记录一下。)

6.4 查询群集中所有的 LAN 和 WAN 的 Server 节点

docker exec node5 consul members -wan

PS C:\Users\Administrator> docker exec node5 consul members -wan
Node              Address          Status  Type    Build  Protocol  DC   Segment
19ee3676f49b.dc2  172.17.0.6:8302  alive   server  1.2.2  2         dc2  <all>
227adc80c8e4.dc1  172.17.0.3:8302  alive   server  1.2.2  2         dc1  <all>
7859fe7002fe.dc2  172.17.0.7:8302  alive   server  1.2.2  2         dc2  <all>
d22c4d8ccc50.dc1  172.17.0.2:8302  alive   server  1.2.2  2         dc1  <all>
e78cba259433.dc1  172.17.0.4:8302  alive   server  1.2.2  2         dc1  <all>
f05abd19bb5f.dc1  172.17.0.5:8302  alive   server  1.2.2  2         dc1  <all>
fce88e9c0ffc.dc2  172.17.0.8:8302  alive   server  1.2.2  2         dc2  <all>

其中 `node5`` 可以换成关联数据中心中的其他任意节点名称

6.5 查看集群状态

docker exec node5 consul operator raft list-peers

PS C:\Users\Administrator> docker exec node5 consul operator raft list-peers
Node          ID                                    Address          State     Voter  RaftProtocol
19ee3676f49b  8f6b15db-8b15-0853-390a-d0f71f7bb61f  172.17.0.6:8300  leader    true   3
7859fe7002fe  d49c88c2-744b-556f-f709-45c252158b7c  172.17.0.7:8300  follower  true   3
fce88e9c0ffc  fca52e5e-8d69-82c1-ae1e-dba9718d1e41  172.17.0.8:8300  follower  true   3

可以添加 -stale 参数查看旧的集群状态