昆山网站建设哪家便宜,怎么仿别人的网站,天津手机版建站系统哪个好,电商培训类网站模板基于Nginx和Consul构建自动发现的Docker服务架构 文章目录 基于Nginx和Consul构建自动发现的Docker服务架构资源列表基础环境一、安装Docker1.1、Consul节点安装1.2、registrator节点安装 二、案例前知识点2.1、什么是Consul 三、基于Nginx和Consul构建自动发现的Docker服务架构…基于Nginx和Consul构建自动发现的Docker服务架构 文章目录 基于Nginx和Consul构建自动发现的Docker服务架构资源列表基础环境一、安装Docker1.1、Consul节点安装1.2、registrator节点安装 二、案例前知识点2.1、什么是Consul 三、基于Nginx和Consul构建自动发现的Docker服务架构2.1、建立Consul服务2.2、后台启动consul服务端2.3、查看群集信息2.4、通过http api获取群集信息 四、容器服务自动加入Nginx群集4.1、安装Gliderlabs/Registrator4.2、测试服务发现功能是否正常4.3、验证http和nginx服务是否注册号到consul 五、安装consul-template5.1、准备template nginx模板文件5.2、编译安装nginx5.3、配置nginx5.4、配置并启动template5.5、访问template-nginx配置文件5.6、增加一个nginx容器节点 资源列表
操作系统配置主机名IP所需软件CentOS 7.92C4Gconsul192.168.93.165Docker 26.1.2、Consul、Consul-remplateCentOS 7.92C4Gregistrator192.168.93.166Docker 20.10.17
基础环境
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld关闭内核安全机制
setenforce 0
sed -i s/^SELINUX.*/SELINUXdisabled/g /etc/selinux/config修改主机名
hostnamectl set-hostname consul
hostnamectl set-hostname registrator需要软件包或者报错需要解决问题的私有或者评论就好
一、安装Docker
1.1、Consul节点安装
# 安装依赖环境
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加CentOS官方镜像站
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum clean all yum makecache# 安装Docker
yum -y install docker-ce docker-ce-cli containerd.io# 启动Docker
systemctl start docker
systemctl enable docker# 配置Docker加速器
cd /etc/docker/
cat daemon.json EOF
{
registry-mirrors: [https://8xpk5wnt.mirror.aliyuncs.com]
}
EOF
systemctl restart docker# 查看版本
[rootconsul ~]# docker -v
Docker version 26.1.2, build 211e74b
1.2、registrator节点安装
# 先卸载原本Docker
yum -y remove docker*# 下载rpm软件包
yum -y install wget
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.6.6-3.1.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-20.10.17-3.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-20.10.17-3.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-rootless-extras-20.10.17-3.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-compose-plugin-2.6.0-3.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-scan-plugin-0.17.0-3.el7.x86_64.rpm# 联网下载依赖包不安装
yum -y install --downloadonly --downloaddir./ *.rpm# 安装Docker
yum -y install *.rpm# 启动Docker
systemctl start docker
systemctl enable docker# 配置Docker加速器
cd /etc/docker/
cat daemon.json EOF
{
registry-mirrors: [https://8xpk5wnt.mirror.aliyuncs.com]
}
EOF
systemctl restart docker# 查看Docker版本
[rootregistrator ~]# docker -v
Docker version 20.10.17, build 100c701
二、案例前知识点
2.1、什么是Consul
Consul是HashiCorp公司推出的开源工具用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案不同与Airbnb的SmartStack等相比Consul的方案更“一站式”内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案不再需要依赖其他工具例如Zookeeper等使用起来也较为简单。Consul是基于Golang语言开发实现的因此具有天然可移植性支持Linux、Windows和Mac OS X安装包仅包含一个可执行文件方便部署与Docker等轻量级容器可无缝配合。
三、基于Nginx和Consul构建自动发现的Docker服务架构
2.1、建立Consul服务
想要利用Consul提供的服务实现服务的注册与发现需要建立Consul服务。在Consul方案中每个提供服务的节点上都要部署和运行Consul的Agent所有运行Consul Agent节点的集合构成了Consul Cluster。Consul Agent有两种运行模式Server和Client。这里的Server和Client只是Consul群集层面的区分与搭建在Consul之上的应用服务无关。以Server模式运行的Consul Agent节点用于维护Consul群集的状态管理建议每个Consul Cluster至少有3个或以上的运行在Server mode的AgentClient节点不限。
[rootconsul ~]# mkdir consul
[rootconsul ~]# cd consul/
# 上传zip压缩包
[rootconsul consul]# yum -y install unzip
[rootconsul consul]# unzip consul_0.9.2_linux_amd64.zip
Archive: consul_0.9.2_linux_amd64.zipinflating: consul
[rootconsul consul]# mv consul /usr/bin/
# 查看版本
[rootconsul consul]# consul -v
Consul v0.9.2
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol 2 when speaking to compatible agents)2.2、后台启动consul服务端
安装consul是用于服务注册也就是容器本身的一些信息注册到consul里面其他程序可以通过consul获取注册的相关服务信息这就是服务注册与发现
[rootconsul ~]# nohup consul agent -server -bootstrap -ui -data-dir/var/lib/consul-data -bind192.168.93.165 -client0.0.0.0 -nodeconsul-server01 /var/log/consul.log # 其中的命令参数解释如下
-bootstrap用来控制一个server是否在bootstrap模式在一个datacenter中只能有一个server处于bootstrap模式当一个server处于bootstrap模式时可以自己选举为raft leader
-data-dir参数指定数据存储目录
-bind该地址用来在群集内部的通讯群集内的所有节点到地址都必须是可达的默认是0.0.0.0
-ui参数指定开启UI界面这样通过http://localhost:8500/ui这样的地址啊访问consul自带的web UI界面
-clientconsul绑定在哪个client地址上这个地址提供HTTP、DNS、RPC等服务默认是127.0.0.1
-node节点在群集中的名称在一个群集中必须是唯一的默认是该节点的主机名# 查看重定向日志文件可以看到服务没有报错是正常的
[rootconsul ~]# cat /var/log/consul.log
nohup: ignoring inputWARNING: Bootstrap mode enabled! Do not enable unless necessaryStarting Consul agent...Consul agent running!Version: v0.9.2Node ID: 0bb5e004-361b-e1f4-ad19-c67e9074142fNode name: consul-server01Datacenter: dc1Server: true (bootstrap: true)Client Addr: 0.0.0.0 (HTTP: 8500, HTTPS: -1, DNS: 8600)Cluster Addr: 192.168.93.165 (LAN: 8301, WAN: 8302)Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false Log data will now stream in as it occurs:2024/05/31 20:39:18 [INFO] raft: Initial configuration (index1): [{Suffrage:Voter ID:192.168.93.165:8300 Address:192.168.93.165:8300}]2024/05/31 20:39:18 [INFO] raft: Node at 192.168.93.165:8300 [Follower] entering Follower state (Leader: )2024/05/31 20:39:18 [INFO] serf: EventMemberJoin: consul-server01.dc1 192.168.93.1652024/05/31 20:39:18 [INFO] serf: EventMemberJoin: consul-server01 192.168.93.1652024/05/31 20:39:18 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp)2024/05/31 20:39:18 [INFO] consul: Handled member-join event for server consul-server01.dc1 in area wan2024/05/31 20:39:18 [INFO] consul: Adding LAN server consul-server01 (Addr: tcp/192.168.93.165:8300) (DC: dc1)2024/05/31 20:39:18 [INFO] agent: Started DNS server 0.0.0.0:8600 (tcp)2024/05/31 20:39:18 [INFO] agent: Started HTTP server on [::]:85002024/05/31 20:39:25 [ERR] agent: failed to sync remote state: No cluster leader2024/05/31 20:39:27 [WARN] raft: Heartbeat timeout from reached, starting election2024/05/31 20:39:27 [INFO] raft: Node at 192.168.93.165:8300 [Candidate] entering Candidate state in term 22024/05/31 20:39:27 [INFO] raft: Election won. Tally: 12024/05/31 20:39:27 [INFO] raft: Node at 192.168.93.165:8300 [Leader] entering Leader state2024/05/31 20:39:27 [INFO] consul: cluster leadership acquired2024/05/31 20:39:27 [INFO] consul: New leader elected: consul-server012024/05/31 20:39:27 [INFO] consul: member consul-server01 joined, marking health alive2024/05/31 20:39:28 [INFO] agent: Synced node infoNewer Consul version available: 1.18.2 (currently running: 0.9.2)# 启动consul后默认会监听5个端口
8300replication客户端、服务端数据同步、leader farwarding的端口
8301lan cossip的端口内部统一数据中心端口
8302wan gossip的端口外网端口、广域网、不同数据中心端口通信
8500web ui界面的端口用于http接口与Web
8600使用dns协议查看节点信息的端口2.3、查看群集信息
# 查看群集中的所有成员节点
[rootconsul ~]# consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.93.165:8301 alive server 0.9.2 2 dc1# Node群集中节点的名称
# Address节点的地址和端口
# Status节点的状态alive表示该节点当前是活跃的
# Type节点的类型server表示这是一个consul服务器节点
# Buildconsul的版本号
# Protocolconsul使用的协议版本这里是2
# DC数据中心的标识consul支持多数据中心配置这里的数据中心标识是dc1# 获取Consul详细信息
[rootconsul ~]# consul info | grep leaderleader trueleader_addr 192.168.93.165:8300# leadertrue表示当前节点是consul群集的领导者。领导者负载协调和管理群集的状态处理所有的写操作并将数据复制到其他服务器上
# leader_addr192.168.93.165这表示当前领导者的地址和端口这是consul群集中其他节点和客户端咳哟用来与领导者通信的地址和端口2.4、通过http api获取群集信息
# 查看群集server成员
[rootconsul ~]# curl 127.0.0.1:8500/v1/status/peers
[192.168.93.165:8300]
# 查看群集Raf leader领导者
[rootconsul ~]# curl 127.0.0.1:8500/v1/status/leader
192.168.93.165:8300
# 注册的所有服务还没有注册服务
[rootconsul ~]# curl 127.0.0.1:8500/v1/catalog/services
{consul:[]}
# 查看nginx服务信息还没做任何有关nginx的操作
[rootconsul ~]# curl 127.0.0.1:8500/v1/catalog/nginx
# 查看群集节点相信信息
[rootconsul ~]# curl 127.0.0.1:8500/v1/catalog/nodes
[{ID:0bb5e004-361b-e1f4-ad19-c67e9074142f,Node:consul-server01,Address:192.168.93.165,Datacenter:dc1,TaggedAddresses:{lan:192.168.93.165,wan:192.168.93.165},Meta:{},CreateIndex:5,ModifyIndex:6}]四、容器服务自动加入Nginx群集
4.1、安装Gliderlabs/Registrator
Gliderlabs/Registrator可检查容器运行状态并自动注册还可以注销docker容器的服务到服务配置中心。目前支持Consul、Etcd和SkyDNS2如果拉去Gliderlabs/Registrator镜像的时候报错不能拉去可能是docker版本太高了
# 在192.168.93.166节点执行以下操作
[rootregistrator ~]# docker run -d --nameregistrator --nethost -v /var/run/docker.sock:/tmp/docker.sock --restartalways gliderlabs/registrator:latest -ip192.168.93.166 consul://192.168.93.165:8500
Unable to find image gliderlabs/registrator:latest locally
latest: Pulling from gliderlabs/registrator
Image docker.io/gliderlabs/registrator:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
c87f684ee1c2: Pull complete
a0559c0b3676: Pull complete
a28552c49839: Pull complete
Digest: sha256:6e708681dd52e28f4f39d048ac75376c9a762c44b3d75b2824173f8364e52c10
Status: Downloaded newer image for gliderlabs/registrator:latest
e2377a3815a8f8ddcddfed50fd1776542002455f3d1e18fe72249d82ed10b61e[rootregistrator ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2377a3815a8 gliderlabs/registrator:latest /bin/registrator -i… 37 seconds ago Up 36 seconds registrator# 选项含义解释如下
--nameregistrator给容器只当一个容器名称--nethost容器与宿主机共享网络-v /var/run/docker.sock:/tmp/docker.sock挂载卷用来监视新的容器启动和停止事件 本机:容器--restartalways容器重启策略如果容器退出Docker将始终重启容器gliderlabs/registrator:latest要运行的镜像-ip192.168.93.166 这是一个传递给registrator的命令行参数指定了容器应该使用的IP地址consul://192.168.93.165:8500这也是一个传递给registrator的命令行参数制定了registrator应该连接到的Consul服务器的地址和端口。Consul是一个服务发现和配置管理的工具registrator会将新启动的容器注册到Consul服务器中4.2、测试服务发现功能是否正常
[rootregistrator ~]# docker run -itd -p 83:80 --name test-01 -h test01 nginx
[rootregistrator ~]# docker run -itd -p 84:80 --name test-02 -h test02 nginx
[rootregistrator ~]# docker run -itd -p 88:80 --name test-03 -h test03 httpd
[rootregistrator ~]# docker run -itd -p 89:80 --name test-04 -h test04 httpd# 选项含义解释如下
-itd一个组合i容器保持输入、t给容器分配一个伪终端、-d运行后台运行
-p端口映射 宿主机端口:容器端口
--name容器名称
-host容器主机名4.3、验证http和nginx服务是否注册号到consul
浏览器中输入http://192.168.93.165:8500在web页面中“单击NODES”然后单击“consul-server01”会出现5个服务
# 使用curl测试连接服务器
[rootconsul ~]# curl 127.0.0.1:8500/v1/catalog/services
{consul:[],httpd:[],nginx:[]}# 从结果看httpd和nginx服务已经注册到consul里面说明服务正常五、安装consul-template
Consul-Template是基于Consul的自动替换配置文件的应用。在Consul-template没出现之前构建服务大多数采用的与Zookeeper、EtcdConfd类似的系统Consul-Template是一个守护进程用于实时查询Consul群集信息并更新文件系统上任意数量的指定模板生成配置文件。更新完成以后可以选择运行shell命令执行更新操作重新加载NginxConsul-Template可以查询Consul中的服务目录、Key、Key-values等。这种强大的抽象功能和查询语言模板可以使用Consul-Template特别适合动态的创建配置文件。例如创建Apache/Nginx、Proxy Balancers、Harprxy Backends、Varnish Servers、Application Configurations等
5.1、准备template nginx模板文件
需要在192.168.93.165上执行如下操作
[rootconsul ~]# vim /root/consul/nginx.ctmpl
upstream http_backend {{{range service nginx}}server {{.Address}}:{{.Port}};{{end}}
}
server {listen 83;server_name localhost 192.168.93.165;access_log /var/log/nginx/kgc.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;}
}# 创建nginx日志文件存放目录
[rootconsul ~]# mkdir /var/log/nginx5.2、编译安装nginx
[rootconsul ~]# yum -y install gcc pcre-devel zlib-devel
[rootconsul ~]# tar -zxvf nginx-1.12.0.tar.gz
[rootconsul ~]# cd nginx-1.12.0/
[rootconsul nginx-1.12.0]# ./configure --prefix/usr/local/nginx
[rootconsul nginx-1.12.0]# make make install5.3、配置nginx
[rootconsul ~]# vim /usr/local/nginx/conf/nginx.conf
# 在http段里面34行添加虚拟主机目录
include vhost/*.conf;
[rootconsul ~]# mkdir /usr/local/nginx/conf/vhost
# 启动nginx服务
[rootconsul ~]# /usr/local/nginx/sbin/nginx
[rootconsul ~]# netstat -anpt | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 15667/nginx: master5.4、配置并启动template
[rootconsul ~]# unzip consul-template_0.19.3_linux_amd64.zip
Archive: consul-template_0.19.3_linux_amd64.zipinflating: consul-template
[rootconsul ~]# mv consul-template /usr/bin/
# 查看版本
[rootconsul ~]# consul-template -v
consul-template v0.19.3 (ebf2d3d)# 在前台启动template服务启动后不要按ctrl c 中止
[rootconsul ~]# consul-template -consul-addr 192.168.93.165:8500 -template /root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload --log-levelinfo
2024/06/01 03:21:24.800912 [INFO] consul-template v0.19.3 (ebf2d3d)
2024/06/01 03:21:24.800923 [INFO] (runner) creating new runner (dry: false, once: false)
2024/06/01 03:21:24.801137 [INFO] (runner) creating watcher
2024/06/01 03:21:24.801380 [INFO] (runner) starting
2024/06/01 03:21:24.801394 [INFO] (runner) initiating run
2024/06/01 03:21:24.802638 [INFO] (runner) initiating run
2024/06/01 03:21:24.803310 [INFO] (runner) rendered /root/consul/nginx.ctmpl /usr/local/nginx/conf/vhost/kgc.conf
2024/06/01 03:21:24.803321 [INFO] (runner) executing command /usr/local/nginx/sbin/nginx -s reload from /root/consul/nginx.ctmpl /usr/local/nginx/conf/vhost/kgc.conf
2024/06/01 03:21:24.803343 [INFO] (child) spawning: /usr/local/nginx/sbin/nginx -s reload# 需要指定template模板文件及生成路径即可生成的配置文件如下重新打开一个终端查看
[rootconsul ~]# cat /usr/local/nginx/conf/vhost/kgc.conf
upstream http_backend {server 192.168.93.166:83;server 192.168.93.166:84;}
server {listen 83;server_name localhost 192.168.93.165;access_log /var/log/nginx/kgc.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;}
}5.5、访问template-nginx配置文件
通过浏览器访问template-nginx配置文件里面Nginx监听的83端口访问成功如下所示
5.6、增加一个nginx容器节点
增加一个nginx容器节点测试服务发现及配置更新功能
[rootregistrator ~]# docker run -itd -p 85:80 --name test-05 -h test05 nginx观察template服务会从模板更新/usr/local/nginx/conf/vhost/kgc.conf文件内容并且重载nginx服务
ca2024/06/01 03:26:45.744977 [INFO] (runner) initiating run
2024/06/01 03:26:45.745772 [INFO] (runner) rendered /root/consul/nginx.ctmpl /usr/local/nginx/conf/vhost/kgc.conf
2024/06/01 03:26:45.745791 [INFO] (runner) executing command /usr/local/nginx/sbin/nginx -s reload from /root/consul/nginx.ctmpl /usr/local/nginx/conf/vhost/kgc.conf
2024/06/01 03:26:45.745811 [INFO] (child) spawning: /usr/local/nginx/sbin/nginx -s reload查看/usr/local/nginx/conf/vhost/kgc.conf文件内容
[rootconsul ~]# cat /usr/local/nginx/conf/vhost/kgc.conf
upstream http_backend {server 192.168.93.166:83;server 192.168.93.166:84;# 新多出一个85nginx服务server 192.168.93.166:85;}
server {listen 83;server_name localhost 192.168.93.165;access_log /var/log/nginx/kgc.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;}
}查看三台nginx容器日志请求正常轮询到各个容器节点上
# 使用curl或者浏览器访问http://192.168.93.165:83,观察容器nginx日志
[rootregistrator ~]# docker logs -f test-01
192.168.93.165 - - [01/Jun/2024:03:30:10 0000] GET / HTTP/1.0 200 615 - curl/7.29.0 127.0.0.1[rootregistrator ~]# docker logs -f test-02
192.168.93.165 - - [01/Jun/2024:03:30:11 0000] GET / HTTP/1.0 200 615 - curl/7.29.0 127.0.0.1[rootregistrator ~]# docker logs -f test-05
192.168.93.165 - - [01/Jun/2024:03:30:12 0000] GET / HTTP/1.0 200 615 - curl/7.29.0 127.0.0.1