目录

  • 一、consul概念与作用
  • 1.1 基于nginx和consul构建高可用及自动发现的Docker服务架构
  • 1.2 Docker consul自动发现服务架构的构建
  • 1.2.1 在主节点上部署consul
  • 1.2.2 通过HTTP api获取集群信息
  • 1.2.3 nginx服务器上连接consul,创建nginx容器服务
  • 1.2.4 创建容器,用来测试服务发现功能是否正常
  • 1.2.5 查看容器
  • 1.2.6 浏览器测试:20.0.0.19:8500,并查看日志
  • 二、consul集群添加Compose-template,实现容器自动加入Nginx集群
  • 2.1 Compose-template介绍
  • 2.2 实验过程
  • 2.2.1 主节点安装consul-template,准备模板文件
  • 2.2.2 主节点编写template nginx模板文件
  • 2.2.3 主节点编译安装nginx
  • 2.2.4 启动template,指定template模板文件及生成路径
  • 2.2.5 主节点重新打开终端查看产生的配置文件
  • 2.2.6 客户端浏览器测试,结合nginx服务器日志验证
  • 2.2.7 浏览器使用20.0.0.19:88访问,查看日志会发现是轮询出现的


一、consul概念与作用

consul是HashiCorp公司推出使用go语言编写的开源工具,用于实现分布式系统的服务发现与配置

特性:
1、consul支持健康检查,允许存储键值对
2、一致性协议采用Raft算法,用来保证服务的高可用
3、成员管理和消息广播采用GOSSIP协议,支持ACL访问控制
4、方便部署,与Docker等轻量级容器可无缝配合

1.1 基于nginx和consul构建高可用及自动发现的Docker服务架构

解释:
基于Docker完成的,然后将consul、consul template、registrator和nginx组装成一个值得信任且可扩展的服务框架,此架构可以灵活的、不需要重启任何服务、不需要重写任何配置的添加和移除服务

consul template

配置文件模板

registrator

注册机制

consul server

consul服务

例如:当后方增加了一个容器时,容器会注册registrator,registrator发现增加了一个容器的时候,会通知consul server要更新,consul server使用consul template模板更新

1.2 Docker consul自动发现服务架构的构建

实验环境及要求:
1、每个提供服务的节点上都要部署和运行consul的agent
2、consul agent有两种运行模式:server和client
3、server和client只是consul集群层面的区分,与搭建在cluster之上的应用服务无关
4、关闭防火墙、关闭核心防护

名称

地址

安装软件

consul服务器

20.0.0.19

Docker-ce、Consul

nginx服务器

20.0.0.20

Docker-ce、registrator

1.2.1 在主节点上部署consul

mkdir /consul
cd /consul/
//上传压缩包
unzip consul_0.9.2_linux_amd64.zip -d /usr/bin
consul agent \	'//设置代理'
> -server \	'//服务功能'
> -bootstrap \	'//参与选举'
> -ui \	'//提供web界面'
> -data-dir=/var/lib/consul-data \	'//提供一个代理存储数据目录'
> -bind=20.0.0.19 \	'//绑定本地地址'
> -client=0.0.0.0 \	'//面对的客户端地址'
> -node=consul-server01 &> /var/log/consul.log&	' //定义节点名称,日志混合输出到log,并且放到后台运行'
jobs
consul members
//查看集群信息
consul info |grep leader
//查看管理信息

1.2.2 通过HTTP api获取集群信息

curl 127.0.0.1:8500/v1/status/peers		 '/查看集群server成员'
curl 127.0.0.1:8500/v1/status/leaders 		'//查看集群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  		 '//集群节点详细信息'

1.2.3 nginx服务器上连接consul,创建nginx容器服务

docker run -d \
> --name=registrator \        '//定义容器名称'
> --net=host \                '定义网络'
> -v /var/run/docker.sock:/tmp/docker.sock \       '指定数据卷,存储信息' 
> --restart=always \    
> gliderlabs/registrator:latest \                '定义镜像'
> -ip=20.0.0.20 \                           '指定本地地址'
> consul://20.0.0.19:8500                   '指定consul管理节点地址、端口'

1.2.4 创建容器,用来测试服务发现功能是否正常

docker run -itd -p 83:80 --name test -h test01 nginx
docker run -itd -p 84:80 --name test-02 -h test02 nginx
docker run -itd -p 85:80 --name test-03 -h test03 httpd
docker run -itd -p 86:80 --name test-04 -h test04 httpd

1.2.5 查看容器

docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED              STATUS              PORTS                                         NAMES
9daaae40366b        httpd                           "httpd-foreground"       About a minute ago   Up About a minute   0.0.0.0:86->80/tcp                            test-04
f6992b0617d5        httpd                           "httpd-foreground"       About a minute ago   Up About a minute   0.0.0.0:85->80/tcp                            test-03
5373caad456e        nginx                           "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:84->80/tcp                            test-02
247a6b8fb598        nginx                           "/docker-entrypoint.…"   6 minutes ago        Up 6 minutes        0.0.0.0:83->80/tcp                            test
421b9fb1caed        gliderlabs/registrator:latest   "/bin/registrator -i…"   8 minutes ago        Up 8 minutes                                                      registrator
d434d1eacf41        compose_nginx_nginx             "/run.sh"                20 minutes ago       Up 20 minutes       0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp   compose_nginx_nginx_1

1.2.6 浏览器测试:20.0.0.19:8500,并查看日志

docker logs -f test-01
2020/11/13 15:09:26 [error] 28#28: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 20.0.0.100, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "20.0.0.19:83", referrer: "http://20.0.0.19:83/"

curl 127.0.0.1:8500/v1/catalog/services
{"compose_nginx_nginx-443":[],"compose_nginx_nginx-80":[],"consul":[],"httpd":[],"nginx":[]}

二、consul集群添加Compose-template,实现容器自动加入Nginx集群

2.1 Compose-template介绍

compose-template是一个守护进程,用于实时查询consul集群信息
并且运维人员可以在consul服务器上,定制任意的模板,生成配置文件
compose可以查询consul中的服务目录、key、key-values等
这种强大的抽象功能和查询语言模板使得consul-template特别适合动态的创建配置文件,也就是自动化增加服务
例如:创建apache/nginx proxy balacers、haproxy backends

2.2 实验过程

2.2.1 主节点安装consul-template,准备模板文件

'//上传consul-template软件包'
unzip consul-template_0.19.3_linux_amd64.zip -d /usr/bin

2.2.2 主节点编写template nginx模板文件

此模板用于nginx反向代理模板
nginx.ctmpl跟nginx没有直接关系,
consul是docker的一种自动管理机制
nginx.ctmpl中的参数以变量的形式写入

cd /consul
mkdir /var/log/nginx
cat >> nginx.ctmpl <<EOF
upstream http_backend {		'//四层转发,upstream模块,也能7层转发。LVS四层转发'
   {{range service "nginx"}}
    server {{.Address}}:{{.Port}};	'//变量双{}括起来'
     {{end}}
}

server {
  listen 88;	'//监听端口'
  server_name localhost 20.0.0.19;	'//本地地址'
  access_log /var/log/nginx/tang.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;	'//反向代理模块'
  }
}
EOF

2.2.3 主节点编译安装nginx

yum install gcc gcc-c++ make expat* pcre* perl* zlib* -y
'//安装环境'	
'//上传源码包并编译'
tar zxf nginx-1.15.9.tar.gz 
cd nginx-1.15.9
./configure --prefix=/usr/local/nginx
make -j3 && make install -j3
mkdir /usr/local/nginx/conf/vhost/
'//创建虚拟主机目录'
vim /usr/local/nginx/conf/nginx.conf
'//编辑配置文件,添加目录'
#user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    include vhost/*.conf;	'//添加路径'
    default_type  application/octet-stream;
    ...省略内容

/usr/local/nginx/sbin/nginx	'/启动nginx'
netstat -natp |  grep nginx

2.2.4 启动template,指定template模板文件及生成路径

consul-template -consul-addr 20.0.0.19:8500 \
-template "/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/tang.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
'//指定模板路径,/consul/nginx.ctmpl,生成到/usr/locla/nginx/conf/vhost/tang.conf,然后重载nginx -s reload'
接下来会进入监控状态

2.2.5 主节点重新打开终端查看产生的配置文件

vim /usr/local/nginx/conf/vhost/tang.conf 
upstream http_backend {
    server 20.0.0.20:84;	'//能够通过consul自动发现nginx服务器的IP地址与端口'
    server 20.0.0.20:83;
}

server {
  listen 88;
  server_name localhost 20.0.0.19;
  access_log /var/log/nginx/tang.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;
  }
}

2.2.6 客户端浏览器测试,结合nginx服务器日志验证

docker logs -f test-01	
'//nginx服务器动态查看test-01日志'
docker logs -f test-02	
'//重新打开终端,动态查看test-02日志'
firewall-cmd --zone=public --add-port=88/tcp	
'//主节点设置防火墙规则,放通88端口'

2.2.7 浏览器使用20.0.0.19:88访问,查看日志会发现是轮询出现的

'//测试consul-template自动在线更新'
docker run -itd --name test-05 -p 89:80 -h test05 nginx
'//nginx服务器添加一个容器'
cat /usr/local/nginx/conf/vhost/tang.conf 
upstream http_backend {
   
    server 20.0.0.20:84;
     
    server 20.0.0.20:89;
     
    server 20.0.0.20:83;
     
}