zoukankan      html  css  js  c++  java
  • Docker部署Consul集群

    服务介绍

        Consul是一种分布式、高可用、支持水平扩展的服务注册与发现工具。包含的特性有:服务发现、健康检查、键值存储、多数据中心和服务管理页面等。

        官方架构设计图:

        

        图中包含两个Consul数据中心(即两个Consul集群)。数据中心1由多个SERVER和CLIENT组成,数据中心2由多个CLIENT组成。对于Consul集群而言,SERVER或CLIENT都是集群的一个节点,服务可注册到任意节点上,从而实现注册信息共享。

        # CLIENT

        表示consul的client模式,所有注册到当前节点的服务会被转发到SERVER,本身不持久化数据。其职责是健康检查、服务注册等,当服务数量特别庞大时,分别启动多个client可减少server压力。

        # SERVER

        表示consul的server模式,功能和CLIENT都一样,区别是它能把所有信息持久化到本地,遇到故障时,信息是可以被保留的。

        # LEADER

        图中中间SERVER带有LEADER标识,说明在多个SERVER中,其为老大。它负责各个节点的健康检查和同步注册信息给其他SERVER。

    官方文档:https://www.consul.io/intro/index.html

    部署操作

    配置参数

    -bootstrap-expect

        --配置数据中心中预期的SERVER的数量,当集群中启动的SERVER达到预期值时,Consul开始引导集群;

    -bind

        --内部集群通信绑定的地址,默认情况下是"0.0.0.0";

    -client

        --consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0;

    -config-file

        --服务启动时要加载的配置文件;

    -config-dir

        --配置文件目录;

    -config-format

        --指定要加载的配置文件的格式;

    -data-dir

        --数据目录;

    -dev

        --启用开发服务器模式。对于在关闭所有持久性选项的情况下快速启动consul代理非常有用,不适合生产使用,因为它不将任何数据写入磁盘;

    -join

        --启动时要加入到的另一位代理地址;

    -retry-join

        --加入失败后重试连接,对于明确可用地址的情况下很有用;

    更多详细参数见: https://www.consul.io/docs/agent/options.html

    实验环境

        笔者在做此实验之前,也查找了许多资料及部署方式,网上很多资源都是在物理机上常规(非docker方式)部署consul集群或者一台服务器上部署整个consul集群。而在生产环境中,出于数据安全及冗余等问题,将consul集群采用docker方式分布式部署在多台服务器上,方案尤佳,此实验将采用此方式操作!

        此实验前提条件是所有服务器都有可用的DOCKER运行环境!官方概述说SERVER节点最好是3~5个,此实验将部署3个server(因server和client的区别就在于数据的持久化差异,同时又涉及到集群故障处理等操作实现,又因资源因素,此实验不部署client),规划如下:

        192.168.10.11 SERVER1,选为LEADER

        192.168.10.12 SERVER2

        192.168.10.13 SERVER3

        192.168.10.14 REGISTRY

    操作步骤

    --net=host

        --将容器需要映射的端口全部映射到物理机上,并且端口保持不变;

    # SERVER1上操作

    [root@11 ~]# docker run -d --name=consul --net=host -e CONSUL_BIND_INTERFACE=eth0 consul agent -server=true -client=0.0.0.0 -bind=192.168.10.11 -ui -bootstrap-expect=2

    # 参数说明

    1、eth0代表服务器卡网,也可能是ens33,ens160等,根据服务器信息传入相应参数即可;

    2、通过bind本机ip,改变了consul服务对外的ip地址,默认是172.17.0.2;查看命令是 docker inspect --format '{{ .NetworkSettings.IPAddress }}' consul1 ,consul1是对应的容器名称;

    3、当需要指定配置文件和数据目录时,可用如下命令启动:

    docker run -d --name=consul1 -v /consulconfig:/config/file -config-dir=/config/file -date-dir=/tmp/consul --net=host -e CONSUL_BIND_INTERFACE=eth0 consul agent -server=true -client=0.0.0.0 -bind=192.168.10.11 -ui -bootstrap-expect=2

    # 查看日志

    # 此时集群consul服务未达到预期的数量,会出现报错(继续完成其他节点的部署将解决),如下:

    [root@11 ~]# docker logs -f consul

    # SERVER2、SERVER3上分别操作

    # docker run -d --name=consul --net=host -e CONSUL_BIND_INTERFACE=eth0 consul agent -server -client=0.0.0.0 -ui -bootstrap-expect=2 -retry-join=192.168.10.11

    # 此时登陆管理页面,可查看到如下效果

    # CLINET上操作(普及client部署命令,此实验未有此步骤,可忽略!)

    [root@13 ~]# docker run -d --name=consul3 --net=host -e CONSUL_BIND_INTERFACE=eth0 consul agent -client=0.0.0.0 -retry-join=192.168.10.11

    # 查看集群成员

    docker exec -t consul consul members # 第一个consul为容器名称;

    # 查看投票状态

    docker exec -t consul consul operator raft list-peers

    官方文档:https://hub.docker.com/_/consul

    服务注册

        将容器中运行的服务注册到Consul中,可以通过调用API和其他软件进行操作,此处将介绍开源软件Registrator对服务进行注册操作。

    # 重点申明

        当服务器上的docker容器通过--net=host方式映射端口时,容器信息无法自动注册到consul中,故请通过-p参数实现端口映射!

    # REGISTRY服务器上操作

    # 启动Registrator

    docker run -d

    --name=registrator

    --net=host

    -v /var/run/docker.sock:/tmp/docker.sock

    --restart=always

    gliderlabs/registrator:latest

    -ip=192.168.10.16

    consul://192.168.10.12:8500

    # 参数说明

    -ip是本机ip地址;

    consul://192.168.10.12:8500是任意一台server地址(11,12,13都可);

    # 运行测试docker

    [root@kazihuo ~]# docker run -itd -p 81:80 nginx

    # 页面查看

    官方地址:https://gliderlabs.com/registrator/latest/

    故障模拟

        此集群有3个server,而其期望值的数量是2,当集群中有一台server故障时,将自动选取新的leader,操作如下:

    # SERVER1上停掉consul server;

    [root@11 ~]# docker stop consul

    # 在另外2台server上任意一台查看集群状态;

    # 此时集群中选取了新leader;

    # docker exec -t consul consul members

    # docker exec -t consul consul operator raft list-peers

  • 相关阅读:
    OneNote2007产品密钥及激活方法
    穿着马甲的编码方式链式
    String 转换NameValueCollection 的方法 , 这是原创 嘎嘎
    TransactionScope分布式事务无法使用时, 配置并启动 MSDTC 的解决方案
    Spirit越狱3.1.3/3.2固件(Windows)
    智能感知 不正常的解决方法
    HttpHandler HttpModule入门篇
    Microsoft.Practices.Unity依赖注入使用实例
    ViewEngine 深入解析与应用实例
    打开chm文件提示“已取消到该网页的导航”的解决方案
  • 原文地址:https://www.cnblogs.com/kazihuo/p/10710463.html
Copyright © 2011-2022 走看看