一、定义
Consul 是一个支持多数据中心分布式高可用的 服务发现 和 配置共享 的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源。 Consul 支持 健康检查,并允许 HTTP 、GRPC 和 DNS 协议调用 API 存储键值对.
命令行超级好用的虚拟机管理软件 vgrant 也是 HashiCorp 公司开发的产品.
一致性协议采用 Raft 算法,用来保证服务的高可用. 使用 GOSSIP 协议管理成员和广播消息, 并且支持 ACL 访问控制.
1、Consul 使用场景
Docker 实例的注册与配置共享
Coreos 实例的注册与配置共享
SaaS 应用的配置共享、服务发现和健康检查。
vitess 集群
与 confd 服务集成,动态生成 nginx 和 haproxy 配置文件
2、Consul 优势
使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft.
支持 多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟,分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持。
支持 健康检查。 etcd 不提供此功能。
支持 HTTP、DNS 和 GPRS 协议接口。 zookeeper 的集成较为复杂,etcd 只支持 http 协议。
官方提供 WEB管理界面,etcd 无此功能。
综合比较, Consul 作为服务注册和配置管理的新星,比较值得关注和研究。
3、Consul的四大核心特性:
consul是分布式的、高可用、横向扩展的
服务发现:可以方便的实现服务注册,通过DNS或者HTTP应用程序可以很容易的找到他所依赖的服务.
Key/Value存储:使用Key/Value进行数据存储。
多数据中心:Consul支持开箱即用的多数据中心。这意味着用户不需要担心建立额外的抽象层让业务扩展到多个区域
健康检查:可以对指定服务进行健康检查例如,Response Status是否为200,避免将流量转发到不健康的服务上。
4、构建核心
template 模板(更新)
registrator (自动发现+注册到consul-server端)后端每构建出一个容器,会向registrator进行注册,控制consul完成更新操作,consul会触发consul template模板进行热更新( reload)
核心机制: consul :自动发现、自动更新,为容器提供服务(添加、删除、生命周期)
二、容器服务更新与发现拓扑图
核心就是nginx+后面的容器服务,代理的是容器暴露的端口
让前面nginx不重启服务的情况下识别到后面服务的更新
更新的位置就是nginx里的upstream池
给nginx一个模板,直接识别模板
通过consul
1、registrator 部署在 server上,运行为容器进行操作,发现容器发生变更,识别IP和端口注册在registrator上
2、汇报给consul,更新的IP和端口,agent为代理,consul server只是consul agent其中一个模式。agent控制server收集变更信息并展示出来,在注册中心看到更新信息,并通过templat模板方式定义为标准格式。模板里就有了后端的配置,通过传入变量的方式写入模板中,这样模板中就有了upstraem的配置和后端的信息
3、nginx通过include加载和识别,consul控制nginx重载reload就可以了
三、部署
服务器consul:192.168.226.101 Docker-ce、Consul、 Consul-template
服务器docker:192.168.226.50 Docker-ce、 registrator
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# hostname consul
[root@localhost ~]# su
[root@consul ~]#
[root@localhost ~]# hostname docker
[root@localhost ~]# su
[root@docker ~]#
1、consul服务器操作
[root@consul ~]# mkdir /root/consul
[root@consul ~]# cd consul/
[root@consul consul]# unzip consul_0.9.2_linux_amd64.zip
[root@consul consul]# mv consul /usr/bin
或者
[root@consul consul]# ln -s /root/consul /usr/bin
[root@consul ~]# consul agent \ agent 模式
> -server \ 使用其中的server模式
> -bootstrap \ 前端框架
> -ui \ 可被访问的界面
> -data-dir=/var/lib/consul-data \ 数据目录
> -bind=192.168.133.101 \ consul服务器地址
> -client=0.0.0.0 \ 监听所有地址,主要是含有registror服务的机器地址
> -node=consul-server01 &> /var/log/consul.log & 节点名称写入日志
[root@consul consul]# jobs
[1]+ Running consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.133.101 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log &
[root@consul consul]#
[root@consul consul]# consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.133.101:8301 alive server 0.9.2 2 dc1
[root@consul consul]# consul info |grep leader 此条命令可查询leader信息
leader = true
leader_addr = 192.168.133.101:8300
[root@consul consul]# curl 127.0.0.1:8500/v1/status/peers 查看集群server成员
["192.168.133.101:8300"]
[root@consul consul]# curl 127.0.0.1:8500/v1/status/leader 集群Raf leader
"192.168.133.101:8300"
[root@consul consul]# curl 127.0.0.1:8500/v1/catalog/services 注册所有服务
{"consul":[]}
[root@consul consul]# curl 127.0.0.1:8500/v1/catalog/nginx 查看nginx服务信息
[root@consul consul]# curl 127.0.0.1:8500/v1/catalog/nodes 集群节点详细信息
[{"ID":"727c935f-c6d2-84cf-7628-c01983737f55","Node":"consul-server01","Address":"192.168.133.101","Datacenter":"dc1","TaggedAddresses":{"lan":"192.168.133.101","wan":"192.168.133.101"},"Meta":{},"CreateIndex":5,"ModifyIndex":6}]
2、容器服务自动注册到consul集群
2.1、安装 Gliderlabs/Registrator Gliderlabs/Registrator
可检查容器运行状态自动注册,还可注册docker容器的服务到服务配置中心( consul 8300———》8500展示)
[root@docker ~]# docker run -d \ 运行容器并给与守护进程
> --name=registrator \ 容器名称
> --net=host \ 网络使用host与宿主机同IP
> -v /var/run/docker.sock:/tmp/docker.sock \ 挂载sock
> --restart=always \ 重启策略,非UP就运行
> gliderlabs/registrator:latest \ 镜像文件及标签
> -ip=192.168.133.50 \ 容器地址
> consul://192.168.133.101:8500 配置中心位置
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bfab913fcaa7 gliderlabs/registrator:latest "/bin/registrator -i…" 12 seconds ago Restarting (1) 4 seconds ago registrator
2.2、测试服务发现功能是否正常
在docker服务器上运行4个容器
[root@docker ~]#docker run -itd -p:83:80 --name test-01 -h test01 nginx
[root@docker ~]#docker run -itd -p:84:80 --name test-02 -h test02 nginx
[root@docker ~]#docker run -itd -p:88:80 --name test-03 -h test03 httpd
[root@docker ~]#docker run -itd -p:89:80 --name test-04 -h test04 httpd
在consul服务器上查看
[root@consul ~]# curl 127.0.0.1:8500/v1/catalog/services
再到网站上看,已发现和注册了4个新建的容器
3、安装nginx
[root@consul ~]# yum install gcc pcre-devel zlib-devel -y
[root@consul ~]# cd /opt
[root@consul opt]# tar zxf nginx-1.12.0.tar.gz
[root@consul opt]# cd nginx-1.12.0/
[root@consul nginx-1.12.0]# ./configure --prefix=/usr/local/nginx
[root@consul nginx-1.12.0]# make && make install
4、配置nginx
[root@consul ~]# cd /usr/local/nginx/conf/
[root@consul conf]# vim nginx.conf
[root@consul conf]# mkdir vhost
[root@consul sbin]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@consul sbin]# nginx 启动nginx
[root@consul sbin]# ss -natp |grep nginx
LISTEN 0 128 *:80 *:* users:(("nginx",pid=5294,fd=6),("nginx",pid=5293,fd=6))
5、配置模板
[root@consul ~]# cd /root/consul/
[root@consul consul]# ls
consul_0.9.2_linux_amd64.zip
[root@consul consul]# vim nginx.ctmpl
upstream http_backend { 协议的后端
{{range service "nginx"}} 服务的范围只收集nginx信息
server {{.Address}}:{{.Port}}; 此处引用的变量会指向后端的地址和端口(动态变化)
{{end}}
}
server {
listen 84;
server_name localhost 192.168.133.101; 反向代理的服务器地址,前端服务器地址
access_log /var/log/nginx/zy.com-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr; 后端真实IP
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 转发地址
proxy_pass http://http_backend;
}
}
6、配置并启动consul-template
Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。
更新完成以后,可以选择运行 shell命令执行更新操作,重新加载Nginx。Consul-Template可以查询consul 中的服务目录、Key、Key-values 等。
这种强大的抽象功能和查询语言模板可以使Consul-Template 特别适合动态的创建配置文件。
[root@consul ~]# cd /opt
[root@consul opt]# unzip consul-template_0.19.3_linux_amd64.zip
[root@consul opt]# mv consul-template /usr/bin
[root@consul opt]# consul-template \
-consul-addr 192.168.133.101:8500 \ 指向可视化端口
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/zy.conf:/usr/local/nginx/sbin/nginx -s reload" \ 通过哪个文件重载nginx
--log-level=info 日志级别
[root@consul vhost]# cat /usr/local/nginx/conf/vhost/zy.conf
7、测试
在docker服务器上再创建一个nginx容器
[root@docker ~]# docker run -itd -p:85:80 --name test-05 -h test05 nginx
85d367c0ecd14099e6737f02c0ee71d7cdcf71da1c0933c6398d41cddf8423f5
创建日志文件夹,如果没有consul上的nginx无法启动,必须要有这个目录根据模板内的设定建立
[root@docker ~]# mkdir -p /var/log/nginx 创建日志文件夹
[root@docker ~]# nginx -s reload 重载nginx
[root@docker ~]# curl 127.0.0.1:83
[root@docker ~]# docker logs -f test-01
[root@docker ~]# docker rm -f 5ceb74bfaeb7
5ceb74bfaeb7
[root@consul vhost]# pwd
/usr/local/nginx/conf/vhost
[root@consul vhost]# cat zy.conf