盘Docker吗?Docker consul的容器服务更新与发现

前言

一:Docker consul容器服务更新与发现理论

1.1:什么是consul,有什么作用

consul是HashiCorp公司推出使用go语言编写的开源工具,用于实现分布式系统的服务发现与配置

具有如下特性:

1、consul支持健康检查,允许存储键值对

2、一致性协议采用Raft算法,用来保证服务的高可用

3、成员管理和消息广播采用GOSSIP协议,支持ACL访问控制

4、方便部署,与Docker等轻量级容器可无缝配合

1.2:基于nginx和consul构建高可用及自动发现的Docker服务架构

  • mark

  • 上方拓扑图是基于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.233.132 Docker-ce、Consul
    nginx服务器 192.168.233.133 Docker-ce、registrator
  • 1、两个节点都安装Docker-ce,注意防火墙不要关闭,如有疑问可以参阅我之前的Docker部署的博客,这里不再赘述

    https://blog.csdn.net/CN_TangZheng/article/details/105452665

  • 2、在主节点上部署consul

    [root@localhost ~]# mkdir /consul
    [root@localhost ~]# cd /consul/
    [root@localhost consul]# rz -E	'//上传压缩包'
    rz waiting to receive.
    [root@localhost 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@localhost consul]# consul agent \	'//设置代理'
    > -server \	'//服务功能'
    > -bootstrap \	'//参与选举'
    > -ui \	'//提供web界面'
    > -data-dir=/var/lib/consul-data \	'//提供一个代理存储数据目录'
    > -bind=192.168.233.132 \	'//绑定本地地址'
    > -client=0.0.0.0 \	'//面对的客户端地址'
    > -node=consul-server01 &> /var/log/consul.log&	' //定义节点名称,日志混合输出到log,并且放到后台运行'
    [1] 2173
    [root@localhost consul]# jobs
    [1]+  运行中               consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.233.132 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log &
    [root@localhost consul]# consul members	'//查看集群信息'
    Node             Address               Status  Type    Build  Protocol  DC
    consul-server01  192.168.233.132:8301  alive   server  0.9.2  2         dc1
    [root@localhost consul]# consul info |grep leader	'//查看管理信息'
    	leader = true
    	leader_addr = 192.168.233.132:8300
    
    
  • 通过HTTP api获取集群信息

    curl 127.0.0.1:8500/v1/status/peers '/查看集群server成员'
    
    curl 127.0.0.1:8500/v1/status/leaders '//查看集群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   '//集群节点详细信息'
    
  • nginx服务器上连接consul,创建nginx容器服务

    [root@localhost ~]# docker run -d \
    > --name=registrator \        '//定义容器名称'
    > --net=host \                '定义网络'
    > -v /var/run/docker.sock:/tmp/docker.sock \       '指定数据卷,存储信息' 
    > --restart=always \    
    > gliderlabs/registrator:latest \                '定义镜像'
    > -ip=192.168.233.133 \                           '指定本地地址'
    > consul://192.168.233.132:8500                   '指定consul管理节点地址、端口'
    [root@localhost ~]# docker ps -a
    CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                          PORTS               NAMES
    703ee87d399d        gliderlabs/registrator:latest   "/bin/registrator -i…"   2 minutes ago       Restarting (1) 31 seconds ago                       registrator
    [root@localhost ~]# docker run -itd -p 83:80 --name test -h test nginx		'//创建容器,用来测试服务发现功能是否正常'
    [root@localhost ~]# docker run -itd -p 84:80 --name test-02 -h test02 nginx
    [root@localhost ~]# docker run -itd -p 85:80 --name test-03 -h test03 httpd
    [root@localhost ~]# docker run -itd -p 86:80 --name test-04 -h test04 httpd
    [root@localhost ~]# docker ps -a
    CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                         PORTS                NAMES
    eb5045196611        httpd                           "httpd-foreground"       7 seconds ago       Up 7 seconds                   0.0.0.0:86->80/tcp   test-04
    03473a1137bd        httpd                           "httpd-foreground"       10 seconds ago      Up 9 seconds                   0.0.0.0:85->80/tcp   test-03
    2e2cee1e6494        nginx                           "nginx -g 'daemon of…"   39 seconds ago      Up 38 seconds                  0.0.0.0:84->80/tcp   test-02
    87a47780cfd1        nginx                           "nginx -g 'daemon of…"   12 minutes ago      Up 12 minutes                  0.0.0.0:83->80/tcp   test-01
    [root@localhost consul]# firewall-cmd --get-active-zones
    public
      interfaces: ens33
    [root@localhost consul]# firewall-cmd --zone=public --add-port=8500/tcp	'//设置防火墙规则或者关闭防火墙'
    success
    
    
  • 浏览器测试:192.168.233.132:8500

    mark

  • 查看日志

    [root@localhost ~]# docker logs -f test-01
    192.168.233.1 - - [27/Apr/2020:02:43:43 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36" "-"	'//发现访问IP是物理网卡的网关'
    [root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/services
    {"consul":[],"httpd":[],"nginx":[]}	'//再次查看祖册的所有服务'
    
    

1.4:consul集群添加compose-template,实现容器自动加入Nginx集群

  • compose-template介绍

    compose-template是一个守护进程,用于实时查询consul集群信息
    并且运维人员可以在consul服务器上,定制任意的模板,生成配置文件
    compose可以查询consul中的服务目录、key、key-values等
    这种强大的抽象功能和查询语言模板使得consul-template特别适合动态的创建配置文件,也就是自动化增加服务

    例如:创建apache/nginx proxy balacers、haproxy backends

  • 1、主节点安装consul-template,准备模板文件

    [root@localhost consul]# rz -E	'//上传consul-template软件包'
    rz waiting to receive.
    [root@localhost consul]# ls
    consul-template_0.19.3_linux_amd64.zip
    [root@localhost 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
    
  • 2、主节点编写template nginx模板文件

    此模板用于nginx反向代理模板

    nginx.ctmpl跟nginx没有直接关系,

    consul是docker的一种自动管理机制

    nginx.ctmpl中的参数以变量的形式写入

    [root@localhost consul]# mkdir /var/log/nginx
    [root@localhost consul]# vim nginx.ctmpl
    upstream http_backend {
       {{range service "nginx"}}
        server {{.Address}}:{{.Port}};
         {{end}}
    }
    
    server {
      listen 88;
      server_name localhost 192.168.233.132;
      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;
      }
    }
    
    
  • 2、主节点编译安装nginx

    [root@localhost consul]# yum install gcc gcc-c++ make expat* pcre* perl* zlib* -y	'//安装环境报'
    [root@localhost consul]# rz -E	'//上传源码包并编译'
    rz waiting to receive.
    [root@localhost consul]# ls
    consul-template_0.19.3_linux_amd64.zip  nginx-1.12.2.tar.gz  nginx.ctmpl
    [root@localhost consul]# tar zxf nginx-1.12.2.tar.gz 
    [root@localhost consul]# ls
    consul-template_0.19.3_linux_amd64.zip  nginx-1.12.2  nginx-1.12.2.tar.gz  nginx.ctmpl
    [root@localhost consul]# cd nginx-1.12.2
    [root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx
    [root@localhost nginx-1.12.2]# make && make install 
    [root@localhost nginx-1.12.2]# mkdir /usr/local/nginx/conf/vhost/	'//创建虚拟主机目录'
    [root@localhost nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf	'//编辑配置文件,添加目录'
    
    #user  nobody;
    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        include vhost/*.conf;	'//添加路径'
        default_type  application/octet-stream;
        ...省略内容
    [root@localhost nginx-1.12.2]# /usr/local/nginx/sbin/nginx	'/启动nginx'
    [root@localhost nginx-1.12.2]# netstat -natp |  grep nginx
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5819/nginx: master  
    [root@localhost nginx-1.12.2]# firewall-cmd --zone=public --add-port=80/tcp	'//防火墙规则设置80端口'
    
    
  • 3、启动template,指定template模板文件及生成路径

    [root@localhost consul]# consul-template -consul-addr 192.168.233.132:8500 \
    > -template "/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/tang.conf:/usr/local/nginx/sbin/nginx -s reload" \
    > --log-level=info	'//指定模板路径,/consul/nginx.ctmpl,生成到/usr/locla/nginx/conf/vhost/tang.conf,然后重载nginx -s reload'
    接下来会进入监控状态
    
  • 4、主节点重新打开终端查看产生的配置文件

    [root@localhost ~]# vim /usr/local/nginx/conf/vhost/tang.conf 
    upstream http_backend {
    
        server 192.168.247.133:83;	'//能够通过consul自动发现nginx服务器的IP地址与端口'
    
        server 192.168.247.133:84;
    
    }
    
    server {
      listen 88;
      server_name localhost 192.168.233.132;
      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;
      }
    }
    
    
  • 5、客户端浏览器测试,结合nginx服务器日志验证

    [root@localhost ~]# docker logs -f test-01	'//nginx服务器动态查看test-01日志'
    [root@localhost ~]# docker logs -f test-02	'//重新打开终端,动态查看test-02日志'
    [root@localhost ~]# firewall-cmd --zone=public --add-port=88/tcp	'//主节点设置防火墙规则,放通88端口'
    success
    
    
  • 浏览器使用192.168.233.132:88访问,查看日志会发现是轮询出现的

  • 测试consul-template自动在线更新

    [root@localhost ~]# docker run -itd --name test-06 -p 89:80 -h test06 nginx
    136853509dee16aeda4afe1b2d5bd5277341ef8157d6976745188005c69cb5c7	'//nginx服务器添加一个容器'
    [root@localhost consul]# cat /usr/local/nginx/conf/vhost/tang.conf 
    upstream http_backend {
       
        server 192.168.247.133:83;
         
        server 192.168.247.133:84;
         
        server 192.168.247.133:89;	'//已经自动更新'
         
    }
    
    server {
      listen 88;
      server_name localhost 192.168.233.132;
      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;
      }
    }
    
    

谢谢赏阅!如有疑问,可评论区交流!

原创文章 172 获赞 97 访问量 5万+

猜你喜欢

转载自blog.csdn.net/CN_TangZheng/article/details/105788207