目录
一、docker-consul概述
1、服务注册和发现:
1.1、服务注册和发现概念
1.2、服务注册和发现工作机制:
1.3、服务注册与发现的优点:
2、docker-consul概念
2.1、consul的主要特点:
二、consul架构部署:
1、consul服务器配置
1.1、架构:三台服务器:
1.2、consul安装:
1.3、相关端口:
2、检查consul集群相关命令:
3、集群自动发现和注册
3.1、启动consul server
3.2、检测自动发现和注册
4、配置consul-template
4.1、 准备 template nginx 模板文件
4.2、docker1安装nginx:
4.3、配置nginx
4.4、配置并启动 template
4.5、配置并运行template-nginx
4.6、访问template-nginx
5、实现consul的多节点:
什么叫做微服务(容器)的注册与发现?
是一种分布式管理系统,定位服务的方法。
在传统的架构中,应用程序之间是直连到已知的服务,由设备提供的网络:IP地址,基于tcp/ip协议的端口
由于现代微服务部署,服务的动态性,数量增加了,传统的基于ip+端口的形式已经不太适用。所以有了服务注册和发现。
微服务的位置信息(ip+端口+健康状态)统一注册到一个中心化的服务注册表中。可以允许其他服务动态的查询和发现这些服务
服务发现和注册时微服务架构中非常重要的组件
服务注册和发现机制与其他工具配置使用,如负载均衡、健康检查、配置管理(一键同步)
docker-consul:容器的自动发现与注册
docker-consul的核心就是发现,微服务,可以动态的管理
docker-consul的作用查、看。元数据:ip、端口、健康状态、服务名称
consul:服务注册和发现工具
consul是HashiCrop公司开发的一套工具,用于实现服务发现与注册,配置管理,分布式的系统协调
每一个服务的发现与注册都是一个会话,session。
创建锁:微服务1在注册到consul的时候,consul会和服务的会话创建一个锁,锁用来标识具体的服务会话和锁之间相关联
获取锁:微服务2,建立会话,获取锁,如果申请的锁没有被使用,客户端成功获取,如果已经存在,表示已有其他服务在占用,会给你分配一个新的锁(KV存储)
释放锁:任务完成或者服务断开了连接,会把锁释放,删除会话和锁之间的关系。删除与锁关联的键。实现资源的释放
consul服务器:Docker1:20.0.0.51 consul Docker-ce nginx(二进制部署) consul-template(自动发现和部署)
registrator服务器:Docker2:20.0.0.52 运行注册机制和微服务(容器服务)
consul服务器:多节点服务器 Docker3 20.0.0.28(加入到consul集群中)
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=20.0.0.51 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
consul agent:开启监听服务
-server:指定集群中的服务器节点,consul的RAFT算法实现分布式结构中节点的一致性。集群的成员,直接成为集群的leader,后续加入的服务器都是follower
-bootstrap:表示该节点是引导节点,引导选举过程,以及为后续加入的server做引导,加入集群
-ui:启动图形化界面
-data-dir=/var/lib/consul-data:consul存储数据的路径
-bind=20.0.0.51:服务器绑定的IP地址,节点中通信
-client=0.0.0.0:客户端的地址,所有主机都可以server建立通信(生产中是指定的服务器)
-node=consul-server01:指定consul节点的名称,在集群中consul节点的名称都是唯一的,不可重复
&> /var/log/consul.log:混合重定向输出到consul.log
&:后台运行
8300:RAFT协议端口,保持分布式集群的一致性,端口处理复制和领导者选举
8301:LAN Gossip的端口,局域网内部进行节点通信和信息传播的协议
8302:WAN Gossip的端口,广域网内部节点的通信和信息传播协议
8500:web ui的端口,用来访问consul的图形化界面
8600:DNS解析端口
consul members
集群信息
consul operator raft list-peers
查看集群状态
curl 127.0.0.1:8500/v1/status/peers
查看集群的server成员
curl 127.0.0.1:8500/v1/status/leader
查看集群的领导者
curl 127.0.0.1:8500/v1/catalog/services
查看已经被集群发现和注册的服务
curl 127.0.0.1:8500/v1/catalog/nodes
查看集群节点的详细信息
docker run -d \
--name=registrator \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=20.0.0.52 \
consul://20.0.0.51:8500
-v /var/run/docker.sock:/tmp/docker.sock :指定挂载卷
docker.sock是docker守护进程的Unix的套接字文件,把他映射到容器当中,registrator容器可以监听docker的所有事件,并且完成自动注册服务
--ip=20.0.0.52:注册在consul的IP地址
consul://20.0.0.51:8500 :所有发现的服务都会注册到指定的server节点
docker run -itd -p 81:80 --name test-1 -h test1 nginx
docker run -itd -p 82:80 --name test-2 -h test2 httpd
docker run -itd -p 83:80 --name test-3 -h test3 nginx
-h指定容器里的主机名
去浏览器访问consul:
20.0.0.51:8500 查看被监测的节点
consul-template:实现配置管理自动化
用于consul集成,自动更新配置文件,实现噢诶之管理的自动化
作用:
1、动态的配置更新。consul-template监听consul中key-value的存储键值对,键值对发生变化会自动的更新配置文件,无需重启服务
2、支持多种后端的模版:nginx配置、ETCD等等
consul-template:
自动化管理配置文件的工具,获取consul中注册的服务信息,可以自动的添加到配置文件中,即使生效无需重启服务
做到自动化更新配置文件
vim /opt/consul/nginx.ctmpl
upstream test1 {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 8000;
server_name localhost 20.0.0.51;
access_log /var/log/nginx/test1-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;
}
}
在这个配置当中,test1的反向代理的方法会遍历由consul注册的所有服务名称为nginx的服务
server {{.Address}}:{{.Port}}; 将发现和注册的nginx服务的IP地址和端口,添加到test1的upstream方法当中
1、安装依赖包
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
2、创建运行用户
useradd -M -s /sbin/nologin nginx
3、编译安装
cd /opt
tar zxvf nginx-1.22.0.tar.gz -C /opt/
cd nginx-1.22.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
make && make install
4、优化路径
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
5、添加 Nginx 系统服务
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
启动nginx 查看端口
改nginx的配置文件
18行
创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost
创建日志文件目录
mkdir /var/log/nginx
停止nginx
nginx -s stop
启动nginx
nginx
unzip consul-template_0.19.3_linux_amd64.zip -d /opt/
cd /opt/
mv consul-template /usr/local/bin/
docker1运行template
consul-template --consul-addr 20.0.0.51:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
consul-template --consul-addr 20.0.0.51:8500 指定consul的地址,告诉 consul-template从server节点获取数据
template "/opt/consul/nginxctmpl:/usr/local/nginx/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload"
/opt/consul/nginx.ctmpl:配置文件的模版位置
/usr/local/nginx/vhost/test.conf:基于模版生成配置文件的位置
/usr/local/nginx/sbin/nginx -s reload" 只要集群中服务发生变化,可以随时更新到配置文件中
--log-level=info 设置consul-template的日志级别为info
开个docker1终端,看日志
var/log/consul.log
consul是一个中间件:nginx服务通过consul-template获取模版,反向代理,consul-template——consul来获取注册服务的ip和端口然后nginx调用nginx调用发现的服务来实现负载均衡
template——本机nginx——调用容器nginx,实现负载均衡
docker exec -it test-1 bash
echo "this is test1 web" > /usr/share/nginx/html/index.html
docker exec -it test-3 bash
echo "this is test2 web" > /usr/share/nginx/html/index.html
浏览器访问:http://20.0.0.51:8000/ ,并不断刷新。实现轮询
自动生成的配置文件在
/usr/local/nginx/conf/vhost/test.conf
consul的多节点:一旦选举出了leader,后续的服务器都是follower。server的名称不能重复,唯一,但是在一个数据中心上
docker3安装consul
docker3添加到consul集群中去:
consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=20.0.0.28 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 20.0.0.51 &> /var/log/consul.log &
-enable-script-checks=true \
设置检查服务为可用,他也可以发现原集群当中的服务
-datacenter=dc1 \
加入到docker1的数据中心
-join 20.0.0.51加入到已有的集群中
consul members
consul operator raft list-peers
在docker2上执行:
让docker3也监控docker2上的容器
docker run -d \
> --name=registrator2 \
> -v /var/run/docker.sock:/tmp/docker.sock \
> --restart=always \
> gliderlabs/registrator:latest \
> --ip=20.0.0.52 \
> consul://20.0.0.28:8500
浏览器consul查看:
http://20.0.0.51:8500/
脱离集群:
consul leave