前言:
-
之前对consul进行了相关了解以及部署点此查看
-
在之前的操作中,通过node1的主机对nginx以及http服务进行了容器的创建并成功的加入到了consul群集当中
-
其实可以登录node1节点并指定端口查看到nginx与http服务界面
-
指定的83,84端口和88,89端口都可以访问
-
下面将通过Template工具以及Nginx的反向代理动态查询Consul群集信息实现自动化
一、template概述
1.简介
- Consul-template是Consul的一个方扩展工具,通过监听Consul中的数据可以动态修改一些配置文件。除了实时查询consul群集信息,也可以更新文件系统上任意数量的指定模板,生成配置文件
- 更新完成以后,可以选择运行shell命令执行更新操作,重新加载nginx
- comsul-template可以查询consul中的服务目录、key、key-values等
- 这种强大的抽象功能和查询语言模板可以使consul-template特别适合动态的创建配置文件
- 大家比较热衷于应用在Nginx,HAProxy上动态配置健康状态下的客户端反向代理信息
二、部署
1.部署template
- 准备template nginx模板文件
[root@consul consul]# pwd
/root/consul
[root@consul consul]# vim nginx.ctmpl //定义
upstream http_backend { //声明后端服务器池
{{range service "nginx"}}
server {{.Address}}:{{.Port}}; //分别读取node1节点的地址与端口
{{end}}
} //动态加载,开了几个nginx就会加入几个server条目
server {
listen 1216; //代理端口
server_name localhost 192.168.170.147; //本地监听地址
access_log /var/log/nginx/csdn.cn-access.log;
index index.html index.php; //首页类型
location / { //声明代理与跳转的头部信息
proxy_set_header HOST $host;
proxy_set_header HOST X-Real-IP $remote_addr;
proxy_set_header HOST Client-IP $remote_addr;
proxy_set_header HOST X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend; //跳转的http协议地址为自己定义的名称
}
}
2.安装nginx服务
- 编译安装nginx
[root@consul consul]# yum install -y gcc gcc-c++ pcre-devel zlib-devel
[root@consul consul]# cd /opt/
[root@consul opt]# ls //将准备好的环境包解压
containerd nginx-1.12.2.tar.gz rh
[root@consul opt]# tar zxvf nginx-1.12.2.tar.gz
[root@consul opt]# cd nginx-1.12.2/ //进入目录并手工编译
[root@consul nginx-1.12.2]# ./configure --prefix=/usr/local/nginx
[root@consul nginx-1.12.2]# make && make install
[root@consul nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
17 http {
19 include vhost/*.conf; //添加包含vhost目录且启动template模板并生成到vhost目录中
- 这个时候还没有vhost目录,所以需要创建以及日志目录
[root@consul nginx-1.12.2]# mkdir /usr/local/nginx/conf/vhost //指定配置文件的相对路径
[root@consul nginx-1.12.2]# mkdir /var/log/nginx //日志文件目录
[root@consul ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@consul nginx-1.12.2]# /usr/local/nginx/sbin/nginx //启动nginx
[root@consul ~]# netstat -ntap|grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 60960/nginx: master
3.配置template
- 配置并启动template
[root@consul ~]# unzip consul-template_0.19.3_linux_amd64.zip //将准备好的环境包解压
Archive: consul-template_0.19.3_linux_amd64.zip
inflating: consul-template
[root@consul ~]# ls
anaconda-ks.cfg consul consul-template_0.19.3_linux_amd64.zip
compose_tomcat consul-template initial-setup-ks.cfg
[root@consul ~]# mv consul-template /usr/bin //让系统能够识别使用
//启用模板
[root@consul ~]# consul-template -consul-addr 192.168.170.147:8500 \ //指定本地的地址
> -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/csdn.conf:/usr/local/nginx/sbin/nginx -s reload" \ //选择模板路径指定到vhost路径生成新的配置文件并重载服务
> --log-level=info //指定日志级别
- 此时已经在监控状态,另外打开一个终端查看生成配置文件
[root@consul ~]# cat /usr/local/nginx/conf/vhost/csdn.conf
upstream http_backend {
server 192.168.170.148:83; //生成的两条分别是nginx的两个端口
server 192.168.170.148:84;
}
server {
listen 1216;
server_name localhost 192.168.170.147;
access_log /var/log/nginx/csdn.cn-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;
}
}
- 此时可以在界面上查看,如果查看不了可以重载下服务
[root@consul ~]# /usr/local/nginx/sbin/nginx -s reload
- 这个访问就是我们后端的容器池,而且是采用轮询的方式访问83,84端口
4.验证
- 查看日志
[root@node1 ~]# docker ps -a //这里有之前创建的四个容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1c939dae7f9 httpd "httpd-foreground" 2 hours ago Up 2 hours 0.0.0.0:89->80/tcp test04
0cf4d1c1cb00 httpd "httpd-foreground" 2 hours ago Up 2 hours 0.0.0.0:88->80/tcp test03
ab3899146bed nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 0.0.0.0:84->80/tcp test02
24939d0e9f34 nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 0.0.0.0:83->80/tcp test01
29bcd0151ef7 gliderlabs/registrator:latest "/bin/registrator -i…" 2 hours ago Up 2 hours registrator
- 先用docker查看容器test01和test02的日志信息
[root@node1 ~]# docker logs -f test01
192.168.170.147 - - [26/Apr/2020:10:37:14 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" "192.168.170.1"
192.168.170.147 - - [26/Apr/2020:10:37:33 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" "192.168.170.1"
。。省略部分内容
[root@node1 ~]# docker logs -f test02
192.168.170.147 - - [26/Apr/2020:10:37:45 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" "192.168.170.1"
192.168.170.147 - - [26/Apr/2020:10:37:46 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" "192.168.170.1"
。。。省略部分内容
- 可以看到,都是由代理服务器访问的,说明实现了负载均衡
- 这里注意,node1的服务器防火墙不能关闭
- 增加一个nginx容器节点
[root@node1 ~]# docker run -itd -p85:80 --name test05 nginx
429157a2f1e3322e76829f876e0bfba4a87cf409c41bf9330fc70a320a199971
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
429157a2f1e3 nginx "nginx -g 'daemon of…" 4 seconds ago Up 3 seconds 0.0.0.0:85->80/tcp test05
- 在创建成功的同时,实施监控也更新了信息
- 同时查看配置文件,新生成了85端口
[root@consul conf]# cat /usr/local/nginx/conf/vhost/csdn.conf
upstream http_backend {
server 192.168.170.148:83;
server 192.168.170.148:84;
server 192.168.170.148:85;
}
server {
listen 1216;
server_name localhost 192.168.170.147;
access_log /var/log/nginx/csdn.cn-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;
}
}
- 这个时候查看新生成的容器日志,里面暂时没有访问信息
[root@node1 ~]# docker logs -f test05
^C
- 多此访问1216端口后,再查看日志信息
[root@node1 ~]# docker logs -f test05
192.168.170.147 - - [26/Apr/2020:10:48:54 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" "192.168.170.1"
192.168.170.147 - - [26/Apr/2020:10:49:02 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" "192.168.170.1"
192.168.170.147 - - [26/Apr/2020:10:49:04 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" "192.168.170.1"
- 可以看到,仍然是由代理服务器访问的