Consul(注册中心)部署

目录

前言

一、Docker consul(注册中心)

1、什么是consul

2、consul干什么

3、常见的注册中心

4、Consul 特性

5、Consul的使用场景

6、Consul的基本架构

二、consul集群

1、server部署

2、client部署

3、server端配置template模板自动更新

3.1 配置 nginx.ctmpl 文件

3.2 编译安装nginx修改文件并启动

3.3、配置并启动 template

3.4、在client端 增加一个nginx容器节点

4、测试访问代理服务器


前言

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置
与Docker等轻量级容器可无缝配合

一、Docker consul(注册中心)

1、什么是consul

Consul是HashiCorp公司推出的开源工具,consul包含很多组件,但总体来说,consul是用于实现分布

2、consul干什么

consul可以作为注册中心和配置中心,同时consul与其他注册中心一样,提供了一定的存储能力(存放注册者的信息),同时consul可以对集群中的节点进行监控检查实现故障排除。

1、服务发现:consul提供了通过DNS或者http接口的方式来注册服务和发现服务。一些外部的服务通过consul很容易的找到它所依赖的服务。

2、健康检查:consul的client提供健康检查机制,可以用来避免流量被转发到有故障的节点上。

3、KV存储:应用程序可以根据自己的需要使用consul提供key/value存储。consul提供了简单易用的http接口,结合其他工具可以实现动态配置、功能标记、leader选举等。

4、多数据中心:consul提供了多数据中心机制。这样就可以不用再创建多用的虚拟层来应用多个分区。

5、安全服务通信:consul可以为服务生成和分发TLS证书已建立相互TLS连接。Intentions可以用于定义允许通信的服务。可以通过实时更改的instentions来管理服务隔离,而不需复杂的网络拓扑和静态防火墙策略。

6、提供web的UI界面。

​总结:consul是分布式的、高可用的一个服务管理工具,使用go语言编写,所以可移植性高,使用raft保证数分布式数据一致性及服务的高可用。consul内置了服务注和发现、分布一致性协议实现(采用raft算法)、健康检查、KV存储、多数据中心方案以及服务之间的安全通信。每个consul服务提供节点,都运行一个consul agent(代理),consul agent并不意味着必须发现其它的服务,或者进行相应的数据操作,代理只需要对健康检查负责。代理连接一个或者多个consul服务端,consul服务端存储,复制数据,选取leader。虽然consul服务端可以单例运行,但是通过建议部署3到5个实例集群运行,以防止数据丢失,同时保证server-leader的选择能够正确的进行。

Raft算法属于Multi-Paxos算法,它是在Multi-Paxos思想的基础上,做了一些简化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候选人三种状态,在理解和算法实现上都相对容易许多。从本质上说,Raft算法是通过一切以领导者为准的方式,实现一系列值的共识和各节点日志的一致。

3、常见的注册中心

现在比较流行的也就是Consul和Nacos,这两个注册中心我做的项目当中都涉及到了,Zookeeper没有管理界面,一般不建议使用,而Eureka已经处于停更,并且本身就存在很多bug,一般不建议使用!

Consul(注册中心)部署_第1张图片

4、Consul 特性

  • 服务发现:Consul 的客户端可以注册服务,其他客户端可以使用 Consul 发现给定服务的提供者。使用DNS 或 HTTP,应用程序可以轻松找到它们所依赖的服务
  • 健康检查:Consul客户端可以提供任意数量的健康检查,可以与给定的服务关联(“web服务器是否返回200 OK”),也可以与本地节点关联(“内存利用率是否低于90%”)。操作人员可以使用此信息监视集群运行状况,服务发现组件也可以使用此信息将通信流量路由到远离不健康主机的地方,支持多种方式,HTTP, TCP、 Docker, Shell脚本定制化监控。
    KV 存储:应用程序可以使用Consul的分级 key/value 存储来实现各种目的,包括动态配置、特性标记、协调、leader选举等等。简单的HTTP API使其易于使用。
  • 安全服务通信:Consul可以生成和分发服务的TLS证书,以建立相互的TLS连接。可以使用意图来定义允许哪些服务进行通信。可以很容易地管理服务细分,目的可以实时更改,而不是使用复杂的网络拓扑和静态防火墙规则。
  • 多数据中心:Consul 支持开箱即用的多个数据中心。这意味着 Consul 的用户不必担心构建额外的抽象层以扩展到多个区域。
  • Raft 算法:使用Raft算法完成一致性,Raft将一致性问题分解成了三个独立的部分:leader选举、日志复制、安全性。
  • 自带web管理界面:这一点相比于zookeeper注册中心要好一点,zookeeper是没有自带管理界面的。通过管理界面可以清晰的看到注册了多少个服务,以及在管理界面还可以使用服务配置功能。

