docker:搭建 consul 自动发现更新架构

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台容器
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值