Docker--Consul服务部署

一.Consul简介

  • Consul是一个用来实现分布式系统的服务发现与配置的开源工具,也是高可用,可以横向扩展的。
  • consul采用golang开发,所有依赖都编译到了可执行程序中,即插即用
  • consul部署的时候分server节点和client节点(通过不同的启动参数区分),server节点做leader选举和数据一致性维护,client节点部署在服务机器上,作为服务程序访问consul的接口
  • consul的一致性协议采用更流行的Raft。
  • consul可以跨机房支持多数据中心部署,有效避免了单数据中心故障不能访问的情况。
  • consul 采用DNS或者http获取服务信息,没有主动通知,需要自己轮训获取。
  • consul自带一个Web UI管理系统, 可以通过参数启动并在浏览器中直接查看信息。

二.Consul组成部分

  • 服务发现:客户端通过Consul提供服务,类似于API,MySQL,或者其他客户端可以使用Consul发现服务的提供者。使用类似DNS或者HTTP,应用程序和可以很轻松的发现他们依赖的服务。

  • 检查健康:Consul客户端可以提供与给定服务相关的健康检查(Web服务器返回200 ok)或者本地节点(“内存利用率低于90%”)。这些信息可以监控集群的运行情况,并且使访问远离不健康的主机组件。

  • 键值对存储:应用程序可以使用Cousul的层级键值对。

  • 多数据中心:Consul有开箱及用的多数据中心。

三.consul提供的关键特性

  • service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。

  • health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。

  • key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。

  • multi-datacenter:无需复杂的配置,即可支持任意数量的区域。

四.Consul 的角色

  • client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群.

    扫描二维码关注公众号,回复: 13142561 查看本文章
  • server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个

  • agent
    组成 consul 集群的每个成员上都要运行一个 agent,可以通过 consul agent 命令来启动。agent 可以运行在 server 状态或者 client 状态。自然的,运行在 server 状态的节点被称为 server 节点;运行在 client 状态的节点被称为 client 节点。

  • client 节点
    负责转发所有的 RPC 到 server 节点。本身无状态,且轻量级,因此,可以部署大量的 client 节点。

  • server 节点
    负责组成 cluster 的复杂工作(选举、状态维护、转发请求到 lead),以及 consul 提供的服务(响应 RCP 请求)。考虑到容错和收敛,一般部署 3 ~ 5 个比较合适。

五.Consul内幕

  • 代理(agent):代理是Consul集群上每个成员的守护进程,它是由consul agent开始运行。代理能够以客户端或服务器模式运行。由于所有节点都必须运行代理,所以将节点引用为客户端或服务器更为简单,但还有其他实例的代理。所有代理可以运行DNS或HTTP接口,并负责运行检查和保持服务同步。

  • 客户端:客户端可以将所有RPC请求转发到服务器的代理。客户端是相对无状态的。客户端执行的唯一后台活动是LANgossip池。它消耗最小的资源开销和少量的网络带宽。

  • 服务器端:服务器端是具有扩展的功能的代理,它主要参与维护集群状态,响应RPC查询,与其他数据中心交换WAN gossip ,以及向上级或远程数据中心转发查询。

  • 数据中心:虽然数据中心的定义似乎很明显,但仍有一些细微的细节必须考虑。我们将一个数据中心定义为一个私有、低延迟和高带宽的网络环境。这不包括通过公共互联网的通信,但是为了我们的目的,单个EC2区域内的多个可用区域将被视为单个数据中心的一部分

  • Gossip:consul是建立在serf之上的,它提供了一个完整的gossip协议,用在很多地方。Serf提供了成员,故障检测和事件广播。Gossip的节点到节点之间的通信使用了UDP协议。

  • LAN Gossip:指在同一局域网或数据中心的节点上的LAN Gossip池。

  • WAN Gossip:指包含服务器的WAN Gossip池,这些服务器在不同的数据中心,通过网络进行通信。

  • 一致性协议采用 Raft 算法,用来保证服务的高可用.

  • 成员管理和消息广播 采用GOSSIP协议,支持ACL访问控制。

六.consul服务部署实验

1.实验准备

两台虚拟机都需要安装docker服务
两台虚拟机都要关闭防火墙

主机名 ip地址 操作系统 主要软件
Server 192.168.164.128 centos7 docker-ce docker-compose3 consul consul-template
Cliert 192.168.164.130 centos7 docker-ce registor

2.Server节点步骤(192.168.164.128)

1.安装部署consul

