文章目录
简介
Consul是一个分布式、高可用的系统,是一个为了解决在生产环境中服务注册,服务发现,服务配置的一个工具,它有多个组件,提供如下几个关键功能:
- 服务发现: Consul的某些客户端可以提供一个服务,例如api或者mysql,其它客户端可以使用Consul去发现这个服务的提供者。使用DNS或者HTTP,应用可以很容易的找到他们所依赖的服务。
- 健康检查:Consul客户端可以提供一些健康检查,这些健康检查可以关联到一个指定的服务(服务是否返回200 OK),也可以关联到本地节点(内存使用率是否在90%以下)。这些信息可以被一个操作员用来监控集群的健康状态,被服务发现组件路由时用来远离不健康的主机。
- 键值存储: 应用可以使用Consul提供的分层键值存储用于一些目的,包括动态配置、特征标记、协作、leader选举等等。通过一个简单的HTTP API可以很容易的使用这个组件。
- 多数据中心:Consul队多数据中心有着非常好的支持,这意味着Consul用户不用担心由于创建更多抽象层而产生多个区域
特点
- 支持健康检查,允许存储键值对
- 一致性协议采用Raft算法,用来保证服务高可用
- 成员管理和消息广播采用GOSSIP协议,支持ACL访问控制
- 方便部署,与Docker等轻量级容器可无缝配合
registrator发现容器更新后,注册给consul server端,consul server端会拉取/加载consul template这个模板,实现更新。
complate是一个模板,定义了upstream地址池和location反向代理跳转的配置,在接收到consul server端的加载更新后,通过complate模板影响真实的配置文件,以实现配置文件的自动更新。
搭建Consul集群实验
1、环境部署
主机 | 操作系统 | IP地址 | 主要软件及版本 |
---|---|---|---|
consul | Centos 7 | 192.168.238.15 | Docker 、Consul、Consul-template |
registrator | Centos 7 | 192.168.238.16 | Docker、registrator |
2、安装Consul
consul192.168.238.15
[root@consul consul]# cd /opt/consul/
[root@consul consul]# ls
consul_0.9.2_linux_amd64.zip consul-template_0.19.3_linux_amd64.zip
[root@consul consul]# unzip consul_0.9.2_linux_amd64.zip
Archive: consul_0.9.2_linux_amd64.zip
inflating: consul
[root@consul consul]# ls
consul consul_0.9.2_linux_amd64.zip consul-template_0.19.3_linux_amd64.zip
[root@consul consul]# mv consul /usr/bin
[root@consul consul]# consul agent \
> -server \
> -bootstrap \
> -ui \
> -data-dir=/var/lib/consul-data \
> -bind=192.168.238.15 \
> -client=0.0.0.0 \
> -node=consul-server01 &> /var/log/consul.log &
[1] 116596
查看集群信息
[root@consul consul]# consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.238.15:8301 alive server 0.9.2 2 dc1
[root@consul consul]# consul info|grep leader
leader = true
leader_addr = 192.168.238.15:8300
通过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 //集群节点详细信息
netstat -natp |grep consul
这5个端口的作用:
8300:集群内数据的读写和复制
8301:单个数据中心gossip协议通讯
8302:跨数据中心gossip协议通讯
8500:提供获取服务列表、注册服务、注销服务等HTTP接口;提供UI服务
8600:采用DNS协议提供服务发现功能
3、配置容器服务自动加入consul集群
registrator:192.168.238.16
① 安装Gliderlabs/Registrator
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=192.168.238.16 \
consul://192.168.238.15:8500
② 测试服务
创建四个容器进行测试
docker run -itd -p:81:80 --name test1 -h test01 nginx
docker run -itd -p:82:80 --name test2 -h test02 nginx
docker run -itd -p:91:80 --name test3 -h test03 httpd
docker run -itd -p:92:80 --name test4 -h test04 httpd
docker ps -a
③ 验证http和nginx服务是否注册到consul
浏览器访问验证
consul:192.168.238.15查看服务
curl 127.0.0.1:8500/v1/catalog/services
4、安装consul-template
consul:192.168.238.15
unzip consul-template_0.19.3_linux_amd64.zip
mv consul-template /usr/bin/
5、配置template模板自动更新
consul:192.168.238.15
[root@consul consul]# vim /opt/consul/nginx.ctmpl
upstream http_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 88;
server_name localhost 192.168.238.15;
access_log /var/log/nginx/nginx01-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
6、部署nginx
consul:192.168.238.15
yum -y install gcc pcre-devel zlib-devel
tar zxvf nginx-1.12.0.tar.gz -C /opt
cd /opt/nginx-1.12.10
./configure --prefix=/usr/local/nginx
make && make install
配置nginx
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
include vhost/*.conf; //添加虚拟主机目录
default_type application/octet-stream;
创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost
创建日志文件目录
mkdir /var/log/nginx
启动nginx
/usr/local/nginx/sbin/nginx
7、启动template
consul:192.168.238.15
consul-template -consul-addr 192.168.238.15:8500 \
-template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/nginx88.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
参数详解:
-consul-addr 192.168.226.132:8500:指向consul服务端节点
-template "/opt/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”)
重开一个consul终端查看
8、增加nginx容器节点测试
registrator:192.168.238.16
docker run -itd -p 83:80 --name test5 -h test05 nginx
consul:192.168.238.15
持续监听的终端上会提示进行了自动更新