文章目录
什么是consul?
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。
它主要由多个组成部分:
- 服务发现:客户端通过Consul提供服务,类似于API,MySQL,或者其他客户端可以使用Consul发现服务的提供者。使用类似DNS或者HTTP,应用程序和可以很轻松的发现他们依赖的服务。
- 检查健康:Consul客户端可以提供与给定服务相关的健康检查(Web服务器返回200 ok)或者本地节点(“内存利用率低于90%”)。这些信息可以监控集群的运行情况,并且使访问远离不健康的主机组件。
- 键值对存储:应用程序可以使用Cousul的层级键值对。
- 多数据中心:Consul有开箱及用的多数据中心。
Consul的特性
- Consul支持健康检查,允许存储键值对
- 一致性协议采用Raft算法,用来保证服务的高可用
- 成员管理和消息广场采用GOSSIP协议,支持ACL访问控制
方便部署,与Docker等轻量级容器可无缝配合
软件包:
百度网盘链接:https://pan.baidu.com/s/1pYu12vUpSnwyNpgPzjduEQ
提取码:v14g
一、构建自动发现的Docker服务架构
- 每个提供服务的节点上都要部署和运行Consul的agent
- Consul agent有两种运行模式:
- Server
- Client
- Server和Client只是Consul集群层面的区分,与搭建在Cluster之上的应用服务无关
节点 | IP | 部署服务 |
---|---|---|
consul服务器 | 192.168.11.141 | docker-ce、consul、consul-template、nginx(反向代理) |
node后端节点 | 192.168.11.133 | docker-ce、registrator |
1、建立Consul服务
#创建工作目录
[root@localhost ~]#mkdir consul
#上传软件包并解压
[root@localhost ~]# cd consul
[root@localhost consul]# unzip consul_0.9.2_linux_amd64.zip
[root@localhost consul]# mv consul /usr/bin/
#安装代理端
[root@localhost consul]# consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.11.141 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
#查看集群信息
#查看集群节点详细信息
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/nodes
#通过httpd api获取集群信息
curl 127.0.0.1:8500/v1/status/peers #查看集群server成员
curl 127.0.0.1:8500/v1/status/leader #集群Raf leader
curl 127.0.0.1:8500/v1/catalog/services #注册的所有服务
curl 127.0.0.1:8500/v1/catalog/nginx #查看nginx服务信息
curl 127.0.0.1:8500/v1/catalog/nodes #集群节点详细信息
#关闭防火墙便于其他节点访问
[root@localhost consul]# systemctl stop firewalld.service
[root@localhost consul]# setenforce 0
2、容器服务自动加入consul集群
在后端node节点操作
#安装Gliderlabs/Registrator
检查容器运行状态
自动注册和注销docker容器的服务到服务配置中心
目前支持Consul、Etcd和SkyDNS2.
[root@localhost ~]# docker run -d \
--name=registrator \ #下载容器
--net=host \ #网络host模式
-v /var/run/docker.sock:/tmp/docker.sock \ #数据卷挂载sock通讯文件
--restart=always \ #重启策略
gliderlabs/registrator:latest \ #镜像名称
-ip=192.168.11.133 \ #本机IP地址
consul://192.168.11.141:8500 #指向consul IP地址
3、测试服务发现功能
#测试服务发现功能是否正常
多创建几个容器测试
[root@localhost ~]# docker run -itd -p:81:80 --name test-01 -h test01 nginx
[root@localhost ~]# docker run -itd -p:82:80 --name test-02 -h test02 nginx
[root@localhost ~]# docker run -itd -p:83:80 --name test-03 -h test03 httpd
[root@localhost ~]# docker run -itd -p:84:80 --name test-04 -h test04 httpd
#在consul服务器上查看服务
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/services
{"consul":[],"httpd":[],"nginx":[]}
#验证httpd以及nginx服务是否注册到consul
在浏览器中打开consul:http://192.168.11.141:8500,“单击NODES”,然后点击“consul-server01”,会出现5个服务
#现在我们来看下logs日志
[root@localhost ~]# docker logs -f test-01
二、部署consul-template更新,实现容器服务自动加入Nginx集群
consul-template
consul-template是一个守护进程,用于实时查询consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行shell命令执行更新操作,重新加载nginx
-
基于Consul的自动替换配置文件的应用
-
可以查询Consul中的服务目录、Key、Key-values等
-
特别适合动态的创建配置文件
1、安装consul-template
#准备template nginx模板文件
[root@localhost ~]# vim /root/consul/nginx.ctmpl
upstream http_backend {
#指定nginx的服务
{{range service "nginx"}}
#指向真实服务器的IP地址以及对应的端口 这里面引用的变量会通过consul里面的参数群集自动设置上去
server {{.Address}}:{{.Port}};
{{end}}
}
server {
#对外端口(自定义,不能冲突)
listen 88;
#本地反向代理节点地址
server_name localhost 192.168.11.141;
#指定日志文件的路径(需要创建)
access_log /var/log/nginx/web.cn-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Pral-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;
}
}
#创建日志文件目录
[root@localhost ~]#mkdir /var/log/nginx
2、编译安装nginx
#安装环境包
[root@localhost consul]# yum install -y gcc gcc-c++ pcre-devel zlib-devel
#上传nginx包并解压至opt目录
[root@localhost consul]# tar zxvf nginx-1.12.2.tar.gz -C /opt/
#编译安装
[root@localhost consul]# cd /opt/nginx-1.12.2
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx
[root@localhost nginx-1.12.2]# make && make install
#配置nginx
[root@localhost nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
#创建虚拟主机目录
[root@localhost nginx-1.12.2]# mkdir /usr/local/nginx/conf/vhost
#优化并启动nginx服务
[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/bin/
[root@localhost nginx-1.12.2]# nginx
3、配置并启动template
#上传consul-template包并解压
[root@localhost ~]# cd /root/consul
[root@localhost consul]# unzip consul-template_0.19.3_linux_amd64.zip
#将consul-template移至/usr/bin目录下使系统识别命令
[root@localhost consul]# mv consul-template /usr/bin/
#启动consul-template
[root@localhost consul]# consul-template -consul-addr 192.168.11.141:8500 \
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/web.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
解释:
#指向consul服务端节点IP
consul-template -consul-addr 192.168.11.141:8500 \
#指定模板路径:生成文件指定到vhost文件下命名web.conf:当文件生成完成后配置文件更改,使用nginx -s reload不中断重载服务(模板重新生成之后就会重新加载并生效)
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/web.conf:/usr/local/nginx/sbin/nginx -s reload"
#日志级别为info
–log-level=info
#另外打开终端查看生成的配置文件
[root@localhost ~]# cd /usr/local/nginx/conf/vhost
[root@localhost vhost]# ll
总用量 4
-rw-r--r-- 1 root root 480 4月 25 17:32 web.conf
[root@localhost vhost]# cat web.conf
自动生成了配置文件,且从consul中获取后端节点IP 端口
当访问192.168.11.141的88端口,它会转发给192.168.11.133的81端口,实现反向代理
再访问192.168.11.141的88端口,它会转发给192.168.11.133的82端口,实现反向代理
访问验证
#未访问前的日志信息
#浏览器访问192.168.11.141:88
#再次查看日志文件(分别打开test-01、test-02的日志)
4、增加nginx容器节点
node后端添加容器节点
#目前有两个nginx容器
#再次添加nginx容器
[root@localhost ~]# docker run -itd -p:85:80 --name test-05 -test05 nginx
#我们到consul服务器看一下
#先看下监听后端容器变化的监控
#在看下vhost里面的web.conf配置文件
#node后端Registraror服务器上添加容器的节点nginx还没有被访问,所以还没有日志记录
#现在进行访问验证,新创建的容器是否会产生日志
打开浏览器再次访问192.168.11.141:88(多刷新几次)
访问成功且后端容器节点logs日志显示轮询则说明服务自动发现及更新配置完毕
总结
① congsul依靠这registrator自动发现容器的变化
② 容器一旦产生变化,就会使用template 加载模板,然后从consul中拉取参数,生成一个新的配置文件并进行重载,这时的配置文件就是在动态的变化