Docker的consul集群搭建
- consul集群的工作流程
- 1、Consul:
- 2、建立 Consul 服务:
- 搭建 consul 集群:
consul集群的工作流程
在Docker节点中,每当有容器被创建就会向容器中的registrator服务进行注册登记,registrator服务会向代理服务器中的consul agent进行汇报。我们在consul template中设置好变量,consul就会将docker节点IP地址自动添加到代理服务器的配置文件中并且立即生效。
1、Consul:
1、Consul 是 HashCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置;
2、Consul 特点:
consul 支持健康检查,允许存储键值对; 一致性协议采用 Raft 算法,用来保证服务的高可用; 成员管理和消息广播采用 GOSSIP
协议,支持 ACL 访问控制;
3、方便部署,与 Docker 等轻量级容器可无缝配合。
2、建立 Consul 服务:
1、每个提高服务的节点上都需要部署和运行 consul 的 agent
2、Consul agent 两种运行模式:
server; client;
3、server 与 client 只是 consul 群集层面的区分,与搭建在 cluster之上的应用服务无关。
搭建 consul 集群:
1.实验环境:
准备两台centos7虚拟机。
192.168.80.106作为代理端,运行nginx、consul template和consul。
192.168.80.105作为上游服务器,运行registrator容器和若干nginx服务容器
2.代理端安装nginx和搭建consul
安装nginx这里不再过多阐述,首先解压consul压缩包。
unzip consul_0.9.2_linux_amd64.zip
将concul复制到/usr/bin目录下。
开始安装
安装代理和server功能
consul agent \
-server \
参与consul选举
-bootstrap \
提供web的ui界面
-ui \
参数存储位置
-data-dir=/var/lib/consul-data \
绑定的IP地址
-bind=192.168.80.106 \
监听任意IP地址
-client=0.0.0.0 \
运行node1节点,并将日志生成到指定目录下
-node=consul-server01 &> /var/log/consul.log &
通过命令查看节点状态和成员信息:
[root@localhost ~]# consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.80.106:8301 alive server 0.9.2 2 dc1
[root@localhost ~]# consul info | grep leader
leader = true
leader_addr = 192.168.80.106:8300
用httpd api查看集群信息:
查看集群的详细信息
curl 127.0.0.1:8500/v1/catalog/nodes
在上游web节点安装registrator容器
使用docker run命令创建registrator容器指定host网络模式指定挂载的目录并指定consul agent的IP地址和端口
docker run -d --name=registrator --net=host -v /var/run/docker.stock:/tpm/docker.stock --restart=always gliderlabs/registrator:latest -ip=192.168.80.105 consul://192.168.80.106:8500
创建nginxweb服务容器
docker run -d -itd -p 83:80 --name=web01 -h ngweb1 nginx
docker run -d -itd -p 84:80 --name=web02 -h ngweb2 nginx
使用template模板创建nginx的虚拟主机配置文件
在代理服务器端可以通过编写ctmpl文件,其中的web容器的IP地址和端口号作为变量传入到nginx的配置文件中并生效。
编写nginx.ctmpl文件作为nginx的配置文件的模板
#upstream模块指定web服务器池,其中的IP地址和端口作为变量引入 server {{.Address}}:{{.Port}};
upstream backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 1216;
server_name localhost 192.168.80.106;
access_log /var/log/nginx/nginx-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-Fprwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend;
}
}
由于其中的日志文件路径不存在需要创建一个日志文件路径。
mkdir -p /var/log/nginx
配置nginx的配置文件
在http模块中,由于nginx配置文件可以解耦,所以定义一个虚拟主机的配置文件路径。include vhost/*.conf
http {
include mime.types;
include vhost/*.conf;
default_type application/octet-stream;
由于该路径不存在所以也需要创建一个路径出来。
mkdir -p /usr/local/nginx/conf/vhost
启动nginx
启用template模板
解压template压缩包,并复制到/usr/bin目录下。
#指定consul集群的IP地址和端口号
consul-template -consul-addr 192.168.80.106:8500 \
#template模板位置:虚拟主机配置文件生成位置:使用的nginx的命令为重载
-template "/root/nginx.ctmpl:/usr/local/nginx/conf/vhost/nginxweb.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
现在看到的是consul开始监控web集群是否新增加容器。
在consul集群中打开新的终端查看配置文件。
其中的配置文件清楚地写着和后端的IP地址。验证
在web端在创建一个nginx容器
在代理端可以看见新的容器已经添加进反向代理中。
同时访问代理的1216端口访问后端web也可以查看到日志情况。
可以清楚的看到是代理端进行的访问而非其他IP地址。