Docker---consul集群部署与compose-template自动化管理docker服务

目录

一.consul概述

二.consul集群部署

三.consul集群上添加compose-temlate


一.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 ~]# 

到这里我们实现了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代理的配置文件,这样就形成了服务的自动化增减

发布了144 篇原创文章 · 获赞 175 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_42761527/article/details/105259138