Docker Consul

一、Consul介绍

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置

1、关键功能

① 服务发现: Consul的某些客户端可以提供一个服务,例如api或者mysql,其它客户端可以使用Consul去发现这个服务的提供者。使用DNS或者HTTP,应用可以很容易的找到他们所依赖的服务

② 健康检查:Consul客户端可以提供一些健康检查,这些健康检查可以关联到一个指定的服务(服务是否返回200 OK),也可以关联到本地节点(内存使用率是否在90%以下)。这些信息可以被一个操作员用来监控集群的健康状态,被服务发现组件路由时用来远离不健康的主机

③ 键值存储: 应用可以使用Consul提供的分层键值存储用于一些目的,包括动态配置、特征标记、协作、leader选举等等。通过一个简单的HTTP API可以很容易的使用这个组件

④ 多数据中心:Consul队多数据中心有着非常好的支持,这意味着Consul用户不用担心由于创建更多抽象层而产生多个区域

2、特点

① 支持健康检查,允许存储键值对

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

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

④ 方便部署,与Docker等轻量级容器可无缝配合

3、Consul作用

现在企业应用都向微服务化方向发展,当把我们的系统功能拆分成一个一个的微服务后,存在以下问题

① 需要配置N个服务的网络位置,加大配置的复杂性

② 服务的网络位置变化,都需要改变每个调用者的配置

③ 集群的情况下,除了反向代理方式,难以做负载
在这里插入图片描述

二、Consul的基本概念

1、Client

表示 Consul 客户端模式,是 Consul 节点的一种模式,所有注册到 Client 节点的服务会被转发到 Server 。本身无状态不持久化如何数据。Client 通过 HTTP、DNS、GRPC 接口请求转发给局域网内的服务端集群

2、Server

表示 Consul 的服务端模式, Server 功能和 Client 都一样,不同的是 Server 持久化数据到本地。在局域网内与本地 Client 通讯,通过广域网与其他数据中心通讯。每个数据中心的 Server 数量推荐为 3 个或是 5 个

3、Server-leader

表示这个 Server 是它们的老大,它和其它 Server 不一样的一点是,它需要负责同步注册的信息给其它的 Server 节点,同时也要负责各个节点的健康监测。如果 Leader 宕机了,通数据中心的所有 Server 内部会使用 Raft 算法来在其中选取一个 Leader 出来

4、Agent

Agent 是 Consul 的核心进程,Agent 的工作是维护成员关系信息、注册服务、健康检查、响应查询等等。Consul 集群的每一个节点都必须运行 agent 进程

server 与 client 只是 consul 群集层面的区分,与搭建在 cluster 之上的应用服务无关

三、Counsul的原理

在分布式系统结构中,往往由成百上千的业务服务组成,为了容灾(节点宕机)、扩容(增加节点)、提高运维效率(动态配置)等原因,需要服务能够实现灵活发现,避免问题节点等功能,以提高系统稳定性

1、服务发现及注册

当服务Producer 启动时,会将自己的Ip/host等信息通过发送请求告知 Consul,Consul 接收到 Producer 的注册信息后,每隔一段时间会向 Producer 发送一个健康检查的请求,检验Producer是否健康

2、服务调用

当 Consumer 请求Product时,会先从 Consul 中拿到存储Product服务的 IP 和 Port 的临时表(temp table),从temp table表中任选一个· Producer 的 IP 和 Port, 然后根据这个IP和Port,发送访问请求;temp table表只包含通过了健康检查的 Producer 信息,并且每隔一段时间更新

3、Consul通信接口

①RPC

用于内部通讯Gossip/日志分发/选主等

②HTTP API

服务发现/健康检查/KV存储等几乎所有功能, 默认端口为8500

③Consul Commands(CLI)

consul命令行工具可以与consul agent进行连接,提供部分consul的功能

实际上Consul CLI 默认就是调用的HTTP API来与consul集群进行通讯

④DNS

仅用于服务查询,例如:dog @127.0.0.1 -p 8600 web.service.consul

可以通过cosul提供的DNS接口来获取当前的服务“web”对应的可用节点

4、Consul端口说明
端口说明
TCP/83008300端口用于服务器的节点,客户端通过该端口RPC协议调用服务端节点
TCP/UDP/83018301端口用于单个数据中心所有节点之间的互相通讯,即对LAN池信息的同步,他使得整个数据中心能够自动发现服务器地址,分布式检测节点故障,时间广播
TCP/UDP/83028302端口用于单个或多个数据中心之间的服务器节点的信息同步,他针对互联网的高延迟进行优化,能够实现跨数据中心请求
850085000端口基于HTTP协议,用户API接口或WEN UI访问
86008600端口作为DNS服务器,它使得我们可以通过节点名查询节点信息

四、配置Consul集群实验

1、实验环境

服务器1:192.168.200.11 Docker-ce、Compose 3、consul、consul-template

服务器2:192.168.200.12 Docker-ce、registrator

服务器3:192.168.200.13 Docker-ce、registrator

2、配置consul服务器

#在服务器1进行安装

①安装consul软件包

[root@consul ~]# mkdir /root/consul/

[root@consul ~]# cd /root/consul/

#把consul安装包放到/root/consul下

[root@consul consul]# unzip consul_0.9.2_linux_amd64.zip #进行解压

