Docker----consul&compose-template&Nginx反向代理

一.consul概述

1.1: consul简介

  • consul是HashCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案相比,consul的方案是“一站式”,内置了服务注册与发现框架、分布式一致性协议实现、健康检查、K-V存储、多数据中心方案,不需要依赖其他工具(比如ZooKeeper等)。

  • consul使用go语言编写,因此具有天然的可移植性(支持Linux、windows和Mac OS X等系统);安装包仅仅包含一个二进制的可执行文件,方便部署,与Docker等轻量级容器可以无缝连接。

  • 官网地址: https://www.consul.io/downloads.html

  • mark

consul特性

  • 基础特性:服务注册与发现、数据强一致性保证、多数据中心、健康检查、Key/Value存储

  • 高级特性:HTTP API、ACL(对后端服务的访问控制权限可以设置)

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

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

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

  • 方便部署,与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.100.200Docker-ce、Consul,Compose,Consul-template
    nginx服务器192.168.100.190Docker-ce、registrator
  • 两个节点都安装Docker-ce,注意防火墙不要关闭,如有疑问可以参阅我之前的Docker部署的博客,这里不再赘述

  • 具体部署流程
  • 在两台pc上安装docker-ce

    1.##安装依赖包
    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服务器上部署compose consul

    2.部署consul
    上传docker-compose和consul_0.9.2_linux_amd64.zip
    cp -p docker-compose /usr/local/bin				'//上传压缩包'
    mkdir /root/consul
    cp consul_0.9.2_linux_amd64.zip /root/consul
    cd /root/consul
    unzip consul_0.9.2_linux_amd64.zip
    mv consul /usr/bin
    
    consul agent \	'//设置代理'
    -server \		'//服务功能'
    -bootstrap \	'//参与选举'
    -ui \			'//提供web界面'
    -data-dir=/var/lib/consul-data \	'//提供一个代理存储数据目录'
    -bind=192.168.100.200 \				'//绑定consul本地地址'
    -client=0.0.0.0 \					'//面对的客户端地址
    -node=consul-server01 &> /var/log/consul.log &		' //定义节点名称,日志混合输出到log,并且放到后台运行'
    
    //查看群集状态
    consul members			'//查看集群信息'
    consul info | grep leader
    //通过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/catlog/nginx  "查看nginx服务信息"
    
  • Web容器服务通过registrator自动加入群集

    0.docker-ce环境
    1.web节点安装registrator
    docker run -d \
    --name=registrator \	'//定义容器名称'
    --net=host \			'定义网络'
    -v /var/run/docker.sock:/tmp/docker.sock \		'指定数据卷,存储信息' 
    --restart=always \								'群集宕机,一直重启'
    gliderlabs/registrator:latest \					'定义镜像'
    -ip=192.168.100.190 \			"指的是web节点服务器地址"
    consul://192.168.100.200:8500	"指的是consul服务器地址、端口"
    
    //浏览器访问 
    192.168.100.200:8500
    2.测试服务发现功能是否正常
    
    docker run -itd -p:83:80 --name test-01 -h test01 nginx			'//创建容器,用来测试服务发现功能是否正常'
    docker run -itd -p:84:80 --name test-02 -h test02 nginx
    docker run -itd -p:88:80 --name test-03 -h test03 httpd
    docker run -itd -p:89:80 --name test-04 -h test04 httpd
    #这个可以不设
    [root@localhost consul]# firewall-cmd --get-active-zones
    public
      interfaces: ens33
    [root@localhost consul]# firewall-cmd --zone=public --add-port=8500/tcp	'//设置防火墙规则或者关闭防火墙'
    success
    3. 验证httpd 和nginx 服务器是否注册到consul
    输入 http://192.168.100.200:9500 点击nodes  点击 consul-server01 会出现5个服务
    //在consul服务器上查看服务
    [root@docker01 ~]# curl 127.0.0.1:8500/v1/catalog/services
    {"consul":[],"httpd":[],"nginx":[]}[root@docker01 ~]# 
    

    mark

    mark

  • consul节点准备template nginx 模板文件

    compose-template介绍

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

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

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

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

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

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

    4.consul服务器安装consul-template
    
    unzip consul-template_0.19.3_linux_amd64.zip 
    cp consul-template /usr/local/bin
    
    5.准备template nginx 模板文件
    //在consul上操作
    vim /root/consul/nginx.ctmpl
    upstream http_backend {
       {{range service "nginx"}}
        server {{.Address}}:{{.Port}};
         {{end}}
    }
    
    server {
      listen 83;
      server_name localhost 192.168.100.200;
      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;
      }
    }
    
    
  • consul 服务端安装nginx

    6. 编译安装nginx
    yum install gcc pcre-devel zlib-devel -y
    tar zxvf nginx-1.12.0.tar.gz -C /opt
    [root@docker01 consul]# cd /opt
    [root@docker01 opt]# ls
    containerd  nginx-1.12.0  rh
    [root@docker01 opt]# cd nginx-1.12.0/
    [root@docker01 nginx-1.12.0]# ls
    auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src
    [root@docker01 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx
    [root@docker01 nginx-1.12.0]# make && make install
    
  • consul服务端修改nginx的配置文件并启动

    7. 配置nginx
    
    [root@docker01 nginx-1.12.0]# vim /usr/local/nginx/conf/nginx.conf
    http {
        include       mime.types;
        include vhost/*.conf;					"添加子配置文件"
        default_type  application/octet-stream;
    	......
    }
    //创建虚拟主机目录
    [root@docker01 nginx-1.12.0]# mkdir /usr/local/nginx/conf/vhost
    //创建日志文件目录
    [root@docker01 nginx-1.12.0]# mkdir /var/log/nginx
    //启动nginx
    [root@docker01 nginx-1.12.0]# /usr/local/nginx/sbin/nginx 
    
    
  • consul服务端配置并启动template

    8.//上传consul-template_0.19.3_linux_amd64.zip
    root@docker01 /]# cp consul-template_0.19.3_linux_amd64.zip /root
     
    [root@docker01 /]# unzip consul-template_0.19.3_linux_amd64.zip
    [root@docker01 /]# mv consul-template /usr/bin/
    [root@docker01 /]# consul-template -consul-addr 192.168.100.200:8500 \
    -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/tang.conf:/usr/local/nginx/sbin/nginx -s reload" \
    --log-level=info				"启动并利用模板生成nginx的子配置文件"
    '//指定模板路径,/consul/nginx.ctmpl,生成到/usr/locla/nginx/conf/vhost/tang.conf,然后重载nginx -s reload'
    接下来会进入监控状态
    [root@docker01 ~]# netstat -ntap |grep 83
    tcp        0      0 0.0.0.0:83              0.0.0.0:*               LISTEN      94743/nginx
    //另外打开一个终端查看生成配置文件
    [root@docker01 vhost]# vim tang.conf 
    
    upstream http_backend {
    
        server 192.168.100.190:83;	'//能够通过consul自动发现nginx服务器的IP地址与端口'
    
        server 192.168.100.190:84;
    
    }
    
    server {
      listen 83;
      server_name localhost 192.168.100.200;
      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;
      }
    }
    

    mark

  • web端增加nginx容器节点

    9. 增加一个nginx容器节点,测试服务发现及配置更新功能
    //在registrator 服务端添加容器,注册
    docker run -itd -p:85:80 --name test-05 -h test05 nginx
    //在consul服务端监控会有自动更新
    2020/09/23 10:36:54.609791 [INFO] (runner) initiating run
    2020/09/23 10:36:54.611630 [INFO] (runner) rendered "/root/consul/nginx.ctmpl" => "/usr/local/nginx/conf/vhost/tang.conf"
    2020/09/23 10:36:54.611654 [INFO] (runner) executing command "/usr/local/nginx/sbin/nginx -s reload" from "/root/consul/nginx.ctmpl" => "/usr/local/nginx/conf/vhost/tang.conf"
    2020/09/23 10:36:54.611685 [INFO] (child) spawning: /usr/local/nginx/sbin/nginx -s reload
    
    //查看三台Nginx 日志,请求正常轮询到各个容器节点
    docker logs -f test-01		'//nginx服务器动态查看test-01日志'
    docker logs -f test-02
    docker logs -f test-05
    
     
    [root@docker01 vhost]# cat  tang.conf   //查看自动生成的子配置文件
    
    upstream http_backend {
    
        server 192.168.100.190:83;	"反向代理后端节点"
    
        server 192.168.100.190:84;
    
        server 192.168.100.190:85;	'//已经自动更新'
    
    }
    
    server {
      listen 83;
      server_name localhost 192.168.100.200;	"nginx反向代理服务器地址"
      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_pass http://http_backend;
      }
    }
    
    

    mark

1.4: 拓展基于两个upstream轮询nginx和httpd

  • [root@docker vhost]# vim /root/consul/nginx.ctmpl 
    
    upstream http_backend {
       {{range service "nginx"}}
        server {{.Address}}:{{.Port}};
         {{end}}
    }
    
    upstream http_httpd {
       {{range service "httpd"}}
        server {{.Address}}:{{.Port}};
         {{end}}
    }
    server {
      listen 1111;
      server_name localhost 192.168.100.200;
      access_log /var/log/nginx/cllt.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;
      }
    }
    server {
      listen 2222;
      server_name localhost 192.168.100.200;
      access_log /var/log/httpd/cllt.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_httpd;
      }
    }
    
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值