Consul是一种分布式、高可用、支持水平扩展的服务注册与发现工具。包含的特性有:服务发现、健康检查、键值存储、多数据中心和服务管理页面等。

官方服务架构图:

alpine django docker 集成 consul docker集成_bootstrap

  图中包含两个Consul数据中心(即两个Consul集群)。数据中心1由多个SERVER和CLIENT组成,数据中心2由多个CLIENT组成。对于Consul集群而言,SERVER或CLIENT都是集群的一个节点,服务可注册到任意节点上,从而实现注册信息共享。

    # CLIENT

    表示consul的client模式,所有注册到当前节点的服务会被转发到SERVER,本身不持久化数据。其职责是健康检查、服务注册等,当服务数量特别庞大时,分别启动多个client可减少server压力。

    # SERVER

    表示consul的server模式,功能和CLIENT都一样,区别是它能把所有信息持久化到本地,遇到故障时,信息是可以被保留的。

    # LEADER

    图中中间SERVER带有LEADER标识,说明在多个SERVER中,其为老大。它负责各个节点的健康检查和同步注册信息给其他SERVER。

一、在docker中部署portainer

  Portainer是Docker的图形化管理工具,由GO语言编写的,提供状态显示、应用模板快速部署、对于Docker(容器、镜像、网络、数据卷)的基本操作、日志显示、容器控制台等功能。

1)、docker search portainer命令查询最新的protainer镜像
2)、docker pull portainer/portainer 拉取镜像
3)、docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock \ -v /home/docker/portainer:/data \ --name portainer --restart=always  portainer/portainer  运行镜像
4)、访问:http://ip:9000 ,首次登陆需要初测portainer用户

alpine django docker 集成 consul docker集成_数据中心_02

 

 

二、部署consul集群

1、docker search consul 查询consul镜像

2、docker pull consul 拉取consul镜像

3、docker run -d --name=consul1 -p 8500:8500 -e CONSUL_BIND_INTERFACE=eth0 --restart=always consul agent --server=true --bootstrap-expect=3 --client=0.0.0.0 -ui 运行第一个consul容器

4、通过portainer查看consul1的ip地址(或者docker inspect --format '{{ .NetworkSettings.IPAddress }}' consul1 ,consul1是对应的容器名称)来查看consul1的ip地址

5、docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.3 运行第二个consul容器

6、docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.3 运行第三个consul容器

7、docker run -d --name=consul4 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.3 运行第四个consul容器

8、查看集群成员

  通过portainer进入到容器,输入命令consul  members 即可查看consul集群成员

  

alpine django docker 集成 consul docker集成_数据中心_03

 

 9、查看投票状态

   通过portainer进入到容器,输入命令consul operator raft list-peers即可查看节点选举投票结果

alpine django docker 集成 consul docker集成_bootstrap_04

 

 

10、访问 http://localhsot:8500 访问consul,即可发现:

alpine django docker 集成 consul docker集成_bootstrap_05

 

其中,带leader标识的节点即为服务的老大,由它将数据同步到各个service上 

 

 

三、配置参数说明

-bootstrap-expect

    --配置数据中心中预期的SERVER的数量,当集群中启动的SERVER达到预期值时,Consul开始引导集群;

-bind

    --内部集群通信绑定的地址,默认情况下是"0.0.0.0";

-client

    --consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0;

-config-file

    --服务启动时要加载的配置文件;

-config-dir

    --配置文件目录;

-config-format

    --指定要加载的配置文件的格式;

-data-dir

    --数据目录;

-dev

    --启用开发服务器模式。对于在关闭所有持久性选项的情况下快速启动consul代理非常有用,不适合生产使用,因为它不将任何数据写入磁盘;

-join

    --启动时要加入到的另一位代理地址;

-retry-join

    --加入失败后重试连接,对于明确可用地址的情况下很有用;

四、故障演示

  此集群有4个节点,期望节点数是3,当其中一台server故障时,将自动选取新的leader,操作如下:

  1、在停掉某一台服务之前,每个节点的状态如下:

 

alpine django docker 集成 consul docker集成_数据中心_06

  2、将leader 节点停掉之后,将自动选取一个新的leader节点,如下图所示:

  

alpine django docker 集成 consul docker集成_bootstrap_07

五、docker重启,如何将其他节点加入到集群

  1、查看leader节点的ip地址

  2、通过 consul join  IP地址,使节点加入到集群

 

六、如何在window下启动consul server模式

  1、下载consul,并解压到到文件

  2、配置环境变量

  

alpine django docker 集成 consul docker集成_docker_08

 

 

  3、新建data文件夹

 

alpine django docker 集成 consul docker集成_docker_09

4、运行命令 consul agent -server -bootstrap-expect 1 -data-dir=D:\consul\server1\data -node=consul1 -client=0.0.0.0 -bind=127.0.0.1 -ui 

 

 

 

 

7、consul集群

  1、准备三台服务器,分别是 s1:192.168.15.1、s2:192.168.15.2、s3:192.168.15.3

  2、分别在三台服务器上执行以下命令

  consul agent -server -bootstrap-expect 1 -data-dir=D:\consul\server1\data -node=consul1 -client=0.0.0.0 -bind=192.168.15.1 -ui 

  consul agent -server -bootstrap-expect 2 -data-dir=D:\consul\server1\data -node=consul1 -client=0.0.0.0 -bind=192.168.15.2 -ui 

  consul agent -server -bootstrap-expect 3 -data-dir=D:\consul\server1\data -node=consul1 -client=0.0.0.0 -bind=192.168.15.3 -ui 

  3、分别在s2,s3服务器上执行,consul -join 192.168.15.1

  4、打开浏览器访问:http://ip:8500地址