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个服务的网络位置,加大配置的复杂性
② 服务的网络位置变化,都需要改变每个调用者的配置
③ 集群的情况下,除了反向代理方式,难以做负载
二、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
[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 & 加入到已有集群中