部署环境
实验场景信息:
软件 | 版本 |
---|---|
主机 | CentOS Linux 7 (Core) |
内核 | 3.10.0-1160.15.2.el7.x86_64 |
docker | 20.10.4 |
Consul镜像 | consul:latest -> 1.9.1 |
通过Docker自动化部署Consul集群
最近一直在学习Consul,因此可能会随时的拉起和销毁Consul集群,因此写了一个简单的脚本,通过Docker拉取consul集群: 创建集群脚本:start_consul_cluster.sh
#!/bin/bash
# 创建数据目录
mkdir /data/consul
docker pull consul
# 以下运行角色为server的agent节点
# 节点1
echo "staring consul_server_1"
docker run -d -p 8500:8500 -v /data/consul:/consul/data -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_1 consul agent -server -bootstrap -ui -node=1 -client='0.0.0.0'
# 查看consul节点名为consul_server_1的运行IP
JOIN_IP="$(docker inspect -f '{{.NetworkSettings.IPAddress}}' consul_server_1)"
# 其他两个server角色的节点
for i in 2 3;do echo "starting consul_server_$i" && docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_$i consul agent -server -node=$i -join=$JOIN_IP;done
# 以下运行角色为client的agent节点
for client in {4..6};do echo "starting consul_server_$client" && docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_$client consul agent -client -node=$client -join=$JOIN_IP -client='0.0.0.0';done
echo "当前集群状态信息"
docker exec consul_server_1 consul members
销毁删除集群delete_consul_cluster.sh
,默认不会删除你的数据文件
#!/bin/bash
for i in {1..6};do docker stop consul_server_$i && docker rm consul_server_$i;done
echo "Archiving Data Directory..."
mv /data/consul /data/consul_`date +%F-%H.%M.%S`
使用上面脚本完成consul集群创建之后,可以直接通过角色为server绑定的8500端口访问,此处我们手动添加一个client角色,然后用HTPP API请求试一下:
# 获取leader角色的IP
docker exec consul_server_1 consul members
# 手动创建一个将端口映射到宿主机的角色为client的consul节点
docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_7 -p 8510:8500 consul agent -client -node=7 -join=172.17.0.3 -client='0.0.0.0'
# 查看集群节点状态,也可以通过宿主机上的consul二进制管理远程集群。
[root@node1 ~]# consul members -http-addr=192.168.99.3:8500
Node Address Status Type Build Protocol DC Segment
1 172.17.0.3:8301 alive server 1.9.1 2 dc1
2 172.17.0.4:8301 alive server 1.9.1 2 dc1
3 172.17.0.5:8301 alive server 1.9.1 2 dc1
721d401b9555 172.17.0.6:8301 alive client 1.9.1 2 dc1
7966e61b62e0 172.17.0.9:8301 alive client 1.9.1 2 dc1
7d83d412ccfe 172.17.0.7:8301 alive client 1.9.1 2 dc1
c318470ac6bb 172.17.0.8:8301 alive client 1.9.1 2 dc1
[root@node1 ~]# consul members -http-addr=192.168.99.3:8510
Node Address Status Type Build Protocol DC Segment
1 172.17.0.3:8301 alive server 1.9.1 2 dc1
2 172.17.0.4:8301 alive server 1.9.1 2 dc1
3 172.17.0.5:8301 alive server 1.9.1 2 dc1
721d401b9555 172.17.0.6:8301 alive client 1.9.1 2 dc1
7966e61b62e0 172.17.0.9:8301 alive client 1.9.1 2 dc1
7d83d412ccfe 172.17.0.7:8301 alive client 1.9.1 2 dc1
c318470ac6bb 172.17.0.8:8301 alive client 1.9.1 2 dc1
我们在运行节点1
的时候将端口映射到宿主机上了,同时开启了Dashboard
,此处可以通过hostIP:8500
访问即可:
API测试集群功能
集群维护常用操作
- 查看集群Server节点当前的状态
[root@node1 ~]# consul operator raft list-peers -http-addr=192.168.99.3:8510
Node ID Address State Voter RaftProtocol
1 c1f3c9fe-8552-b507-a88e-2829a6d1e5a6 172.17.0.3:8300 leader true 3
2 6e400de1-6736-6861-6dc5-96c126c87b73 172.17.0.4:8300 follower true 3
3 208eb38e-abc7-809c-1571-53b8672e34a6 172.17.0.5:8300 follower true 3
通过Consul集群的/v1/agent/members
接口查看集群成员
[root@node1 ~]# curl --location --request GET 'http://192.168.99.3:8510/v1/agent/members'
[{"Name":"721d401b9555","Addr":"172.17.0.6","Port":8301,"Tags":{"acls":"0","build":"1.9.1:ca5c3894","dc":"dc1","id":"2f036436-03a1-d56a-9e40-ef6d8ed0256d","role":"node","segment":"","vsn":"2","vsn_max":"3","vsn_min":"2"},"Status":1,"ProtocolMin":1,"ProtocolMax":5,"ProtocolCur":2,"DelegateMin":2,"DelegateMax":5,"DelegateCur":4},...]
多数据中心的模拟
构建多数据中心,网络需要满足如下要求:
- 所有的Server节点都是互通,否则,基于gossip协议的RPC转发将无法工作。如果服务发现是可以跨数据中心,网络必须能够跨区域之间的路由的IP地址以及。
- 如果使用服务发现,那么所有的数据中心都是互通的,或者基于VPN或其他隧道机制是互通的。Consul不能处理
VPN
、address rewritting
,或者NAT traversal
。
mkdir /data/dc3
[root@node1 ~]# docker run -d -p 8530:8500 -v /data/dc3:/consul/data -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_dc3_1 consul agent -server -bootstrap -ui -node=consul_server_dc3_1 -datacenter dc3 -client='0.0.0.0'
da5cfc5c4489f586262f0f5698cc7ff5721e9758427342987e04d9f6dc155f3b
[root@node1 ~]# consul members -http-addr 192.168.99.3:8530
Node Address Status Type Build Protocol DC Segment
consul_server_dc3_1 172.17.0.11:8301 alive server 1.9.1 2 dc3
[root@node1 ~]# docker exec consul_server_dc3_1 consul join -wan 172.17.0.3
Successfully joined cluster by contacting 1 nodes.
[root@node1 ~]# consul members -wan -http-addr 192.168.99.3:8500
Node Address Status Type Build Protocol DC Segment
1.dc1 172.17.0.3:8302 alive server 1.9.1 2 dc1
2.dc1 172.17.0.4:8302 alive server 1.9.1 2 dc1
3.dc1 172.17.0.5:8302 alive server 1.9.1 2 dc1
consul_server_dc3_1.dc3 172.17.0.11:8302 alive server 1.9.1 2 dc3