目录
一.consul概述
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工作模式
- consul的架构如下:
- consul中包括3中不同的角色:client、server、server-leader,其实还有一个agent图中没有标识
- Client(客户端)
转发所有的请求给server
无状态,不持久化数据
参与LAN Gossip的健康检查
- server(服务器)
持久化数据
转发请求给server-Leader
参数Server-Leader选举
通过WAN Gossip(流算法协议,Gassndra和比特币的底层算法一样,符合弱一致性),与其他的数据中心交换数据
- Server-leader
响应RPC的请求
将服务列表数据同步给server
- Agent
agent是一个守护线程
跟随consul应用启动而启动
负责检查、维护节点同步
二.consul集群部署
实验环境
- 实验设备部署
角色 | IP地址 | 需要安装的软件 |
consul、server-leader | 192.168.43.101/24 |
docker-ce、consul |
docker容器服务(nginx) | 192.168.43.102/24 | docker-ce、registrator |
具体部署步骤
- 在两台pc上安装docker-ce
##安装依赖包
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服务器上部署consul
1.解压consul到/usr/bin
[root@consul consul]# unzip consul_0.9.2_linux_amd64.zip -d /usr/bin/
Archive: consul_0.9.2_linux_amd64.zip
inflating: /usr/bin/consul
[root@consul consul]#
##consul的安装包可到官网下载
##进行consul设置
consul agent \ //代理功能
-server \ //服务功能
-bootstrap \ //参与选举
-ui \ //提供web界面
-data-dir=/var/lib/consul-data \ //提供一个代理存储数据目录
-bind=192.168.43.101 \ //绑定本地地址
-client=0.0.0.0 \ //面对的客户端地址,这些写所有地址
-node=consul-server01 &> /var/log/consul.log & //定义节点名称,日志混合输出到log,并且放到后台运行
[root@consul consul]# consul members ##查看集群信息
Node Address Status Type Build Protocol DC
consul-server01 192.168.43.101:8301 alive server 0.9.2 2 dc1
[root@consul consul]# consul info | grep leader ##查看管理信息
leader = true
leader_addr = 192.168.43.101:8300
[root@consul consul]#
//通过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/catalog/nginx #查看nginx的服务信息
curl 127.0.0.1:8500/v1/catalog/nodes #群集节点的详细信息
- 在docker-nginx服务器上连接consul,创建nginx容器服务
[root@nginx ~]# docker run -d \
> --name=registrator \ ##定义容器名称
> --net=host \ ##定义网络
> -v /var/run/docker.sock:/tmp/docker.sock \ ##指定数据卷,存储信息
> --restart=always \
> gliderlabs/registrator:latest \ ##定义镜像
> -ip=192.168.43.102 \ ##指定本地地址
> consul://192.168.43.101:8500 ##指定consul管理节点地址、端口
2c0dd09ee35139195c3de747fc87a445297c2afb39b0735afe6089a20b0272d3
[root@nginx ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c0dd09ee351 gliderlabs/registrator:latest "/bin/registrator -i…" 3 seconds ago Up 2 seconds registrator
//创建容器服务
[root@nginx ~]# docker run -itd -p:81:80 --name test-01 -h test01 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
c499e6d256d6: Pull complete
74cda408e262: Pull complete
ffadbd415ab7: Pull complete
Digest: sha256:282530fcb7cd19f3848c7b611043f82ae4be3781cb00105a1d593d7e6286b596
Status: Downloaded newer image for nginx:latest
4bfafe4bf7bd0e84f12100b8d337effd9ed1100f723b7ccffedbf7c87941ec01
[root@nginx ~]# docker run -itd -p:82:80 --name test-02 -h test02 nginx
docker run -itd -p:84:80 --name test-04 -h test04 nginxd2281250cee5566d2d1c432b2b6a8019ab96c61156780a89393b613f755ba39f
[root@nginx ~]# docker run -itd -p:83:80 --name test-03 -h test03 nginx
973558821e126f5b2fa57cb8a8850b8671e387ff3c7bc53cfe069fc9e7cdabac
[root@nginx ~]# docker run -itd -p:84:80 --name test-04 -h test04 nginx
a740870c187964d6f4a7ede7c52ce16e2f1ae18912ba954e10d4691e1196c87a
[root@nginx ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a740870c1879 nginx "nginx -g 'daemon of…" 6 seconds ago Up 5 seconds 0.0.0.0:84->80/tcp test-04
973558821e12 nginx "nginx -g 'daemon of…" 8 seconds ago Up 7 seconds 0.0.0.0:83->80/tcp test-03
d2281250cee5 nginx "nginx -g 'daemon of…" 8 seconds ago Up 7 seconds 0.0.0.0:82->80/tcp test-02
4bfafe4bf7bd nginx "nginx -g 'daemon of…" 17 seconds ago Up 16 seconds 0.0.0.0:81->80/tcp test-01
2c0dd09ee351 gliderlabs/registrator:latest "/bin/registrator -i…" 2 minutes ago Up 2 minutes registrator
[root@nginx ~]#
- 登录本地浏览器,http://192.168.43.101:8500/ui/#/dc1/nodes/consul-server01,查看consul是否发现后端容器服务
到这里我们实现了consul的服务发现功能,而且consul的UI界面中还有对ACL和K-V的配置,但是这些功能需要指定的
三.consul集群上添加compose-temlate
compose-temlate简介
- compose-template是一个守护进程,用于实时查询consul集群信息
- 并且运维人员可以在consul服务器上,定制任意的模板,生成配置文件
- compose可以查询consul中的服务目录、key、key-values等
- 这种强大的抽象功能和查询语言模板使得consul-template特别适合动态的创建配置文件,也就是自动化增加服务
实验架构图分析
- 我们在consul服务上安装一个nginx服务,用作负载均衡器,利用consul的服务发现功能和compose-template的动态生成配置文件的功能,就可以实现当我们在后端服务器上增加一个容器服务时,consul能够及时发现,compose-template及时在nginx里生成该服务的地址和端口号放入地址池里面,这样nginx作为代理服务器,就可以调用了
具体安装步骤
- 在consul服务端操作
//在consul目录下操作,建立template nginx模板文件
cd /root/consul
vi nginx.ctmpl
upstream http_backend { ##声明后端器服务池
{{range service "nginx"}}
server {{.Address}}:{{.Port}}; ##读取nodes的地址和服务端口的变量,这是动态读取
{{end}}
}
server {
listen 1216; ##监听consul的端口,这是代理端口,consul是作为一个代理服务,访问后端的容器服务
server_name localhost 192.168.43.101; ##监听本地地址,监听代理端的地址
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 ,在consul服务器上操作,安装包可到官网下载
yum install -y gcc pcre-devel zlib-devel
tar xzvf nginx-1.12.2.tar.gz -C /opt
cd /opt/nginx-1.12.2/
./configure --prefix=/usr/local/nginx
make && make install
//配置nginx
vi /usr/local/nginx/conf/nginx.conf
http {
include mim.types;
include vhost/*.conf; ##添加虚拟主机的文件
default_type application/octet-stream;
}
//创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost
//创建日志文件目录,前面指定的consul.conf中指定的
mkdir /var/log/nginx
//启动nginx
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
/usr/local/nginx/sbin/nginx
//配置并且启动template
上传consul-template_0.19.3_linux_amd64.zip到/root目录下
//解压
[root@consul consul]# unzip consul-template_0.19.3_linux_amd64.zip -d /usr/bin/
Archive: consul-template_0.19.3_linux_amd64.zip
inflating: /usr/bin/consul-template
//启用模板
// /root/consul/nginx.ctmpl,模板文件
// /usr/local/nginx/conf/vhost/kgc.conf,生成的配置文件
// /usr/local/nginx/sbin/nginx -s reload,重载服务
//-log-level=info,指定日志级别
//进入监控状态
consul-template -consul-addr 192.168.43.101:8500 \
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
//另外打开一个终端查看利用nginx.ctmpl自动生成nginx虚拟主机的配置文件
[root@consul ~]# ls /usr/local/nginx/conf/vhost/
kgc.conf
[root@consul ~]# cat /usr/local/nginx/conf/vhost/kgc.conf
upstream http_backend {
server 192.168.43.102:81;
server 192.168.43.102:82;
server 192.168.43.102:83;
server 192.168.43.102:84;
}
server {
listen 1216;
server_name localhost 192.168.43.101;
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;
}
}
[root@consul ~]#
- 使用 http://192.168.43.101:1216,访问后端服务器
- 进入docker_nginx服务器中的查看容器服务的日志
添加nginx节点验证服务自动更新
- 在docker_nginx服务端操作
//在docker_nginx服务器上增加一个nginx的容器服务
[root@nginx ~]# docker run -itd -p:85:80 --name test-05 -h test05 nginx
04692fb5ea88553f134cbf0d4663dea560d482ee4ac6ae6c8b3f3a0647d283b8
[root@nginx ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04692fb5ea88 nginx "nginx -g 'daemon of…" 4 seconds ago Up 4 seconds 0.0.0.0:85->80/tcp test-05
a740870c1879 nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:84->80/tcp test-04
973558821e12 nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:83->80/tcp test-03
d2281250cee5 nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:82->80/tcp test-02
4bfafe4bf7bd nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:81->80/tcp test-01
2c0dd09ee351 gliderlabs/registrator:latest "/bin/registrator -i…" About an hour ago Up About an hour registrator
[root@nginx ~]#
- 在consul服务器上查看虚拟主机文件的有没有增加85号端口到服务器池
由此可以知道通过consul的一个实时学习新增服务,然后compose-template可以实现动态增加服务节点到nginx代理的配置文件,这样就形成了服务的自动化增减