Docker Consul


  • 一、Consul介绍
  • 1、关键功能
  • 2、特点
  • 二、Consul的基本概念
  • 1、Client
  • 2、Server
  • 3、Server-leader
  • 4、Agent
  • 三、Counsul的原理
  • 1、服务发现及注册
  • 2、服务调用
  • 3、Consul通信接口
  • 4、Consul端口说明
  • 四、配置Consul集群实验
  • 1、实验环境
  • 2、配置consul服务器
  • 3、容器服务自动加入nginx集群
  • 4、安装consul-template
  • 5、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个服务的网络位置,加大配置的复杂性

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

③ 集群的情况下,除了反向代理方式,难以做负载

docker 怎么使用supervisor docker consul_服务器

二、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/8300

8300端口用于服务器的节点,客户端通过该端口RPC协议调用服务端节点

TCP/UDP/8301

8301端口用于单个数据中心所有节点之间的互相通讯,即对LAN池信息的同步,他使得整个数据中心能够自动发现服务器地址,分布式检测节点故障,时间广播

TCP/UDP/8302

8302端口用于单个或多个数据中心之间的服务器节点的信息同步,他针对互联网的高延迟进行优化,能够实现跨数据中心请求

8500

85000端口基于HTTP协议,用户API接口或WEN UI访问

8600

8600端口作为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

docker 怎么使用supervisor docker consul_服务器_02

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

docker 怎么使用supervisor docker consul_Server_03

④通过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

docker 怎么使用supervisor docker consul_服务器_04

③验证consul服务

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

docker 怎么使用supervisor docker consul_nginx_05

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地址池
 }
 }

docker 怎么使用supervisor docker consul_Server_06

②安装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

docker 怎么使用supervisor docker consul_Server_07

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 & 加入到已有集群中

docker 怎么使用supervisor docker consul_服务器_08