Docker Consul

Docker Consul容器服务更新与发现

容器服务更新与发现拓补图

在这里插入图片描述

拓补图解析

  • 首先从Internet访问进来的是VIP漂移地址,前端是两台Nginx作为主备图提供服务
  • consul templatet提供了前端配置文件的模板
  • 后端两个节点的服务都是以容器的形式运行的,后端如果新增加了节点,或者有新的容器产生,会由registrator(放在客户端上,用来自动发现)组件进行自动发现,并且注册到consul server端,consul server主要是读取前端配置文件的模板
  • consul agent结合consul template进行(自动更新)动态添加upstream池(后端新增的容器IP地址),保证前端对后端的动态识别

构建自动发现的Docker服务架构

建立Consul服务

  • 每个提供服务的节点上都要部署和运行Consul的agent

  • Consul agent有两种运行模式

    1. Server
    2. Client
  • Server和Client只是Consul集群层面的区分,与搭建在Cluster之上的应用服务无关

Docker Consul部署

环境配置

  • 服务器A:192.168.215.11 Docker-ce、 Compose 3、Consul、 Consul-template
  • 服务器B:192.168.15.12 Docker-ce、registrator

template 模板(更新)
registrator(自动发现)
后端每构建出一个容器,会向registrator进行注册,控制consul 完成更新操作,consul会触发consul template模板进行个更新
核心机制:consul :自动发现、自动更新,为容器提供服务(添加、删除、生命周期)

Consul服务器

[root@docker1 ~]# mkdir consul/

## 上传软件包
[root@docker1 ~]# ls
anaconda-ks.cfg  compose_nginx  consul  consul_0.9.2_linux_amd64.zip  docker-compose

[root@docker1 ~]# cp consul_0.9.2_linux_amd64.zip consul/
[root@docker1 ~]# cd consul
[root@docker1 consul]# ls
consul_0.9.2_linux_amd64.zip

[root@docker1 consul]# unzip consul_0.9.2_linux_amd64.zip #解压软件包
Archive:  consul_0.9.2_linux_amd64.zip
  inflating: consul 
[root@docker1 consul]# ls
consul  consul_0.9.2_linux_amd64.zip
[root@docker1 consul]# ll /usr/bin/ | grep consul  #查看是否有执行权限
-rwxr-xr-x  1 root root    42777946 8月  10 2017 consul   
[root@docker1 consul]# consul agent \
-server \		#服务端
-bootstrap \	#前端框架
-ui \		#可被访问的web界面
> -bind=192.168.15.11 \
> -client=0.0.0.0  \
> -node=consul-server01 &> /var/log/consul.log &
[1] 29807
[root@docker1 consul]# jobs
[1]+  运行中               consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.15.11 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log &

## 查看集群信息
[root@docker1 consul]# consul members
Node             Address             Status  Type    Build  Protocol  DC
consul-server01  192.168.15.11:8301  alive   server  0.9.2  2         dc1
[root@docker1 consul]# consul info | grep leader
	leader = true
	leader_addr = 192.168.15.11:8300
	

## 通过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 服务信息
[root@consul consul]# curl 127.0.0.1:8500/v1/catalog/nodes  #集群节点详细信息
[{"ID":"3f3860dc-43fb-40bf-50cf-67180ce697af","Node":"consul-server01","Address":"192.168.15.11","Datacenter":"dc1","TaggedAddresses":{"lan":"192.168.15.11","wan":"192.168.15.11"},"Meta":{},"CreateIndex":5,"ModifyIndex":6}]

容器服务自动加入consul集群

安装 Gliderlabs/Registrator Gliderlabs/Registrator
可检查容器运行状态自动注册,还可注销 docker 容器的服务 到服务配置中心。
目前支持 Consul、Etcd 和 SkyDNS2。

在 192.168.215.12 节点,执行以下操作:

