环境:
Linux:centos7
Docker:v1.13.1
Consul: v1.12.2

1. 前言

搭建一个三节点的consul集群,一般得有同网段的3个不同的ip地址作为consul集群的内部通信地址,这对于处于尝鲜阶段的同学不太友好(我没有这么多PC、服务器,也没这么多资源搞VM),所以这里通过docker的方式生成3个consul节点搭建consul集群。

先附上consul集群的架构图

consul 集群容灾处理 consul docker集群_consul


简单罗列consul的几个概念,有助于后面搭建consul集群的理解

  • consul的集群是由N个server节点,加上M个client节点组成,所有的服务都可以注册到这些节点上。server节点会把信息持久化
  • server节点之间自行选举一个leader,节点个数一般3-5台
  • 集群内端口的作用:

    8300:集群内数据的读写和复制
    8301:单个数据中心lan gossip协议通讯
    8302:跨数据中心wan gossip协议通讯
    8500:提供获取服务列表、注册服务、注销服务等HTTP接口;提供UI服务
    8600:采用DNS协议提供服务发现功能

2. 准备

2.1 docker

先用centos7镜像起了一个桥接模式下的vmware虚机,然后安装好docker,可以看到容器网桥的默认地址是172.17.0.1,后面会以该网段的地址作为consul集群的内部通信地址

consul 集群容灾处理 consul docker集群_微服务_02

2.2 consul镜像

直接使用命令docker pull consul拉取consul镜像,下载结束后,有如下结果

consul 集群容灾处理 consul docker集群_微服务_03

3. consul集群搭建

3.1 创建第一个consul节点

docker run -d --name consul-01 --net host docker.io/consul:latest agent -dev -bind 172.17.0.1 -client 192.168.101.108
  • -d:容器以后台方式运行
  • --name:容器名
  • --net host:consul容器绑定主机的ip,这样的好处就是可以不用-p xx:xx来进行端口映射,直接使用主机ip访问consul的web界面
  • agent -devdocker run ... docker.io/consul:latest后的一段都是consul的命令,agent -dev表示consul节点以开发者模式运行,也属于server模式
  • -bind:指定该consul节点在集群内部的通信地址是172.17.0.1
  • -client:指定客户端访问consul集群(比如consul集群提供的web界面,DNS服务等)的地址是192.168.101.108

创建完成后,使用docker logs <Container ID>查看容器的启动日志,有如下结果

consul 集群容灾处理 consul docker集群_web界面_04

  • Client Addr:表示客户端访问consul集群的地址,比如访问consul的web界面是http://192.168.101.108:8500
  • Cluster Addr:表示consul集群的内部通信地址,对应上述命令-bind 172.17.0.1

3.2 访问consul集群(目前是单节点)的web页面

consul 集群容灾处理 consul docker集群_微服务_05

  • 由于使用的不是Linux桌面系统,所以我们从宿主机上访问consul集群的web页面。如果出现无法访问web的情况,建议先临时关闭linux系统的防火墙systemctl stop firewalld.service

3.3 创建剩余consul节点

docker run -d --name consul-02 -e CONSUL_BIND_INTERFACE=eth0 docker.io/consul:latest agent -server -join 172.17.0.1
  • -e CONSUL_BIND_INTERFACE=eth0:表示该consul节点的集群通信地址使用容器的eth0端口(docker容器除环回地址外默认的端口就是eth0)
  • -server:表示该consul节点工作在server模式
  • -join 172.17.0.1:与172.17.0.1这个地址的节点通信,以加入集群

查看容器的启动log

consul 集群容灾处理 consul docker集群_web界面_06

  • Client Addr:这里没有指定具体的地址,默认使用环回地址
  • Cluster Addr:该consul节点的集群通信地址是172.17.0.2,对应容器的eth0地址

登录web,查看集群节点

consul 集群容灾处理 consul docker集群_微服务_07

最后依葫芦画瓢,建立最后一个consul节点

docker run -d --name consul-03 -e CONSUL_BIND_INTERFACE=eth0 docker.io/consul:latest agent -server -join 172.17.0.1

查看集群节点

consul 集群容灾处理 consul docker集群_微服务_08