5、Consul的使用场景

Consul的应用场景包括服务发现、服务隔离、服务配置:

① 服务发现场景中consul作为注册中心,服务地址被注册到consul中以后,可以使用consul提供的dns、http接口查询,consul支持health check。
② 服务隔离场景中consul支持以服务为单位设置访问策略,能同时支持经典的平台和新兴的平台,支持tls证书分发,service-to-service加密。
③ 服务配置场景中consul提供key-value数据存储功能,并且能将变动迅速地通知出去,借助Consul可以实现配置共享,需要读取配置的服务可以从Consul中读取到准确的配置信息。
④ Consul可以帮助系统管理者更清晰的了解复杂系统内部的系统架构,运维人员可以将Consul看成一种监控软件,也可以看成一种资产(资源)管理系统。

6、Consul的基本架构

Consul Cluster(集群)有Server 和Client两种角色。不管是Server还是Client,统称为Agent(代理)。Consul(注册中心)部署_第2张图片

  • Consul Client 是相对无状态的,只负责转发RPC到Server资源开销很少。
  • Server是一个有一组扩展功能的代理,这些功能包括参与Raft选举、维护集群状态、响应RPC查询、与其他数据中心交互WAN Gossip和转发查询给leader或者远程数据中心。

每个数据中心,Client和Server是混合的。一股建议有3~5台Server,这是基于有故障情况下的可用性和性能之间的权衡结果,因为越多的机器加入达成共识越慢(server越多追求一致性的时候 必定会消耗一定的时间来进行同步数据,同步数据的过程就会导致服务短时间内不能访问),Server之间会选举出一个Leader,然而并不限制Client的数量,一般建议一个服务对应一个Client,它们可以很容易的扩展到数千或者数万台。在开发时我们绑定一组服务注册中心中的客户端即可。

为什么集群要搭建奇数?

zookeeper的集群同样会面临这个问题,集群一般都是只要坏掉一半服务整个集群就不可用,3和4都是坏掉两台就不可用 所以一般会选三台。

二、consul集群

建立Consul服务

每个提供服务的节点上都要部署和运行Consul的agent

Consul agent有两种运行模式
Server
Client

Server和Client只是Consul集群层面的区分,与搭建在Cluster之上的应用服务无关

1、server部署

mkdir /mnt/consul               #创建目录

cd /mnt/consul

consul_0.9.2_linux_amd64.zip    #上传安装包

unzip consul_0.9.2_linux_amd64.zip #解压

mv consul /usr/bin  #将解压的文件移动到环境变量

consul agent \  #初始化
-server \
-bootstrap \
-ui \   #ui界面
-data-dir=/var/lib/consul-data \   #数据存储位置
-bind=192.168.187.108 \  #绑定地址
-client=0.0.0.0 \        #监听所有地址
-node=consul-server01 &> /var/log/consul.log &   #后台运行

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

Consul(注册中心)部署_第3张图片

查看集群server成员     curl 127.0.0.1:8500/v1/status/peers
集群Raf leader      curl 127.0.0.1:8500/v1/status/leader
注册的所有服务    curl 127.0.0.1:8500/v1/catalog/services
查看nginx服务信息    curl 127.0.0.1:8500/v1/catalog/nginx
集群节点详细信息     curl 127.0.0.1:8500/v1/catalog/nodes

