Consul 简介
Consul是HashiCorp公司推出的开源项目,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案相比,Consul称得上是“一站式”解决方案,因为它内置了服务注册与发现框架、分布一致性协议、运行状态检查、Key/Value存储、多数据中心等,不再需要依赖其他工具,使用起来也比较简单。consul 默认端口号8500。
Consul是用Go语言开发的,因此具有天然可移植性(支持Linux、Mac OSX、FreeBSD、Solaris和Windows);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。
要利用Consul实现服务的注册与发现,需要建立Consul Cluster。在Consul方案中,每个提供服务的节点上都要部署和运行Consul的agent,所有运行Consul agent节点的集合会构成Consul Cluster。
Consul agent有两种运行模式:Server和Client。这里的Server和Client只是在Consul集群层面的区分,与搭建在Cluster之上的应用服务无关。以Server模式运行的Consul agent节点用于维护Consul集群的状态。
Consul的特性
●Consul支持健康检查,允许存储键值对
●一致性协议采用Raft算法,用来保证服务的高可用
●成员管理和消息广播采用GOSSIP协议,支持ACL访问控制
● Agent
agent是长期运行在每个Consul集群成员节点上的守护进程。通过consul agent命令启动。agent有client和server两种模式。由于每个节点都必须运行agent,所以节点要么是client要么是server。所有的agent都可以调用DNS或HTTP API,并负责检查和维护服务同步。
● Client
运行client模式的agent,将所有的RPC转发到server。client是相对无状态的。client唯一所做的是在后台参与LAN gossip pool。只消耗少量的资源和少量的网络带宽。
● Server
运行server模式的agent,参与Raft quorum,维护集群的状态,响应RPC查询,与其他数据中心交互WAN gossip,转发查询到leader或远程数据中心。
构建自动发现服务架构
consul服务器所需环境包:Docker-ce、Compose 3、Consul、 Consul -template
后端真实服务器所需环境包: Docker-ce、registrator
●consul服务端 – 192.168.188.132
consul服务端安装配置agent和template,就可自动发现和更新后端服务节点的动态,再部署nginx做为反向代理,以轮询的方式把请求分给后端容器做处理
● registrator后端服务器 – 192.168.188.133
部署regirtrator服务,可监控后端容器的变化,并自动注册服务,传给consul服务端,完成自动发现和更新。
1、consul 服务器部署agent
解压consul软件包
# hostnamectl set-hostname consul
# su
# mkdir /root/consul
# cd /root/consul
# rz -E
把consul_0.9.2_linux_amd64.zip 包复制过来
解压
# unzip consul_0.9.2_linux_amd64.zip
移到/bin目录下,便于识别命令
# mv consul /usr/bin
安装consul-agent代理端
# consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/ var/lib/consul-data \
-bind=192.168.188.132 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
指定服务、前端框架、ui图形web界面、数据存放位置、本地节点IP、客户端监听所有网段、
服务节点名称,日志信息存放到/var/log/consul.log & 后台运行
# netstat -ntap | grep 8500
# systemctl stop firewalld
# setenforce 0
查看consul群集状态
查看consul群集成员
# consul members
# consul info | grep leader
2、后端服务器registrator
安装gliderlabs/registrator
可检查容器运行状态自动注册,还可注销docker容器的服务到服务配置中心
下载registrator镜像,运行其容器应用
# hostnamectl set-hostname registrator
# su
# docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=192.168.188.133 \
consul://192.168.188.132:8500
指定容器名称、指定host网络、指定数据卷、restart功能、指定镜像,本地节点IP、指定consul服务地址
查看镜像和容器
# docker images
可看到registrator latest
# docker ps -a
可看到registrator:latest
创建两个nginx容器, 测试自动发现功能 是否正常
可看到test-01 test-02两个映射端口
# docker run -itd -p:83:80 --name test-01 -h test01 nginx
# docker run -itd -p:84:80 --name test-02 -h test02 nginx
# docker ps -a
网页访问consul服务端192.168.188.132:8500,可看到consul页面,
图形界面展示后端服务器节点
访问后端服务器192.168.188.133:83,可看到test01的nginx首页面
访问后端服务器192.168.188.133:84,可看到test02的nginx首页面
查看两个容器的日志,看到是宿主机客户端来访问的
# docker logs -f test-01
# docker logs -f test-02
3、consul 服务器部署template
创建nginx-template模板
#声明后端服务器池,引用两个变量,分别加载后端服务器地址和容器映射的端口
#监听端口(代理端口,提供给客户端的),指向自己本地地址,日志文件所在位置,首页类型
# cd /root/consul
# vim nginx.ctmpl
upstream http_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 88;
server_name localhost 192.168.188.132;
access_log /var/log/nginx/kgc.cn-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
编译安装nginx
nginx做为反向代理,接受客户端请求,并把请求 以轮询的方式发给后端服务器容器
# yum install gcc pcre-devel zlib-devel -y
# rz -E
把nginx-1.12.0.tar.gz包复制过来
# tar zxvf nginx-1.12.0.tar.gz -C /opt
# . /configure --prefix=/usr/local/nginx
# make && make install
配置nginx
添加vhost目录路径,后面template更新模板会指定vhost目录
# cd /usr/local/nginx/conf/
# vim nginx.conf
修改http段,添加 include vhost/*.conf;
http {
include mime.types;
include vhost/*.conf;
default_type application/octet-stream;
# cd /usr/local/nginx/conf/
# mkdir vhost 创建虚拟主机目录
# mkdir /var/log/nginx 创建日志存放文件目录
# ln -s /usr/local/nginx/sbin/nginx /usr/sbin
解压template
# cd /root/consul
# rz -E
把 consul-template_0.19.3_linux_amd64.zip包复制过来
解压
# unzip consul-template_0.19.3_linux_amd64.zip
把consul-template移到/usr/bin下 便于系统识别命令
# mv consul-template /usr/bin
启动nginx
# /usr/local/nginx/sbin/nginx
# netstat -ntap | grep 80
配置并启动template
用consul-template命令 配置自动更新,监控后端容器的变化
输入这条命令后,无法再输入指令
# consul-template -consul-addr 192.168.188.132:8500 \
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
指向consul服务端节点
指定template模板路径:生成到vhost下:重载nginx
日志级别为info
另开一个终端 查看,可看到自动生成了kgc.conf配置文件, 且变量已变成具体的容器IP和端口
# cd /usr/local/nginx/conf/vhost
# ls
可看到kgc.conf配置文件,是根据template模板 生成的
# cat kgc.conf
通过代理IP和端口192.168.188.132:100,可访问nginx首页,多刷新几次
再次查看test01 test02日志
可看到是consul服务端192.168.188.132来访问的
因为nginx作为反向代理来访问容器,而且是以轮询的方式访问
# docker logs -f test-01
# docker logs -f test-02
4、后端服务器 增加一个nginx容器节点
测试consul服务是否可以 自动发现及更新配置
# docker run -itd -p:85:80 --name test-03 -h test03 nginx
# docker ps -a
可看到test-03容器
容器会在registrator 注册
5、consul服务端
配置文件已更新,可看到配置文件里又多了一个test03容器IP和端口
consul就做到了对容器的监控,自动发现和更新容器状态
# cd /usr/local/nginx/conf/vhost
# cat kgc.conf
6、后端服务器
网页访问 192.168.188.132:100,多刷新几次
再查看3台nginx容器日志,请求正常轮询到各个容器节点上
# docker logs -f test-01
# docker logs -f test-02
# docker logs -f test-03
网页访问consul服务端192.168.188.132:8500,可看到consul图形界面,监控后端服务器节点的3台容器