• Docker+Consul+Registrator 实现服务注册与发现


    Docker+Consul+Registrator实现服务注册与发现

    逻辑图 实现nginx节点自动化加入容器IP代理

    1、三台Consul agent server作为高可用通过Consul Template实时监测Leader的变化。

    2、Leader如果变化就触发渲染模板动作,执行相应命令。

    3、如图 如果Node01 docker创建了一个nginx web容器随机暴露了一个24123端口,Registrator会监听到这个事件之后,会将宿主级IP与暴露的端口注册到本地的Consul agent client。

    4、Consul agent Clinet 再将这个请求转发到 Consul agent service中。


    环境说明

    • Linux系统版本:Linux Centos 7.4 x64
    • Consul应用版本:consul_1.4.0
    • Template应用版本:consul-template_0.19.3
    • Docker应用版本:18.09.0
    • Consul管理节点:192.168.1.79
    • Docker工作节点:192.168.1.78
    • Docker工作节点:192.168.1.77

    1、管理节点安装 Consul 服务端

    1.1、下载解压安装包Consul

    • Consul下载地址:https://pan.baidu.com/s/13fFhJwj6TxXkAB0tOLo8Sg
    • 密码:hjub
    # 解压出一个二进制包
    unzip unzip consul_1.4.0_linux_amd64.zip
    # 移动到bin目录下
    mv consul /usr/bin

    1.2、server模式初始化集群

    consul agent 
    -server 
    -bootstrap 
    -ui 
    -data-dir=/var/lib/consul-data 
    -bind=192.168.1.79 
    -client=0.0.0.0 
    -node=test
    # 使用命令
    consul agent 
    # 设置server模式
    -server 
    # 自选举为自己Leader
    -bootstrap 
    # 启用内置web页面
    -ui 
    # 集群数据保存位置
    -data-dir=/var/lib/consul-data 
    # 集群之间通讯绑定地址
    -bind=192.168.1.79 
    # 客户端访问地址
    -client=0.0.0.0 
    # 指定管理节点名称默认主机名,必须是唯一的
    -node=test
    命令注解
    ==> Consul agent running!
               # 软件版本1.4
               Version: 'v1.4.0'
               Node ID: '0f09693a-f66e-08f2-6199-0523c27d010d'
             # node节点为test
             Node name: 'test'
            # 数据中心默认名称dc1
            Datacenter: 'dc1' (Segment: '<all>')
                Server: true (Bootstrap: true)
           # client可访问IP地址
           Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
          # 集群IP地址,设置为管理节点地址
          Cluster Addr: 192.168.1.79 (LAN: 8301, WAN: 8302)
               Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false
    输出详解

    1.3、查看管理节点Consul启动信息

    命令:netstat -antp | grep consul
    
    # 集群节点
    tcp        0      0 192.168.1.79:8300       0.0.0.0:*               LISTEN      68220/consul        
    # 集群内部访问
    tcp        0      0 192.168.1.79:8301       0.0.0.0:*               LISTEN      68220/consul        
    # 夸数据中心访问
    tcp        0      0 192.168.1.79:8302       0.0.0.0:*               LISTEN      68220/consul        
    tcp        0      1 192.168.1.79:52742      192.168.1.78:8301       SYN_SENT    68220/consul        
    tcp        0      0 192.168.1.79:8300       192.168.1.79:55923      ESTABLISHED 68220/consul        
    tcp        0      0 192.168.1.79:55923      192.168.1.79:8300       ESTABLISHED 68220/consul        
    tcp        0      0 192.168.1.79:8300       192.168.1.77:44698      ESTABLISHED 68220/consul        
    # HTTP
    tcp6       0      0 :::8500                 :::*                    LISTEN      68220/consul        
    # DNS
    tcp6       0      0 :::8600                 :::*                    LISTEN      68220/consul        
    查看管理节点启用端口
    命令:consul info
    
    agent:
        check_monitors = 0
        check_ttls = 0
        checks = 0
        services = 0
    build:
        prerelease = 
        revision = 0bddfa23
        version = 1.4.0
    consul:
        acl = disabled
        bootstrap = true
        known_datacenters = 1
        leader = true
            # leader地址
        leader_addr = 192.168.1.79:8300
        server = true
    # 保持选举一致性算法
    raft:
        applied_index = 22
        commit_index = 22
        fsm_pending = 0
        last_contact = 0
        last_log_index = 22
        last_log_term = 2
        last_snapshot_index = 0
        last_snapshot_term = 0
        latest_configuration = [{Suffrage:Voter ID:0f09693a-f66e-08f2-6199-0523c27d010d Address:192.168.1.79:8300}]
        latest_configuration_index = 1
        num_peers = 0
        protocol_version = 3
        protocol_version_max = 3
        protocol_version_min = 0
        snapshot_version_max = 1
        snapshot_version_min = 0
        state = Leader
        term = 2
    runtime:
        arch = amd64
        cpu_count = 2
        goroutines = 81
        max_procs = 2
        os = linux
        version = go1.11.1
    serf_lan:
        coordinate_resets = 0
        encrypted = false
        event_queue = 1
        event_time = 2
        failed = 0
        health_score = 0
        intent_queue = 0
        left = 0
        member_time = 1
        members = 1
        query_queue = 0
        query_time = 1
    serf_wan:
        coordinate_resets = 0
        encrypted = false
        event_queue = 0
        event_time = 1
        failed = 0
        health_score = 0
        intent_queue = 0
        left = 0
        member_time = 1
        members = 1
        query_queue = 0
        query_time = 1
    查看consul信息
    命令:consul members
    
    Node  Address            Status  Type    Build  Protocol  DC   Segment
    test  192.168.1.79:8301  alive   server  1.4.0  2         dc1  <all>
    查看集群成员
    查看leaderIP地址
    consul catalog services
    查看注册服务
    curl 127.0.0.1:8500/v1/status/peers # 集群server成员
    curl 127.0.0.1:8500/v1/status/leader # 集群Raft leader
    curl 127.0.0.1:8500/v1/catalog/services # 注册的所有服务
    curl 127.0.0.1:8500/v1/catalog/services/nginx # 服务信息
    curl 127.0.0.1:8500/v1/catalog/nodes # 集群节点详细信息
    通过HTTP API获取集群信息
    类型        描述
    kv         键值存储
    agent     agent管理
    catalog     nodes和services管理
    health     健康检查
    session     session管理
    acl         ACL管理
    event     用户事件
    status     Consul系统状态
    Consul API管理 

    2、工作节点安装Consul 客户端

    2.1、下载解压安装包到本地

    # 解压出一个二进制包
    unzip unzip consul_1.4.0_linux_amd64.zip
    # 移动到bin目录下
    mv consul /usr/bin

    2.2、client模式加入集群

    工作节点1

    docker run -d 
    --name=consul 
    -p 8301:8301 
    -p 8301:8301/udp 
    -p 8500:8500 
    -p 8600:8600 
    -p 8600:8600/udp 
    --restart=always 
    progrium/consul 
    -join 192.168.1.79 -advertise 192.168.1.77 -client 0.0.0.0 -node=node01

     工作节点2

    docker run -d 
    --name=consul 
    -p 8301:8301 
    -p 8301:8301/udp 
    -p 8500:8500 
    -p 8600:8600 
    -p 8600:8600/udp 
    --restart=always 
    progrium/consul 
    -join 192.168.1.79 -advertise 192.168.1.78 -client 0.0.0.0 -node=node02
    # 运行
    docker run -d 
    # 指定名称
    --name=consul 
    # 指定暴露端口
    -p 8301:8301 
    -p 8301:8301/udp 
    # 提供HTTP服务端口
    -p 8500:8500 
    # 提供DNS服务端口
    -p 8600:8600 
    -p 8600:8600/udp 
    # 设置重启策略
    --restart=always 
    # 指定镜像
    progrium/consul 
    # 加入现有集群IP
    -join 192.168.1.79 
    # 通告地址,本机地址
    -advertise 192.168.1.77 
    # 通过那里连接本地
    -client 0.0.0.0
    # 指定管理节点名称默认主机名,必须是唯一的
    -node=node01
    命令注解

    2.3、查看工作节点consul启动情况

    命令:docker ps
    
    CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                                                                                                                                                                            NAMES
    7c82880b3685        progrium/consul                  "/bin/start -join 19…"   3 minutes ago       Up 9 seconds        53/tcp, 8300/tcp, 53/udp, 8302/tcp, 0.0.0.0:8301->8301/tcp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8301->8301/udp, 8400/tcp, 8302/udp, 0.0.0.0:8600->8600/tcp, 0.0.0.0:8600->8600/udp   consul
    查看启动情况
    命令:consul members
    
    Node    Address            Status  Type    Build  Protocol  DC   Segment
    test    192.168.1.79:8301  alive   server  1.4.0  2         dc1  <all>
    node01  192.168.1.77:8301  alive   client  0.5.2  2         dc1  <default>
    node02  192.168.1.78:8301  failed  client  0.5.2  2         dc1  <default>
    管理端测试

    注:关闭防火墙拦截。

    2.4、管理节点:web页面测试查看

    http://192.168.1.79:8500/ui/dc1/services

    查看节点

    3、管理节点:注册使用

    3.1、注册服务

    # 案例:
    curl -X PUT -d 
    '{"id": "jetty","name": "service_name","address": "192.168.1.77","port": 8080,"tags": ["test"],"checks": 
    [{"http": "http://192.168.1.77:8080/","interval": "5s"}]}' 
    http://127.0.0.1:8500/v1/agent/service/register 

    3.2、查看注册服务

    4、管理节点工作节点安装Dokcer

    5、工作节点:安装Registrator与template

    5.1、Registrator简介

    consul-template:一个守护程序,用于实时查询consul集群数据,并更新文件系统上的任意数量的指定模板,生成配置文件,更新完成后可以选择运行任何命令。

    gliderlabs/registrator:检查容器运行状态自动注册到服务中心。registrator支持服务注册有consul、etcd、SkyDNS2。

    5.2、工作节点1节点2:下载解压部署

    • Template下载地址:https://pan.baidu.com/s/1N9U89ClxY-fpTfxiP8l3Tw
    • 密码:wso1
    # 解压文件
    unzip consul-template_0.19.3_linux_amd64.zip
    # 移动文件到bin目录下
    mv consul-template /usr/bin/

    5.3、工作节点1节点2:创建registrator项目

    docker run -d 
    --name=registrator 
    -v /var/run/docker.sock:/tmp/docker.sock 
    --restart=always 
    gliderlabs/registrator:latest 
    consul://192.168.1.77:8500
    # docker run -d 
    # 指定容器名称
    --name=registrator 
    #  给容器挂载存储卷,挂载到容器的某个目录   
    -v /var/run/docker.sock:/tmp/docker.sock 
    # 添加重启策略
    --restart=always 
    # 指定镜像
    gliderlabs/registrator:latest 
    # 指定docker本地IP,连接注册到consul client。
    consul://192.168.1.77:8500
    
    注:它可以将之前创建的容器注册。
    命令注解

    5.4、浏览器查看注册情况

    6、实现Nginx集群节点自动加入

    6.1、工作节点1节点2:启动nginx容器

    docker run -d -P nginx

    6.2、工作节点1节点2:浏览器查看服务

    前提:管理节点(推荐)环境安装好nginx服务设置代理

    6.3、管理节点:创建nginx代理模板

    vi nginx.ctmpl

    upstream http_backend {
        ip_hash;
        # nginx 为服务名称
        {{range service "nginx"}}
        # 服务名 服务IP:端口号
        server {{ .Address }}:{{ .Port }};
        # 结束
        {{ end }}
    }
    server { 
        listen 80;
        server_name localhost;
        location / {
        proxy_pass http://http_backend;
        }
    }

    6.4、管理节点:配置template自动部署

    consul-template 
    -consul-addr 192.168.1.79:8500 
    -template "./nginx.ctmpl:/etc/nginx/conf.d/default2.conf:/usr/sbin/nginx -s reload" 
    -log-level=info
    # 使用template命令
     consul-template 
    # 指定consul server地址
    -consul-addr 192.168.1.79:8500 
    # 指定 新配置文件:生成配置文件:重载配置文件
    -template "./nginx.ctmpl:/etc/nginx/conf.d/default2.conf:/usr/sbin/nginx -s reload" 
    # 指定日志级别
    -log-level=info
    命令详解

    6.5、管理节点:测试查看生成结果

    命令: cat default2.conf 
    
    upstream http_backend {
        ip_hash;
    
        server 192.168.1.77:32768;
    
        server 192.168.1.77:32769;
    
        server 192.168.1.78:32788;
    }
    
    server { 
        listen 80;
        server_name localhost;
        location / {
        proxy_pass http://http_backend;
        }
    }

    6.6、测试添加了多台Nginx容器后输出,验证自动发现

    查看Nginx配置文件

    cat default2.conf 
    upstream http_backend {
        ip_hash;
        
        server 192.168.1.77:32772;
        
        server 192.168.1.77:32768;
        
        server 192.168.1.77:32771;
        
        server 192.168.1.77:32773;
        
        server 192.168.1.77:32770;
        
        server 192.168.1.77:32769;
        
        server 192.168.1.78:32789;
        
        server 192.168.1.78:32791;
        
        server 192.168.1.78:32788;
        
        server 192.168.1.78:32790;
        
    }
    
    server { 
        listen 80;
        server_name localhost;
        location / {
        proxy_pass http://http_backend;
        }
    }
    注:删除添加docker容器都执行动作。
  • 相关阅读:
    原理Lambda表达式
    关于Web.config的debug和release.config文件
    利用GeoIP数据库及API进行地理定位查询 Java
    JSONP跨域的原理解析
    如何处理JSON中的特殊字符
    IIS下防止mdb数据库被下载的实现方法
    点击文字选中radio
    关于微信40029错误
    nopcommerce的WidgetZones
    js判断移动终端(手机浏览器)
  • 原文地址:https://www.cnblogs.com/xiangsikai/p/10058541.html
Copyright © 2020-2023  润新知