2、client部署

#容器服务自动加入nginx集群
1、安装Gliderlabs/Registrator Gliderlabs/Registrator
可检查容器运行状态自动注册,还可注销docker容器的服务 到服务配置中心
目前支持Consul、Etcd和SkyDNS2

#在192.168.187.108节点上,执行以下操作

docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=192.168.187.118 \
consul://192.168.187.108:8500

Consul(注册中心)部署_第4张图片

systemctl restart docker
docker run -itd -p:81:80 --name test-01 -h test01 nginx
docker run -itd -p:82:80 --name test-02 -h test02 nginx
docker run -itd -p:83:80 --name test-03 -h test03 httpd
docker run -itd -p:84:80 --name test-04 -h test04 httpd

Consul(注册中心)部署_第5张图片

本机访问http://192.168.187.108:8500
此时应该可以发现5个服务 

Consul(注册中心)部署_第6张图片

 Consul(注册中心)部署_第7张图片

3、server端配置template模板自动更新

Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件,更新完成以后,可以查询Consul中的服务目录,Key、Key-values等。

3.1 配置 nginx.ctmpl 文件

##在consul上操作
vim /mnt/consul/nginx.ctmpl

upstream http_backend {
  {{range service "nginx"}}
   server {{.Address}}:{{.Port}};   #此处引用的变量会指向后端的地址和端口(动态变化)
   {{end}}
}

server {
  listen 100;  #监听端口
  server_name localhost 192.168.187.108;        #反向代理的IP地址(前端展示的NG服务的IP)
  access_log /var/log/nginx/gg.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;   #反向代理调用
  }
}

Consul(注册中心)部署_第8张图片

3.2 编译安装nginx修改文件并启动

由于之前安装好nginx服务,所以不需要再次安装

yum install gcc pcre-devel zlib-devel -y

tar zxvf nginx-1.22.0.tar.gz  -C /opt

./configure --prefix=/usr/local/nginx

make && make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin

配置nginx服务的文件

vim /usr/local/nginx/conf/nginx.conf
在http模块下插入 

include vhost/*.conf; #添加虚拟主机目录(consul动态生成的配置文件就会放在这里)

Consul(注册中心)部署_第9张图片

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

##启动nginx
usr/local/nginx/sbin/nginx   或者 systemctl restart nginx.service

Consul(注册中心)部署_第10张图片

3.3、配置并启动 template

cd /mnt/consul

上传 consul-template_0.19.3_linux_amd64.zip 

unzip consul-template_0.19.3_linux_amd64.zip #解压

mv consul-template /usr/bin/

##关联nginx 虚拟目录中的子配置文件操作    #启动日志监控
consul-template -consul-addr 192.168.187.108:8500 \
-template "/mnt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/gg.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

Consul(注册中心)部署_第11张图片

再打开另一个终端

cat /usr/local/nginx/conf/vhost/gg.conf

Consul(注册中心)部署_第12张图片

3.4、在client端 增加一个nginx容器节点

增加一个 nginx 容器节点,测试服务发现及配置更新功能
//在registrator服务端注册
docker run -itd -p 85:80 --name test-05 -h test05 nginx

Consul(注册中心)部署_第13张图片

浏览器访问查看新添加的内容

Consul(注册中心)部署_第14张图片

4、测试访问代理服务器

是否可以完成代理访问轮询

浏览器访问192.168.187.108:100 多次刷新产生日志

在client端查看日志信息

docker logs -f test-01

docker logs -f test-02

docker logs -f test-05

#注意需要启动日志监控
consul-template -consul-addr 192.168.187.108:8500 \
-template "/mnt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/gg.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

Consul(注册中心)部署_第15张图片

Consul(注册中心)部署_第16张图片

你可能感兴趣的:(Docker,java-consul,consul,docker,1024程序员节)