mkdir consul                                     #创建consul目录
cd consul/                                       #进入consul目录
rz                                               #加入压缩包

ls                                               #查看
consul_0.9.2_linux_amd64.zip  
consul-template_0.19.3_linux_amd64.zip           #加入的是这两个压缩包

unzip consul_0.9.2_linux_amd64.zip               #解压缩,zip结尾用unzip解压
mv consul /usr/bin/                              #将解压的可执行文件移动到路径环境变量下便于系统识别
consul agent \                                   #初始化
-server \                                        #模式:server
-bootstrap \                                     #角色:leader
-ui \                                            #ui可视化界面
-data-dir=/var/lib/consul-data \                 #数据存储位置是/var/lib/consul-data 
-bind=192.168.164.128 \                          #绑定地址:本地ip
-client=0.0.0.0 \                                #监听所有地址
-node=consul-server01 &> /var/log/consul.log &   #节点更名为consul-server01生成的日志放在/var/log/consul.log  并进行后台运行

2.查看集群信息

consul members                                   #查看群集成员
consul info |grep leader                         #查看leader信息

在这里插入图片描述

在这里插入图片描述

3.注意consul默认端口为8500

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            #集群节点详细信息

3.Client节点部署(192.168.164.130)

1.安装registor

docker run -d \                              #后台运行
--name=registrator \                         #容器名称:registrator
--net=host \                                 #域名空间:host
-v /var/run/docker.sock:/tmp/docker.sock \   #通讯进程,挂载共享
--restart=always \                           #容器发生问题就会重启
gliderlabs/registrator:latest \              #下载镜像
-ip=192.168.164.130 \                        #本地IP地址
consul://192.168.164.128:8500                #指向consul地址和端口

2.创建容器,测试发现服务是否正常

docker run -itd -p:86:80 --name test-01 -h test01 nginx
docker run -itd -p:88:80 --name test-02 -h test02 nginx
docker run -itd -p:82:80 --name test-03 -h test03 httpd
docker run -itd -p:84:80 --name test-04 -h test04 httpd
docker ps -a

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 回到Server节点
curl 127.0.0.1:8500/v1/catalog/services    #查看服务

4.访问测试

  • 通过浏览器访问http://192.168.164.128:8500,查看服务
    在这里插入图片描述

5.安装consul-template自动更新模板

  • Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行shell命令执行更新操作,重新加载Nginx。
  • Consul-Template可以查询Consul中的服务目录、Key、Key-values等。
  • 这种强大的抽象功能和查询语言模板可以使Consul-Template特别适合动态的创建配置文件。

6.准备template nginx模板文件

1.在server服务器上操作(192.168.164.128)

vim /root/consul/nginx.ctmpl
upstream http_backend {
  {
   
   {range service "nginx"}}
   server {
   
   {.Address}}:{
   
   {.Port}};
  {
   
   {end}}
}

server {
  listen 83;
  server_name localhost 192.168.164.128;
  access_log /var/log/nginx/gcc.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;
}
}

2.编译安装nginx,server服务器上操作(192.168.164.128)

yum install gcc pcre-devel zlib-devel -y
tar zxvf nginx-1.12.0.tar.gz -C /opt
cd //opt/nginx-1.12.0
./configure --prefix=/usr/local/nginx
make && make install

3.配置nginx,server服务器上操作(192.168.164.128)

vim /usr/local/nginx/conf/nginx.conf
http {
   include  mime.types;
   include  vhost/*.conf;                   #添加虚拟主机目录
   default_type application/octet-stream;

mkdir /usr/local/nginx/conf/vhost           #创建虚拟主机目录
mkdir /var/log/nginx                        #创建日志文件目录
/usr/local/nginx/sbin/nginx                 #启动nginx

4.配置并启动 template,server服务器上操作(192.168.164.128)

cd /root
#上传consul-template_0.19.3_linux_amd64.zip包到/root目录下
unzip consul-template_0.19.3_linux_amd64.zip   #解压缩
mv consul-template /usr/bin/
consul-template -consul-addr 192.168.164.128:8500 -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info

##另外打开-个终端查看生成配置文件##
[root@localhost vhost]#cat /usr/local/nginx/conf/vhost/test.conf
upstream http_backend {
  
   server 192.168.164.130:86;
  
   server 192.168.164.130:88;
  
}

server {
  listen 83;
  server_name localhost 192.168.164.128;
  access_log /var/log/nginx/gcc.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;
}
}

猜你喜欢

转载自blog.csdn.net/LI_MINGXUAN/article/details/115235919