[root@docker2 ~]# docker run -d \
> --name=registrator \
> --net=host \
> -v /var/run/docker.sock:/tmp/docker.sock \
> --restart=always \
> gliderlabs/registrator:latest \
> -ip=192.168.15.12 \
> consul://192.168.15.11: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
2c2d8a393c4e74164872cdb59ac2daa6b4904d02e393092e8a1d2d18f9f6ad56
[root@docker2 ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED       SIZE
gliderlabs/registrator   latest    3b59190c6c80   4 years ago   23.8MB
[root@docker2 ~]# docker ps -a 
CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS          PORTS     NAMES
2c2d8a393c4e   gliderlabs/registrator:latest   "/bin/registrator -i…"   34 seconds ago   Up 33 seconds             registrator


##验证是否对接成功
[root@docker1 consul]# netstat -natp | grep 8500
tcp6       0      0 :::8500                 :::*                    LISTEN      29807/consul        
tcp6       0      0 192.168.15.11:8500      192.168.15.12:45706     ESTABLISHED 29807/consul        


##测试服务发现功能是否正常
[root@docker2 ~]# docker run -itd -p:83:80 --name test-01 -h test01 nginx
[root@docker2 ~]# docker run -itd -p:84:80 --name test-02 -h test02 nginx
[root@docker2 ~]# docker run -itd -p:88:80 --name test-03 -h test03 httpd
[root@docker2 ~]# docker run -itd -p:89:80 --name test-04 -h test04 httpd
  • 验证 http 和 nginx 服务是否注册到 consul

    浏览器输入 http://192.168.15.11:8500,“单击 NODES”,然后单击 “consurl-server01”,会出现 5 个服务*

在这里插入图片描述

在consul服务器上查看服务

[root@docker1 consul]# curl 127.0.0.1:8500/v1/catalog/services
{"consul":[],"httpd":[],"nginx":[]}

安装 consul-template

  • Consul-Template 是一个守护进程,用于实时查询 Consul 集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新操作,重新加载 Nginx。
  • Consul-Template 可以查询 Consul 中的服务目录、Key、Key-values 等。
  • 这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。
  • 例如:创建 Apache/Nginx Proxy Balancers、Haproxy Backends

准备 template nginx 模板文件

  • 在consul上操作
[root@docker1 consul]# pwd
/root/consul
[root@docker1 consul]# vim nginx.ctmpl
upstream http_backend {
  {{range service "nginx"}}
   server {{.Address}}:{{.Port}};		#此处引用的变量会指向后端的地址和端口(动态变化)
   {{end}}
}

server {
  listen 83;
  server_name localhost 192.168.15.11;		#反向代理的IP地址
  access_log /var/log/nginx/access.log;
  index index.html index.php;
  location / {
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;		#后端真实IP
    proxy_set_header Client-IP $remote_addr;	
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	#转发地址
    proxy_pass http://http_backend;
  }
}

编译安装nginx

[root@docker1 consul]# cd
[root@docker1 ~]# cd compose_nginx/
[root@docker1 compose_nginx]# cd nginx/
[root@docker1 nginx]# ls
dockerfile  nginx-1.12.2.tar.gz  run.sh
[root@docker1 nginx]# yum install gcc pcre-devel zlib-devel -y
[root@docker1 nginx]# tar zxvf nginx-1.12.2.tar.gz -C /op
[root@docker1 nginx]# cd /opt
[root@docker1 opt]# cd nginx-1.12.2/
[root@docker1 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx
[root@docker1 nginx-1.12.2]# make && make install

配置 nginx

[root@docker1 nginx-1.12.2]# cd /usr/local/nginx/conf/
[root@docker1 conf]# vim nginx.conf
##修改http字段
http { 
    include       mime.types;
    include       vhost/*.conf;   #添加
    default_type  application/octet-stream;
[root@docker1 conf]# mkdir /usr/local/nginx/conf/vhost
[root@docker1 conf]# mkdir /var/log/nginx

配置并启动 template

## 上传 consul-template_0.19.3_linux_amd64.zip 包到/root 目录下
[root@docker1 ~]# ls
anaconda-ks.cfg  consul                        consul-template_0.19.3_linux_amd64.zip
compose_nginx    consul_0.9.2_linux_amd64.zip  docker-compose
[root@docker1 ~]# unzip consul-template_0.19.3_linux_amd64.zip 
Archive:  consul-template_0.19.3_linux_amd64.zip
  inflating: consul-template  
[root@docker1 ~]# ll  #查看是否有执行权限
总用量 30540
-rw-------. 1 root root     1408 3月  10 00:22 anaconda-ks.cfg
drwxr-xr-x  4 root root       56 3月  19 21:11 compose_nginx
drwxr-xr-x  2 root root       88 3月  20 23:30 consul
-rw-r--r--  1 root root 10233177 3月  20 22:26 consul_0.9.2_linux_amd64.zip
-rwxr-xr-x  1 root root  7466016 9月  12 2017 consul-template    #有执行权限
-rw-r--r--  1 root root  2694811 3月  20 23:31 consul-template_0.19.3_linux_amd64.zip
-rw-r--r--  1 root root 10867152 3月  19 19:59 docker-compose
[root@docker1 ~]# mv consul-template /usr/bin/   

##需要启动2次。第一次可能会报错,在启动一次即可
[root@docker1 ~]# consul-template -consul-addr 192.168.15.11:8500 -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info2021/03/20 15:37:33.074636 [INFO] consul-template v0.19.3 (ebf2d3d)
2021/03/20 15:37:33.074648 [INFO] (runner) creating new runner (dry: false, once: false)
2021/03/20 15:37:33.074871 [INFO] (runner) creating watcher
2021/03/20 15:37:33.075050 [INFO] (runner) starting
2021/03/20 15:37:33.075065 [INFO] (runner) initiating run
2021/03/20 15:37:33.076719 [INFO] (runner) initiating run

##另外打开一个终端查看生成配置文件
[root@docker1 ~]# cd /usr/local/nginx/conf/vhost/
[root@docker1 vhost]# ls
conf
[root@docker1 vhost]# cat conf 
upstream http_backend {
  
   server 192.168.15.12:83;		
   
   server 192.168.15.12:84;		
   
}

server {
  listen 83;
  server_name localhost 192.168.15.11;		
  access_log /var/log/nginx/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容器节点

  • 增加一个 nginx 容器节点,测试服务发现及配置更新功能
## 在registrator服务端注册
[root@docker2 ~]# docker run -itd -p:85:80 --name test-05 -h test05 nginx
6bac1d858780381e040dde591e2deb95792ec1b168c32736f5d44437d0d3682d
  • 在填会有提示自动更新

在这里插入图片描述
浏览器输入 http://192.168.15.11:8500,“单击 NODES”,然后单击 “consurl-server01”,会出现多了一个服务
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值