[root@consul consul]# mv consul /usr/bin #把其移动到/usr/bin下

②进行编译安装

consul agent
-server
-bootstrap
-ui
-data-dir=/var/lib/consul-data
-bind=192.168.126.10
-client=0.0.0.0
-node=consul-server01 &> /var/log/consul.log &

③查看集群信息

[root@consul consul]# consul members

在这里插入图片描述

[root@consul consul]# consul info | grep leader

在这里插入图片描述

④通过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 //集群节点详细信息

3、容器服务自动加入nginx集群

#在服务器2进行配置

①安装Registrator的服务

docker run -d
–name=registrator
–net=host
-v /var/run/docker.sock:/tmp/docker.sock
–restart=always
gliderlabs/registrator:latest
-ip=192.168.200.13 \ #本机IP
consul://192.168.200.11:8500 #consul主机的IP

②安装nginx和httpd服务

docker run -itd -p 83:80 --name test-1 -h test1 nginx
docker run -itd -p 84:80 --name test-2 -h test2 nginx
docker run -itd -p 88:80 --name test-3 -h test3 httpd
docker run -itd -p 89:80 --name test-4 -h test4 httpd

在这里插入图片描述

③验证consul服务

#到本地浏览器输入192.168.200.100:8500

在这里插入图片描述

4、安装consul-template

#安装在consul服务器上(服务器1)

Consul-Tepmlate是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件,更新完成以后,可以选择运行shell命令执行更新操作,重新加载Nginx Consul-Tepmlate可以查询到Consul中的服务目录,Key,Key-values等

其强大的抽象功能和查询语言模板使得Consul-Template特别适合动态的创建配置文件,
例如:Nginx/Apache Proxy Balancers、Haproxy Backends

①添加nginx模板

#在consul服务器上添加模板

[root@consul consul]# vim /root/consul/nginx.ctmpl

upstream http_backend { #群集模块模板
{{range service “nginx”}} #指定nginx服务项
server {{.Address}}:{{.Port}}; #指向真实服务器的地址和端口“{{.Address}}” 此参数会根据consul群集的参数自动设置上去
{{end}} #结束语句(以上为轮询请求方式)
}

server {
listen 88; #对外提供的端口,可自行设置,只要不起冲突
server_name localhost 192.168.200.11; #本地反向代理的节点地址
access_log /var/log/nginx/kgc.cn-access.log; #访问日志文件目录(需手动创建)
index index.html index.php; #指定访问的index 首页类型
location / {
proxy_set_header HOST $host; #反向代理的请求头部信息
proxy_set_header X-Real-IP $remote_addr; #真实服务器IP
proxy_set_header Client-IP $remote_addr; #客户IP
proxy_set_header X-Fprwarded-For $proxy_add_x_forwarded_for; #Forward转发地址
proxy_pass http://http_backend; #反向代理指向upstream地址池
}
}

在这里插入图片描述

②安装nginx服务

[root@consul consul]# yum install -y gcc gcc-c++ pcre-devel zlib-devel

#把nginx压缩包放到/root/consul目录

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

cd /opt/nginx-1.12.0/

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

make && make install

③配置nginx服务

[root@consul consul]# vim /usr/local/nginx/conf/nginx.conf

http {
include mime.types;
include vhost/*.conf; #vhost目录需要自己手动创建
default_type application/octet-stream;

#创建虚拟主机vhost文件目录

[root@consul consul]# mkdir /usr/local/nginx/conf/vhost/

#创建日志目录

[root@consul ~]# mkdir /var/log/nginx/

#启动nginx

[root@consul ~]# /usr/local/nginx/sbin/nginx

④配置并启动template

consul-template -consul-addr 192.168.200.11:8500 -template “/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload” --log-level=info

-consul-addr 192.168.200.11:8500:指向consul服务端节点

-template "/root/consul/nginx.ctmpl:指定模板路径

:/usr/local/nginx/conf/vhost/test.conf:指定文件生成到vhost中并命名为test.conf

:/usr/local/nginx/sbin/nginx -s reload:不中断服务reload重载nginx服务让配置文件生效

–log-level=info:产生日志,级别为info(日志生成位置在nginx.ctml中定义“access_log”)

⑤查看配置文件

#可以打开另一个终端查看

[root@consul ~]# cat /usr/local/nginx/conf/vhost/nginx.conf

在这里插入图片描述

5、consul多节点

#添加一台已有docker环境的服务器192.168.200.12/24加入已有的群集中

#在192.168.200.12中配置

[root@localhost ~]# mkdir /root/consul/

[root@localhost ~]# cd /root/consul/

[root@localhost consul]# unzip consul_0.9.2_linux_amd64.zip

[root@localhost consul]# mv consul /usr/bin

consul agent
-server
-bootstrap
-ui
-data-dir=/var/lib/consul-data
-bind=192.168.200.12 \ #本机IP
-client=0.0.0.0
-node=consul-server02
-enable-script-checks=true
-datacenter=dc1
-join 192.168.200.11 &> /var/log/consul.log & #consul主机IP

-enable-script-checks=true \ #设置检查服务为可用
-datacenter=dc1 \ #数据中心名称
-jion 192.168.126.10 &> /var/log/consul.log & 加入到已有集群中
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值