文章目录
一.consul概述
1.1: consul简介
-
consul是HashCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案相比,consul的方案是“一站式”,内置了服务注册与发现框架、分布式一致性协议实现、健康检查、K-V存储、多数据中心方案,不需要依赖其他工具(比如ZooKeeper等)。
-
consul使用go语言编写,因此具有天然的可移植性(支持Linux、windows和Mac OS X等系统);安装包仅仅包含一个二进制的可执行文件,方便部署,与Docker等轻量级容器可以无缝连接。
-
官网地址: https://www.consul.io/downloads.html
-
consul特性
-
基础特性:服务注册与发现、数据强一致性保证、多数据中心、健康检查、Key/Value存储
-
高级特性:HTTP API、ACL(对后端服务的访问控制权限可以设置)
-
consul支持健康检查,允许存储键值对
-
一致性协议采用Raft算法,用来保证服务的高可用
-
成员管理和消息广播采用GOSSIP协议,支持ACL访问控制
-
方便部署,与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模板更新
1.3:Docker consul自动发现服务架构的构建
1、每个提供服务的节点上都要部署和运行consul的agent
2、consul agent有两种运行模式:server和client
3、server和client只是consul集群层面的区分,与搭建在cluster之上的应用服务无关
-
主机 IP地址 需要安装的软件 主节点 192.168.100.200 Docker-ce、Consul,Compose,Consul-template nginx服务器 192.168.100.190 Docker-ce、registrator -
两个节点都安装Docker-ce,注意防火墙不要关闭,如有疑问可以参阅我之前的Docker部署的博客,这里不再赘述
-
具体部署流程
-
在两台pc上安装docker-ce
1.##安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 ##设置docker源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ##安装docker yum install -y docker-ce ##关闭安全性功能 systemctl stop firewalld setenforce 0 ##开启docker服务 systemctl start docker.service systemctl enable docker.service ##加速镜像 tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://dnntzrw4.mirror.aliyuncs.com"] } EOF ##重启加载docker systemctl daemon-reload systemctl restart docker
-
在consul服务器上部署compose consul
2.部署consul 上传docker-compose和consul_0.9.2_linux_amd64.zip cp -p docker-compose /usr/local/bin '//上传压缩包' mkdir /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 agent \ '//设置代理' -server \ '//服务功能' -bootstrap \ '//参与选举' -ui \ '//提供web界面' -data-dir=/var/lib/consul-data \ '//提供一个代理存储数据目录' -bind=192.168.100.200 \ '//绑定consul本地地址' -client=0.0.0.0 \ '//面对的客户端地址 -node=consul-server01 &> /var/log/consul.log & ' //定义节点名称,日志混合输出到log,并且放到后台运行' //查看群集状态 consul members '//查看集群信息' consul info | grep leader //通过httpd api 获取群集信息 curl 127.0.0.1:8500/v1/status/peers "查看群集server成员" curl 127.0.0.1:8500/v1/status/leader "查看群集Raf leader" curl 127.0.0.1:8500/v1/catalog/services "注册所有服务" curl 127.0.0.1:8500/v1/catlog/nginx "查看nginx服务信息"
-
Web容器服务通过registrator自动加入群集
0.docker-ce环境 1.web节点安装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.190 \ "指的是web节点服务器地址" consul://192.168.100.200:8500 "指的是consul服务器地址、端口" //浏览器访问 192.168.100.200:8500 2.测试服务发现功能是否正常 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 #这个可以不设 [root@localhost consul]# firewall-cmd --get-active-zones public interfaces: ens33 [root@localhost consul]# firewall-cmd --zone=public --add-port=8500/tcp '//设置防火墙规则或者关闭防火墙' success 3. 验证httpd 和nginx 服务器是否注册到consul 输入 http://192.168.100.200:9500 点击nodes 点击 consul-server01 会出现5个服务 //在consul服务器上查看服务 [root@docker01 ~]# curl 127.0.0.1:8500/v1/catalog/services {"consul":[],"httpd":[],"nginx":[]}[root@docker01 ~]#
-
consul节点准备template nginx 模板文件
compose-template介绍
compose-template是一个守护进程,用于实时查询consul集群信息
并且运维人员可以在consul服务器上,定制任意的模板,生成配置文件
compose可以查询consul中的服务目录、key、key-values等
这种强大的抽象功能和查询语言模板使得consul-template特别适合动态的创建配置文件,也就是自动化增加服务例如:创建apache/nginx proxy balacers、haproxy backends
此模板用于nginx反向代理模板
nginx.ctmpl跟nginx没有直接关系,
consul是docker的一种自动管理机制
nginx.ctmpl中的参数以变量的形式写入
4.consul服务器安装consul-template unzip consul-template_0.19.3_linux_amd64.zip cp consul-template /usr/local/bin 5.准备template nginx 模板文件 //在consul上操作 vim /root/consul/nginx.ctmpl upstream http_backend { {{range service "nginx"}} server {{.Address}}:{{.Port}}; {{end}} } server { listen 83; server_name localhost 192.168.100.200; 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; } }
-
consul 服务端安装nginx
6. 编译安装nginx yum install gcc pcre-devel zlib-devel -y tar zxvf nginx-1.12.0.tar.gz -C /opt [root@docker01 consul]# cd /opt [root@docker01 opt]# ls containerd nginx-1.12.0 rh [root@docker01 opt]# cd nginx-1.12.0/ [root@docker01 nginx-1.12.0]# ls auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src [root@docker01 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx [root@docker01 nginx-1.12.0]# make && make install
-
consul服务端修改nginx的配置文件并启动
7. 配置nginx [root@docker01 nginx-1.12.0]# vim /usr/local/nginx/conf/nginx.conf http { include mime.types; include vhost/*.conf; "添加子配置文件" default_type application/octet-stream; ...... } //创建虚拟主机目录 [root@docker01 nginx-1.12.0]# mkdir /usr/local/nginx/conf/vhost //创建日志文件目录 [root@docker01 nginx-1.12.0]# mkdir /var/log/nginx //启动nginx [root@docker01 nginx-1.12.0]# /usr/local/nginx/sbin/nginx
-
consul服务端配置并启动template
8.//上传consul-template_0.19.3_linux_amd64.zip root@docker01 /]# cp consul-template_0.19.3_linux_amd64.zip /root [root@docker01 /]# unzip consul-template_0.19.3_linux_amd64.zip [root@docker01 /]# mv consul-template /usr/bin/ [root@docker01 /]# consul-template -consul-addr 192.168.100.200:8500 \ -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/tang.conf:/usr/local/nginx/sbin/nginx -s reload" \ --log-level=info "启动并利用模板生成nginx的子配置文件" '//指定模板路径,/consul/nginx.ctmpl,生成到/usr/locla/nginx/conf/vhost/tang.conf,然后重载nginx -s reload' 接下来会进入监控状态 [root@docker01 ~]# netstat -ntap |grep 83 tcp 0 0 0.0.0.0:83 0.0.0.0:* LISTEN 94743/nginx //另外打开一个终端查看生成配置文件 [root@docker01 vhost]# vim tang.conf upstream http_backend { server 192.168.100.190:83; '//能够通过consul自动发现nginx服务器的IP地址与端口' server 192.168.100.190:84; } server { listen 83; server_name localhost 192.168.100.200; 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; } }
-
web端增加nginx容器节点
9. 增加一个nginx容器节点,测试服务发现及配置更新功能 //在registrator 服务端添加容器,注册 docker run -itd -p:85:80 --name test-05 -h test05 nginx //在consul服务端监控会有自动更新 2020/09/23 10:36:54.609791 [INFO] (runner) initiating run 2020/09/23 10:36:54.611630 [INFO] (runner) rendered "/root/consul/nginx.ctmpl" => "/usr/local/nginx/conf/vhost/tang.conf" 2020/09/23 10:36:54.611654 [INFO] (runner) executing command "/usr/local/nginx/sbin/nginx -s reload" from "/root/consul/nginx.ctmpl" => "/usr/local/nginx/conf/vhost/tang.conf" 2020/09/23 10:36:54.611685 [INFO] (child) spawning: /usr/local/nginx/sbin/nginx -s reload //查看三台Nginx 日志,请求正常轮询到各个容器节点 docker logs -f test-01 '//nginx服务器动态查看test-01日志' docker logs -f test-02 docker logs -f test-05 [root@docker01 vhost]# cat tang.conf //查看自动生成的子配置文件 upstream http_backend { server 192.168.100.190:83; "反向代理后端节点" server 192.168.100.190:84; server 192.168.100.190:85; '//已经自动更新' } server { listen 83; server_name localhost 192.168.100.200; "nginx反向代理服务器地址" 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_pass http://http_backend; } }
1.4: 拓展基于两个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.200; 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.200; 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; } }