背景
由于公司目前的主要产品使用的注册中心是consul
,consul
需要用集群来保证高可用,传统的方式(Nginx/HAProxy)会有单点故障问题,为了解决该问题,我开始研究如何只依赖consul
做集群的注册的方式,经过一天的折腾,总算验证了可以通过集群版ConsulClient来进行集群注册,在部署实施过程中也遇到了一些问题,特此记录分享,希望能对有需要的同学有帮助。
主机版集群和docker版集群对比
client+server转发模式的集群部署涉及到两种选择,第一种是直接主机模式部署,2个client
+3个server
,每个consul
实例部署一台主机(适合土豪使用),此种模式的好处就是简单暴力,而且运维相对简单。此种模式的架构部署图如下:
我们选择的是另外一种经济节约模式,docker
化部署,好处就是节约资源,劣势就是要管理许多docker
镜像,在有引入k8s这些容器管理平台之前,后续docker
的运维会比较麻烦,这种模式的架构部署图如下:
通过以上两种模式的架构图我们很清楚的就能知道主机部署模式是最简单直接的,而docker
的模式虽然节省了资源,但是加大了复杂性,增加了运维的难度。但是这种模式应该是在目前容器化的环境下很好的选择,原因很简单,因为充分的利用了资源,容器的运维可以交给容器运维平台去完成,比如k8s等。下面我们来实践下如何进行容器化的consul
集群部署。
环境准备
这里准备了两台虚拟主机,由于是虚拟的主机,对外ip是一样的,所以我们以端口区分。
主机A:192.168.23.222:10385 内网ip:192.168.236.3
主机B:192.168.23.222:10585 内网ip:192.168.236.5
部署配置
步骤一:主机安装Docker环境(以Centos为例)
yum install docker
步骤二:拉取Consul镜像进行部署
docker pull consul
步骤三:给主机Docker分配ip段,防止多主机ip重复
- 在主机A编辑
docker
的/etc/docker/daemon.json
文件,添加下面的内容
"bip": "172.17.1.252/24"
- 在主机B编辑
docker
的/etc/docker/daemon.json
文件,添加下面的内容
"bip": "172.17.2.252/24"
这里的配置是给主机的docker
实例分配ip,因为后续docker
会进行跨主机注册,如果默认注册的话,docker
是用的主机内网,从而导致ip重复,所以这里手动进行ip分配,当然上述的ip配置你可以自定义。
步骤四:在主机A部署Consul
Node1:
docker run -d --name=node_31 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
-p 11300:8300 \
-p 11301:8301 \
-p 11301:8301/udp \
-p 11302:8302/udp \
-p 11302:8302 \
-p 11400:8400 \
-p 11500:8500 \
-p 11600:8600 \
consul agent -server -join=172.17.1.1 -bootstrap