Docker中部署Consul集群

在微服务架构中,为了保证各个节点的高可用,最常用的做法就是集群,服务实例做集群, 网关,服务发现等也需要做集群,接下来就来实践一下,在Docker中给Consul做集群。

使用kubespray部署k8s集群 k8s部署consul集群_consul


部署之前,先来了解一下Consul的集群,Consul中分为Client节点和Server节点,Client节点数量无限制,Server节点需要大于等于3个,这样才可以通过投票选举算法选出Leader,由Leader节点负责数据的同步,若Leader节点挂了,则会在剩下的两个节点继续用投票选举算法选出Leader,若Leader再挂了,只剩下一个节点,则无法在投票了,集群崩溃。正常在配置Consul集群之后,Consul也是有多个Ip和端口的,Api Geteway也不知道该调用哪一个,所在在Api Gateway和Consul之间,还需要用Nginx做路由转发,图如下,本篇内容不涉及那么多,只部署下Consul的集群,以及演示下基于consul 的分布式存储。

使用kubespray部署k8s集群 k8s部署consul集群_集群_02


下载Consul的镜像,命令如下

docker pull consul

使用kubespray部署k8s集群 k8s部署consul集群_docker_03

接下来开始启动容器。
启动Node1(Server)

docker run --name node1 -d \
-p 8500:8500 \
-p 8300:8300 \
-p 8301:8301 \
-p 8302:8302 \
-p 8600:8600  \
--restart=always  consul agent  -server \
-bootstrap-expect 3 -ui \
-bind=0.0.0.0 -client=0.0.0.0

打印node1的IP地址。

docker inspect --format '{{.NetworkSettings.IPAddress}}' node1
docker inspect --format '{{.NetworkSettings.IPAddress}}' node 1 | awk '{FS=" "} {print $1}'

启动Node2(Server)

docker inspect --format '{{.NetworkSettings.IPAddress}}' \
node1 | awk '{FS=" "} {print $1}' | xargs -n 1 \
docker run \
--name node2 -d  \
-p 9500:8500 \
--restart=always consul agent -server \
-ui -bind=0.0.0.0 -client=0.0.0.0 -join $1

启动Node3(Server)

docker inspect --format '{{.NetworkSettings.IPAddress}}'  \
node1 | awk '{FS=" "} {print $1}' | xargs -n 1 \
docker run --name node3  -d \
-p 10500:8500  \
--restart=always consul agent -server \
-ui -bind=0.0.0.0 -client=0.0.0.0 -join $1

启动node4(Client)

docker inspect --format '{{.NetworkSettings.IPAddress}}'  \
node1 | awk '{FS=" "} {print $1}' | xargs -n 1 \
docker run -d --name=node4  --restart=always \
-p 11500:8500 \
consul agent -ui -bind=0.0.0.0 -client=0.0.0.0  -join $1

都启动完成之后,使用命令ps查看一下正在运行的容器。

docker ps

使用kubespray部署k8s集群 k8s部署consul集群_分布式存储_04

从上面可以看出来4个容器都已经启动了。

查看节点信息.

docker exec -t node1 consul members

使用kubespray部署k8s集群 k8s部署consul集群_使用kubespray部署k8s集群_05


从上面图中可以看出来,我们一共启动了4个节点,其中三个Server节点,1个Client节点。

查看主从信息

docker exec -t node1 consul operator raft list-peers

使用kubespray部署k8s集群 k8s部署consul集群_分布式存储_06

可以看出来有一个leader节点和两个follower节点。

注意事项:这里我的用是阿里云的ECS,若想在本地访问,则需要提前在安全组规则中配置好相应的入方向的端口信息。

使用kubespray部署k8s集群 k8s部署consul集群_consul_07


页面中可以正常访问Consul了。

使用kubespray部署k8s集群 k8s部署consul集群_consul_08

consul中的分布式存储

在Consul集群中,我们选择任意一个端口,选择Key/Value,并点击create,去创建一个键值对。

使用kubespray部署k8s集群 k8s部署consul集群_使用kubespray部署k8s集群_09


比如我这里key输入name ,value输入Alice,然后点击Save。

使用kubespray部署k8s集群 k8s部署consul集群_集群_10


然后,我打开其他的页面。发现其他三个页面中的key/value都已经有刚才的输入值了。

使用kubespray部署k8s集群 k8s部署consul集群_docker_11


这就是Consul集群中的分布式存储,这里只是简单做一下演示,Consul都提供了相应的api可以去调用,感兴趣的同学可以继续去研究。