Docker 容器部署 Consul 集群

一、Consul 介绍

         Consul 提供了分布式系统的服务发现和配置的解决方案。基于go语言实现。并且在git上开放了源码。consul还包括了分布式一致协议的实现,健康检查和管理UI。Docker 的简单介绍,可以参考前面一篇文章。配合Docker来做应用容器,用Consul 来做集群的服务发现和健康检查,并且还可以轻量级得做到水平和垂直可扩展。

二、Consul Agent、Server、Client

        通过运行 consul agent 命令,可以通过后台守护进程的方式运行在所有consul集群节点中。并且可以以server或者client 模式运行。并且以HTTP或者DNS 接口方式,负责运行检查和服务同步。Server模式的agent负责维护consul集群状态,相应RPC查询,并且还要负责和其他数据中心进行WAN Gossips交换。client 节点是相对无状态的,Client的唯一活动就是转发请求给Server节点,以保持低延迟和少资源消耗。

 

        如下图,是官网的一个典型系统结构,Consul建议我们每个DataCenter的Server的节点最好在3到5个之间,以方便在失败以及数据复制的性能。Client的数量可以任意。图中,最重要的两个概念一个是Gossip协议,一个是Consensus 协议。DataCenter的所有节点都会参与到Gossip协议。Client 到Server 会通过LAN Gossip。所有的节点都在Gossip pool中,通过消息层来实现节点之间的通信以达到故障检测的目的,并且不需要给Client配置Server的地址。而Server节点还会参与到WAN Gossip池中。这样,通过Server节点就可以让DataCenter之间做简单的服务发现。比如增加一个Datacenter就只需要让Server节点参与到Gossip Pool中。并且,DataCneter之间的通信和服务请求就可以通过WAN Gossip 来随机请求另外一个DataCenter的Server节点,然后被请求的Server 会再把请求foword到本DataCenter的leader节点。Server leader的选举是通过Consul的Raft 算法实现。Leader 节点需要负责所有请求和处理,并且这些请求也必须复制给所有的其他非leader的Server节点。同样,非Leader节点接收到RPC请求的时候也会foward 到leader节点。

 

三、在Docker 容器中启动Consul Agent

1、下载 progrium/consul 镜像

2、以Server 模式在容器中启动一个agent

docker run -p 8600:53/udp -h node1 progrium/consul -server -bootstrap

这里试验一下8600(DNS) 接口,然后我们就用dig的方式可以交互和访问了。

 

四、用Docker 容器启动Consul集群

1、分别启动三个server节点

         用bootstrap-expect 3 来启动三个服务节点,并且绑定到容器的同一个ip

docker@boot2docker:~$ docker run -d --name node1 -h node1 progrium/consul -server -bootstrap-expect 3

 

docker@boot2docker:~$ JOIN_IP="$(docker inspect -f '{{ .NetworkSettings.IPAddress }}' node1)”

 

docker@boot2docker:~$ docker run -d --name node2 -h node2 progrium/consul -server -join $JOIN_IP

 

docker@boot2docker:~$ docker run -d --name node3 -h node3 progrium/consul -server -join $JOIN_IP

2、启动client节点

        docker@boot2docker:~$ docker run -d -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node4 progrium/consul -join $JOIN_IP

查看容器信息:

3、进入容器查看

        我们可以进入容器来查看一下consul是如何管理agent节点,以及选举server 的leader的。

Server node3 节点如下:


        这个时候我们关掉Server节点,容器name是node1的 d7a68580a730 容器,再观察

node3节点信息如下:

 

 

Server node2 节点如下:

Client 节点node4如下:


 

        用Consul还可以做Docker容器内部的健康监测, DNS Docker Container 以及运行时配置管理。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

container重启一个节点的时候并且暴露相同的端口的时候会造成心跳检测失败。如下:

 

此时,需要等上3分钟左右再重启或者手动清空ARP表的缓存。

版权声明:本文为博主原创文章,未经博主允许不得转载。

猜你喜欢

转载自yunshen0909.iteye.com/blog/2245926