Docker——consul容器服务更新与发现

什么是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.141docker-ce、consul、consul-template、nginx(反向代理)
node后端节点192.168.11.133docker-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中拉取参数,生成一个新的配置文件并进行重载,这时的配置文件就是在动态的变化

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值