文章目录
- 前言
- 一 :consul 理论介绍
-
- 1.1consul具有如下特性:
- 1.2:基于nginx和consul构建高可用及自动发现的Docker服务架构
- 二 :Docker consul自动发现服务架构的构建
- 三 . 具体配置:
-
- 3.1 环境部署
-
- 安装环境
- 设置阿里云镜像
- 优化
- 加速优化 阿里云镜像加速
- 准备软件包
- 下载安装docker
- 3.2 代理服务器安装相关软件
-
- 部署consul
- consul常用操作查看命令
- 关闭规则,不能关闭防火墙
- 3.3节点服务器操作
-
- 节点服务器安装 registrator 容器
- 在节点创建容器进行测试:
- 3.4 宿主机可访问 192.168.100.8:8500 测试
- 3.5 代理服务器源码编译安装Nginx
- 3.6 代理服务器安装 consul-template
-
- 代理服务器 安装consul-template,准备模板文件
- 编辑 template nginx 模板文件
- 修改nginx 配置
- 代理服务器 启动 template
- 3.7 这时开一台终端 ,查看配置文件,发现配置以及自动写入
- 3.8 然后访问测试,检查日志,发现在轮询访问容器节点
-
- 访问 192.168.100.8:83
- 利用 docker logs -f test2 查看容器 test2 日志
- 3.9 在 节点操作 新增一个容器,测试 发现功能
-
- 查看配置文件
- 四 . 发散思维 ,如何 通过配置 将 apache 和 nginx 容器 一起进行轮询访问操作
-
- 方案一 ,修改模板文件
- 方案二 (骚操作,慎用)
前言
一 :consul 理论介绍
consul是HashiCorp公司推出使用go语言编写的开源工具,用于实现分布式系统的服务发现与配置
1.1consul具有如下特性:
1、consul支持健康检查,允许存储键值对
2、一致性协议采用Raft算法,用来保证服务的高可用
3、成员管理和消息广播采用GOSSIP协议,支持ACL访问控制
4、方便部署,与Docker等轻量级容器可无缝配合
1.2:基于nginx和consul构建高可用及自动发现的Docker服务架构
上方拓扑图是基于Docker完成的,然后将consul、consul template、registrator和nginx组装成一个值得信任且可扩展的服务框架,此架构可以灵活的、不需要重启任何服务、不需要重写任何配置的添加和移除服务
拓扑图解释
consul template:配置文件模板
registrator:注册机制
consul server:consul服务
例如:当后方增加了一个容器时,容器会注册registrator,registrator发现增加了一个容器的时候,会通知consul server要更新,consul server使用consul template模板更新
二 :Docker consul自动发现服务架构的构建
1、每个提供服务的节点上都要部署和运行consul的agent
2、consul agent有两种运行模式:server和client
3、server和client只是consul集群层面的区分,与搭建在cluster之上的应用服务无关
4、两个节点都安装Docker-ce,注意防火墙不要关闭。
5、在代理服务器上部署consul
主机 IP地址 需要安装的软件
三 . 具体配置:
3.1 环境部署
安装环境
[root@server 11 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
设置阿里云镜像
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
已加载插件:fastestmirror, langpacks
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
[root@server 11 ~]# vim /etc/sysctl/conf
net.ipv4.ip_forward=1
优化
开启路由功能
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@server 11 ~]# sysctl -p
net.ipv4.ip_forward = 1
加速优化 阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://******.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
准备软件包
下载安装docker
[root@server 11 ~]# yum install -y docker-ce
sudo systemctl restart docker
3.2 代理服务器安装相关软件
安装 软件 docker-compose
chmod +x docker-compose
cp -p docker-compose /usr/local/bin/
[root@docker2 compose_nginx]# yum install tree -y
部署consul
[root@pc-8 dockersoft]# ls
consul_0.9.2_linux_amd64.zip debian-7.0-x86-minimal.tar.gz
consul-template_0.19.3_linux_amd64.zip docker-compose
mkdir -r /root/consul
cp consul_0.9.2_linux_amd64.zip /root/consul/
cd /root/consul/
unzip consul_0.9.2_linux_amd64.zip
mv consul /usr/bin
安装consul
[root@pc-8 bin]#
consul agent \
-server \ //服务功能'
-bootstrap \ //参与选举'
-ui \ //提供web界面'
-data-dir=/var/lib/consul-data \ //提供一个代理存储数据目录'
-bind=192.168.100.8 \ //绑定本地地址'
-client=0.0.0.0 \ 监控的地址,所有网段
-node=consul-server01 &> /var/log/consul.log & //定义节点名称,日志混合输出到log,并且放到后台运行'
[1] 77128
consul常用操作查看命令
consul members '//查看集群信息'
consul info |grep leader '//查看管理信息'
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 '//集群节点详细信息'
关闭规则,不能关闭防火墙
setenforce 0
iptables -F 清空规则
3.3节点服务器操作
节点服务器安装 registrator 容器
docker run -d \
--name=registrator \ '//定义容器名称'
--net=host \ '定义网络'
-v /var/run/docker.sock:/tmp/docker.sock \ '指定数据卷,存储信息'
--restart=always \
gliderlabs/registrator:latest \ '定义镜像'
-ip=192.168.100.9 \ '指定本地地址 consul://192.168.100.8:8500 '指定consul管理节点地址、端口'
在节点创建容器进行测试:
docker run -itd -p:83:80 --name test-01 -h test01 nginx
docker run -itd -p:84:80 --name test-02 -h test02 nginx
docker run -itd -p:88:80 --name test-03 -h test03 httpd
docker run -itd -p:89:80 --name test-04 -h test04 httpd
3.4 宿主机可访问 192.168.100.8:8500 测试
3.5 代理服务器源码编译安装Nginx
yum -y install gcc \
gcc-c++ \
make \
pcre-devel \
expat-devel \
perl \
zlib-devel \
pcre
[root@localhost nginx-1.12.2]# tar -zxvf nginx-1.12.2.tar.gz
[root@localhost LNMP]# cd nginx-1.12.2/
[root@localhost nginx-1.12.2]# useradd -M -s /sbin/nologin nginx
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
[root@localhost nginx-1.12.2]# make && make install
[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
3.6 代理服务器安装 consul-template
compose-template介绍
compose-template是一个守护进程,用于实时查询consul集群信息
并且运维人员可以在consul服务器上,定制任意的模板,生成配置文件
compose可以查询consul中的服务目录、key、key-values等
这种强大的抽象功能和查询语言模板使得consul-template特别适合动态的创建配置文件,也就是自动化增加服务
例如:创建apache/nginx proxy balacers、haproxy backends
代理服务器 安装consul-template,准备模板文件
[root@pc-8 dockersoft]# ls
consul_0.9.2_linux_amd64.zip debian-7.0-x86-minimal.tar.gz
consul-template_0.19.3_linux_amd64.zip docker-compose
[root@pc-8 dockersoft]# unzip consul-template_0.19.3_linux_amd64.zip
Archive: consul-template_0.19.3_linux_amd64.zip
inflating: consul-template
[root@pc-8 dockersoft]# ls
consul_0.9.2_linux_amd64.zip consul-template_0.19.3_linux_amd64.zip docker-compose
consul-template debian-7.0-x86-minimal.tar.gz
[root@pc-8 dockersoft]# cp -p consul
consul_0.9.2_linux_amd64.zip consul-template_0.19.3_linux_amd64.zip
consul-template
[root@pc-8 dockersoft]# cp -p consul
consul_0.9.2_linux_amd64.zip consul-template_0.19.3_linux_amd64.zip
consul-template
[root@pc-8 dockersoft]# cp -p consul-template /usr/local/bin/
编辑 template nginx 模板文件
此模板用于nginx反向代理模板
nginx.ctmpl跟nginx没有直接关系,
consul是docker的一种自动管理机制
nginx.ctmpl中的参数以变量的形式写入
[root@pc-8 dockersoft]# vim /root/consul/nginx.ctmpl
upstream http_backend {
{ { range service "nginx"}} // 根据镜像名过滤包含nginx 的 地址和端口
server { { .Address}}:{ { .Port}};
{ { end}}
}
server { // 反向代理
listen 83;
server_name localhost 192.168.100.8;
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-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
修改nginx 配置
[root@pc-8 dockersoft]# vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
include vhost/*.conf; 添加配置文件路径可识别 default_type application/octet-stream; 创建虚拟主机目录 [root@pc-8 dockersoft]# mkdir /usr/local/nginx/conf/vhost 创建日志文件目录 [root@pc-8 dockersoft]# mkdir /var/log/nginx [root@pc-8 dockersoft]# /usr/local/nginx/sbin/nginx [root@pc-8 dockersoft]# netstat -ntap
代理服务器 启动 template
//指定模板路径,/consul/nginx.ctmpl,生成到/usr/locla/nginx/conf/vhost/sha.conf,然后重载nginx -s reload'
接下来会进入监控状态
consul-template -consul-addr 192.168.100.8:8500 \
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/sha.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
3.7 这时开一台终端 ,查看配置文件,发现配置以及自动写入
[root@pc-8 vhost]# cat sha.conf
upstream http_backend {
server 192.168.100.9:83;
server 192.168.100.9:84;
}
server {
listen 83;
server_name localhost 192.168.100.8;
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-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
3.8 然后访问测试,检查日志,发现在轮询访问容器节点
访问 192.168.100.8:83
利用 docker logs -f test2 查看容器 test2 日志
3.9 在 节点操作 新增一个容器,测试 发现功能
docker run -itd --name test-05 -p 85:80 -h test05 nginx
查看配置文件
四 . 发散思维 ,如何 通过配置 将 apache 和 nginx 容器 一起进行轮询访问操作
这里有两个实现方案
方案一 ,修改模板文件
实现同时轮询的方法,设置两个upstream 进行分别匹配 nginx 和 httpd
[root@docker vhost]# vim /root/consul/nginx.ctmpl
upstream http_backend {
{ { range service "nginx"}}
server { { .Address}}:{ { .Port}};
{ { end}}
}
upstream http_httpd {
{ { range service "httpd"}}
server { { .Address}}:{ { .Port}};
{ { end}}
}
server {
listen 1111;
server_name localhost 192.168.100.8;
access_log /var/log/nginx/cllt.cn-access.log;
upstream http_backend {
{ { range service "nginx"}}
server { { .Address}}:{ { .Port}};
{ { end}}
}
upstream http_httpd {
{ { range service "httpd"}}
server { { .Address}}:{ { .Port}};
{ { end}}
}
server {
listen 1111;
server_name localhost 192.168.100.8;
access_log /var/log/nginx/cllt.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;
}
}
server {
listen 2222;
server_name localhost 192.168.100.8;
access_log /var/log/httpd/cllt.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_httpd;
}
}
结果可自行尝试
方案二 (骚操作,慎用)
将httpd像导出,重命名为 nginx:new ,因为 它的过滤是 基于镜像名来进行的,所以很有效果,
然后基于此镜像创建容器,即可达到目的。
[root@server-9 opt]# docker run -itd -p 91:80 --name test-08 -h test08 nginx:new
cce37a01c5cd1bf1fa7b665eade83c78c7ee00574e118fe9a618c0f9ce26e582
[root@server-9 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cce37a01c5cd nginx:new "httpd-foreground" 5 seconds ago Up 5 seconds 0.0.0.0:91->80/tcp test-08
6d9c14e57792 nginx "/docker-entrypoint.…" 50 minutes ago Up 50 minutes 0.0.0.0:85->80/tcp test-05
19f647594be7 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:84->80/tcp test-02
c7704ab68f10 httpd "httpd-foreground" 2 hours ago Up 2 hours 0.0.0.0:89->80/tcp test-04
d0fdaa6ae1f0 httpd "httpd-foreground" 2 hours ago Up 2 hours 0.0.0.0:88->80/tcp test-03
9b7dd5493a95 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:83->80/tcp test-01
16f497d3290b gliderlabs/registrator:latest "/bin/registrator -i…" 4 hours ago Up 4 hours registrator
[root@server-9 opt]#
查看日志文件
[root@server-9 ~]# docker logs -f test-08
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.7. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.7. Set the 'ServerName' directive globally to suppress this message
[Wed Sep 23 11:50:23.484954 2020] [mpm_event:notice] [pid 1:tid 139876988019840] AH00489: Apache/2.4.46 (Unix) configured -- resuming normal operations
[Wed Sep 23 11:50:23.485102 2020] [core:notice] [pid 1:tid 139876988019840] AH00094: Command line: 'httpd -D FOREGROUND'
192.168.100.8 - - [23/Sep/2020:11:51:18 +0000] "GET / HTTP/1.0" 200 45
192.168.100.8 - - [23/Sep/2020:11:51:19 +0000] "GET / HTTP/1.0" 200 45
192.168.100.8 - - [23/Sep/2020:11:52:02 +0000] "GET / HTTP/1.0" 200 45
192.168.100.8 - - [23/Sep/2020:11:52:02 +0000] "GET / HTTP/1.0" 200 45
192.168.100.8 - - [23/Sep/2020:11:52:03 +0000] "GET / HTTP/1.0" 200 45
192.168.100.8 - - [23/Sep/2020:11:52:04 +0000] "GET / HTTP/1.0" 200 45