环境:
Linux:centos7
Docker:v1.13.1
Consul: v1.12.2
1. 前言
搭建一个三节点的consul
集群,一般得有同网段的3个不同的ip地址作为consul集群的内部通信地址,这对于处于尝鲜阶段的同学不太友好(我没有这么多PC、服务器,也没这么多资源搞VM),所以这里通过docker的方式生成3个consul节点搭建consul集群。
先附上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集群的内部通信地址
2.2 consul镜像
直接使用命令docker pull consul
拉取consul镜像,下载结束后,有如下结果
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 -dev
:docker 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>
查看容器的启动日志,有如下结果
-
Client Addr
:表示客户端访问consul集群的地址,比如访问consul的web界面是http://192.168.101.108:8500
-
Cluster Addr
:表示consul集群的内部通信地址,对应上述命令-bind 172.17.0.1
3.2 访问consul集群(目前是单节点)的web页面
- 由于使用的不是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
-
Client Addr
:这里没有指定具体的地址,默认使用环回地址 Cluster Addr
:该consul节点的集群通信地址是172.17.0.2,对应容器的eth0
地址
登录web,查看集群节点
最后依葫芦画瓢,建立最后一个consul节点
docker run -d --name consul-03 -e CONSUL_BIND_INTERFACE=eth0 docker.io/consul:latest agent -server -join 172.17.0.1
查看集群节点