目录
一、consul特点
Ⅰ、服务发现
Ⅱ、健康检查(Health Checking)
Ⅲ、Key/Value存储
Ⅳ、安全服务通信
Ⅴ、多数据中心
二、consul应用场景
三、搭建consul集群
Ⅰ、server端部署
Ⅱ、client端部署
Ⅲ、服务发现
Ⅳ、删除不用的节点
四、配置template模板自动更新
Ⅰ、安装consul-template(consul服务器上)
Ⅱ、启动template
Ⅲ、访问consul-template
Ⅳ、服务发现
服务发现是分布式应用程序之间管理相互关系的一种机制。一个分布式程序一般由多个组件组成。这些组件可以都放在一台机器上,也可以分布在多个数据中心,甚至分布在不同的地理区域。这些组件通常可以为其他组件提供服务,或者为其他组件消费服务
Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联(“webserver是否返回200 OK”),也可以与本地节点相关联(“内存利用率是否低于90%”)。操作员可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去。
应用程序可以根据自己的需要使用Consul提供的Key/Value存储。 Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。
Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。意图可用于定义允许哪些服务通信。服务分割可以很容易地进行管理,其目的是可以实时更改的,而不是使用复杂的网络拓扑和静态防火墙规则。
Consul支持开箱即用的多数据中心. 这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域
Consul的应用场景包括服务发现、服务隔离、服务配置
本文使用Consul( https://www.consul.io/)作为服务发现工具的例子。Consul是一个使用一致性算法的特殊数据存储器。Consul使用Raft一致性算法来提供确定的写入机制。Consul暴露了键值存储系统和服务分类系统,并提供可用性、高容错能力,并保证强一致性。服务可以将自己注册到Consul,并以高可用且分布式的方式共享这些信息
Consul还提供了一些有趣的功能:
提供了根据API进行服务分类,代替了大部分传统服务发现工具的键值对存储
提供两种接口来查询信息:基于内置的DNS服务的DNS查询接口和基于HTTP的REST API查询接口。选择适合的接口,尤其是基于DNS的接口,可以很方便地将Consul与现有环境集成
提供了服务监控,也称作健康监控。Consul内置了强大的服务监控系统。
为了更好地理解Consul是如何工作的,本文先介绍如何在Docker容器里分布式运行Consul。之后会从Docker容器将服务注册到Consul,并从其他Docker容器访问注册的数据。为了更有挑战,会让这些容器运行在不同的Docker宿主机上
为了做到这些,需要做到以下几点:
创建Consul服务的Docker镜像
构建3台运行Docker的宿主机,并在每台上运行一个Consul。这3台宿主机会提供一个分布式环境,来展现Consul如何处理弹性和失效工作的
构建服务,并将其注册到Consul,然后从其他服务查询该数据
附加:可以在 http://consul.io/intro/index.html找到对Consul更通用的介绍
搭建环境
192.168.116.22 server centos7 Docker 、Consul、Consul-template
192.168.116.23 client centos7 Docker、registrator
wget https://releases.hashicorp.com/consul/1.7.2/consul_1.7.2_linux_amd64.zip
unzip consul_1.7.2_linux_amd64.zip
mv consul /usr/bin
进行初始化
consul agent \
-server \
-bootstrap-expect 1 \
-ui \
-data-dir=/var/lib/consul_data \
-bind=192.168.116.22 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
consul启动参数说明:
agent 通过consul agent client 来收集服务本身的信息
-server 表示以服务端的身份进行启动
-bind 绑定的ip(有的服务器可能绑定多个网卡,一般绑定自己的ip即可192.168.0.103等)
-client 指定客户端能访问的ip,类似于ip白名单。0.0.0.0表示不限制
-bootstrap-expect= 表示组成集群最少节点数,类似zookeeper的配置一样,为了防止脑裂,一般为奇数
-data-dir 数据存放目录,这个最后自己先进行创建,比如我的为-data-dir=/data/consulData/
-node 集群的节点名称,也是Consul提供的web ui的显示名称
-ui 启动内置的Web UI,访问地址为 http://ip:port/ui
consul members
netstat -natp | grep consul
8300:集群内数据的读写和复制
8301:单个数据中心gossip协议通讯
8302:跨数据中心gossip协议通讯
8500:提供获取服务列表、注册服务、注销服务等HTTP接口;提供UI服务
8600:采用DNS协议提供服务发现功能
consul info | grep leader
# 过滤出leader信息
本地浏览器上访问http://192.168.116.22:8500
1、安装Gliderlabs/Registrator Gliderlabs/Registrator
可检查容器运行状态自动注册,还可注销docker容器的服务 到服务配置中心
目前支持Consul、Etcd和SkyDNS2
在192.168.116.23节点上,执行以下操作
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=192.168.116.23 \
consul://192.168.116.22:8500
docker ps -a
随便开启几个服务
docker run -itd -p 81:80 --name nginx1 -h nginx1 nginx:latest
docker run -itd -p 82:80 --name nginx2 -h nginx2 nginx:latest
docker run -itd -p 83:80 --name http1 -h http1 httpd:latest
docker run -itd -p 84:80 --name http2 -h http2 httpd:latest
-h 指定容器的主机名
docker ps -a
netstat -natp | grep docker
curl --request PUT http://ip:port/v1/agent/service/deregister/ID
#ip:port是consul服务器节点的;ID是consul服务器:8500上要删除的ID如下图
Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件,更新完成以后,可以查询Consul中的服务目录,Key、Key-values等。
安装nginx:手工编译安装Nginx-1.22.0_正大光明瑞士卷的博客-CSDN博客_nginx编译、
准备consul-template并进行解压缩
unzip consul-template_0.19.3_linux_amd64.zip
mv consul-template /usr/bin/
准备template模板文件(nginx)
vim /consul/nginx.ctmpl
upstream http_backend { #后端服务池
{{range service "nginx"}} #指定服务范围nginx
server {{.Address}}:{{.Port}}; #读取服务节点IP和端口
{{end}}
}
server {
listen 8000; #监听端口
server_name localhost 192.168.116.22; #监听本地代理服务器
access_log /var/log/nginx/access.log; #日志位置
index index.html index.php; #首页文件名
location / {
proxy_set_header HOST $host; #指定客户端请求的host的IP
proxy_set_header X-Real-IP $remote_addr; #获取请求端的真实IP
proxy_set_header Client-IP $remote_addr; #获取客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#使用后端服务器获取客户端
proxy_pass http://http_backend; #指定跳转服务器
}
}
开启nginx
systemctl start nginx
consul-template --consul-addr 192.168.116.22:8500 \
--template "/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/ljp.conf:/usr/local/nginx/sbin/
nginx -s reload" \
--log-level=info
打开另一个终端,查看输出到本地nginx的模块文件
先在两个nginx容器中写一点内容以查看区分
nginx1:echo "this is nginx2">/usr/share/nginx/html/index.html
exit
nginx2:echo "this is nginx1">/usr/share/nginx/html/index.html
exit
访问consul服务器的800端口并进行刷新,查看是否是两个192.168.116.23上nginx容器内容
添加一个nginx容器,写入内容并重读配置文件
docker run -itd --name=nginx3 -p 90:80 nginx:latest
docker exec -it nginx3 bash
echo "this is nginx3">/usr/share/nginx/html/index.html
/usr/sbin/nginx -s reload
exit
刷新192.168.116.22:800 (consul服务器上的nginx),192.168.116.23上新加入的nginx3