目录
一、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概述
① template 模板(更新)
② registrator(自动发现)
③ 后端每构建出一个容器,会向registrator进行注册,控制consul 完成更新操作,consul会触发consul template模板进行热更新
④ 核心机制:consul :自动发现、自动更新,为容器提供服务(添加、删除、生命周期)
4、Consul的特性
① 支持健康检查、允许存储键值对
② 基于Golong语言,可移植性强
③ 支持ACL访问控制
5、Consul的使用场景
Consul的应用场景包括服务发现、服务隔离、服务配置:
① 服务发现场景中consul作为注册中心,服务地址被注册到consul中以后,可以使用consul提供的dns、http接口查询,consul支持health check。
② 服务隔离场景中consul支持以服务为单位设置访问策略,能同时支持经典的平台和新兴的平台,支持tls证书分发,service-to-service加密。
③ 服务配置场景中consul提供key-value数据存储功能,并且能将变动迅速地通知出去,借助Consul可以实现配置共享,需要读取配置的服务可以从Consul中读取到准确的配置信息。
④ Consul可以帮助系统管理者更清晰的了解复杂系统内部的系统架构,运维人员可以将Consul看成一种监控软件,也可以看成一种资产(资源)管理系统。
二、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.88.77 \ #绑定地址
-client=0.0.0.0 \ #监听所有地址
-node=consul-server01 &> /var/log/consul.log & #后台运行
consul members #插入集群成员
consul info | grep leader #查看leader信息
查看集群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.100.30节点上,执行以下操作
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=192.168.88.45 \
consul://192.168.88.77:8500
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
真机访问http://192.168.100.20:8500
此时应该可以发现5个服务
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.88.77; #反向代理的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; #反向代理调用
}
}
3.2 编译安装nginx修改文件并启动
由于之前安装好nginx服务,所以不需要再次安装
可以不需要安装
yum install gcc pcre-devel zlib-devel -y
tar zxvf nginx-1.12.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动态生成的配置文件就会放在这里)
##创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost
##创建日志文件目录
mkdir /var/log/nginx##启动nginx
usr/local/nginx/sbin/nginx 或者 systemctl restart nginx.service
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.88.77:8500 \
-template "/mnt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/gg.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
再打开另一个终端
cat /usr/local/nginx/conf/vhost/gg.conf
3.4、在client端 增加一个nginx容器节点
增加一个 nginx 容器节点,测试服务发现及配置更新功能
//在registrator服务端注册
docker run -itd -p 85:80 --name test-05 -h test05 nginx
在server端查看信息情况
consul-template -consul-addr 192.168.88.77:8500 \
-template "/mnt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/gg.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
cat /usr/local/nginx/conf/vhost/gg.conf
浏览器访问 192.168.88.77查看新添加的容器信息
4、测试访问代理服务器
是否可以完成代理访问轮询
浏览器访问192.168.88.77:100 多次刷新产生日志
在client端查看日志信息
docker logs -f test-01
docker logs -f test-02
docker logs -f test-05
#注意需要启动日志监控
consul-template -consul-addr 192.168.88.77:8500 \
-template "/mnt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/gg.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info