https://www.cnblogs.com/lfzm/p/10633595.html

说明

本文主要介绍怎么使用 DockerLinux 环境部署 Consul 集群,如果你对 Docker 不了解的同学,请先学习一下 Docker。推荐一本学习 Docker 在线书籍 :【Docker入门到实践】
本文介绍 Consul 部署已经在准备好 Docker 环境好前提下开始的。

  • CentOS 7.3
  • Docker CE 18.09.2

    简介

    Docker - 容器部署 Consul 集群 - 图1

    了解 Consul

    Consul 是一个支持多数据中心分布式高可用的 服务发现配置共享 的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源。 Consul 支持 健康检查,并允许 HTTPGRPCDNS 协议调用 API 存储键值对.
    命令行超级好用的虚拟机管理软件 vgrant 也是 HashiCorp 公司开发的产品.
    一致性协议采用 Raft 算法,用来保证服务的高可用. 使用 GOSSIP 协议管理成员和广播消息, 并且支持 ACL 访问控制.

    Consul 使用场景

  • Docker 实例的注册与配置共享

  • Coreos 实例的注册与配置共享
  • SaaS 应用的配置共享、服务发现和健康检查。
  • vitess 集群
  • 与 confd 服务集成,动态生成 nginx 和 haproxy 配置文件

    Consul 优势

    市面现在有很多类似的软件比如:zookeeperEtcddoozerdeureka,Consul 相比这些软件有什么优势呢?
    官方出了相比较这些软件区别的一篇 Consul vs. ZooKeeper,doozerd,etcd 文章。
    下面总结一下 Consul 的优势有那几点:

  • 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft.

  • 支持 多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟,分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持。
  • 支持 健康检查。 etcd 不提供此功能。
  • 支持 HTTPDNSGPRS 协议接口。 zookeeper 的集成较为复杂,etcd 只支持 http 协议。
  • 官方提供 WEB管理界面,etcd 无此功能。
  • 综合比较, Consul 作为服务注册和配置管理的新星,比较值得关注和研究。

    Consul 中的概念

Docker - 容器部署 Consul 集群 - 图2

  • Client:表示 Consul 客户端模式,是 Consul 节点的一种模式,所有注册到 Client 节点的服务会被转发到 Server 。本身无状态不持久化如何数据。Client 通过 HTTP、DNS、GRPC 接口请求转发给局域网内的服务端集群。
  • Server:表示 Consul 的服务端模式, Server 功能和 Client 都一样,不同的是 Server 持久化数据到本地。在局域网内与本地 Client 通讯,通过广域网与其他数据中心通讯。每个数据中心的 Server 数量推荐为 3 个或是 5 个。
  • Server-Leader :表示这个 Server 是它们的老大,它和其它 Server 不一样的一点是,它需要负责同步注册的信息给其它的 Server 节点,同时也要负责各个节点的健康监测。如果 Leader 宕机了,通数据中心的所有 Server 内部会使用 Raft 算法来在其中选取一个 Leader 出来。
  • Agent :Agent 是 Consul 的核心进程,Agent 的工作是维护成员关系信息、注册服务、健康检查、响应查询等等。Consul 集群的每一个节点都必须运行 agent 进程。
  • 其它
    需要了解 Consul 原理、的通信方式、协议信息、算法、帮助文档等。有兴趣可以前往官方查看 官方文档

    文档:https://www.consul.io/docs/agent/basics.html 官网:https://www.consul.io

安装

准备 Consul 镜像

拉取 Consul 镜像到本地,我本次讲解的是 Consul V1.4.4 版本。

  1. $ docker pull consul:1.4.4
  2. 1.4.4: Pulling from library/consul
  3. 5d20c808ce19: Pull complete
  4. ded83912d17e: Pull complete
  5. a7fbb7ddd3ea: Pull complete
  6. 6cdcd1f7ea42: Pull complete
  7. a0ea9ef64acd: Pull complete
  8. 267ee3fb0b30: Pull complete
  9. Digest: sha256:9113b1043308b4193d2be8516c64fcdc2e9740e3c626be058076de697c407be7
  10. Status: Downloaded newer image for consul:1.4.4

Consul 镜像提供了几个个常用环境变量

  • CONSUL_CLIENT_INTERFACE :配置 Consul 的 -client=<interface ip> 命令参数。
  • CONSUL_BIND_INTERFACE :配置 Consul 的 -bind=<interface ip> 命令参数。
  • CONSUL_DATA_DIR :配置 Consul 的数据持久化目录。
  • CONSUL_CONFIG_DIR:配置 Consul 的配置文件目录。

Consul 镜像的详细说明请前往官方使用文档

安装单个 Consul

先启动一个单机版 Consul,由于单机肯定需要安装 Server 模式的 Consul。

启动 Consul 和 Web 管理器

我们启动一个命名为 consul_server_1 的 Docker 容器来运行 Consul ,启动的 Consul 的版本是 1.4.4CONSUL_BIND_INTERFACE 设置为默认桥接网络 eth0 并且主机上不显示任何服务。

  1. $ docker run -d -p 8500:8500 -v /data/consul:/consul/data -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_1 consul:1.4.4 agent -server -bootstrap -ui -node=1 -client='0.0.0.0'
  2. 9e86237f42d3c2cefab5de0dc9888d2bd4ed3e7a1aa2ca8e1ebc54cef9ea47b7

提示:/consul/data 是 Consul 持久化地方,如果需要持久化那 Dooker 启动时候需要给它指定一个数据卷 -v /data/consul:/consul/data

Consul 命令简单介绍

  • agent : 表示启动 Agent 进程。
  • -server:表示启动 Consul Server 模式。
  • -client:表示启动 Consul Cilent 模式。
  • -bootstrap:表示这个节点是 Server-Leader ,每个数据中心只能运行一台服务器。技术角度上讲 Leader 是通过 Raft 算法选举的,但是集群第一次启动时需要一个引导 Leader,在引导群集后,建议不要使用此标志。
  • -ui:表示启动 Web UI 管理器,默认开放端口 8500,所以上面使用 Docker 命令把 8500 端口对外开放。
  • -node:节点的名称,集群中必须是唯一的。
  • -client:表示 Consul 将绑定客户端接口的地址,0.0.0.0 表示所有地址都可以访问。
  • -join:表示加入到某一个集群中去。 如:-json=192.168.1.23

    Web 管理器

    上面命令已经启动了 Consul 和 Web 管理器,我们现在打开 Web 管理器来看一下是否启动成功。通过浏览器浏览 Http://{serverIp}:8500
    Docker - 容器部署 Consul 集群 - 图3
    上图显示已经启动成功了,启动了一个节点名称为 -node=1 的节点 ,并且可以通过管理器管理 Node 节点、Key/Value 功能等。
    这里就不讲怎么使用 Consul ,我在附件中引用几篇文章你可以去看看,更细化怎么使用可以去查相关资料。

    组装集群 Consul

    上面完成了一个单机版的 Consul 部署,下面我们将实现图中的的集群架构 Consul 部署。
    Docker - 容器部署 Consul 集群 - 图4

    Server 加入集群

    我们在上面单机版的基础上面来拓展集群,这样可以模拟集群的一步一步发展。下面我将加入二个 Server 模式的 Consul 到集群中,Server 模式在集群中建议是 三个以上,这样更好的避免因为 Server 的宕机导致整个集群挂掉的风险。
  1. 通过命令查一下当前运行 Consul 集群信息

    1. $ docker exec consul_server_1 consul members
    2. Node Address Status Type Build Protocol DC Segment
    3. 1 172.17.0.2:8301 alive server 1.4.4 2 dc1 <all>
  2. 加入到集群, 命名为 -node=2-node=3
    上面通过命令获取到引导 Consul 的 Ip 地址 172.17.0.2 , ``` // -node=2 $ docker run -d -e CONSUL_BIND_INTERFACE=’eth0’ —name=consul_server_2 consul:1.4.4 agent -server -node=2 -join=’172.17.0.2’ 5d999ade4f96e04b5a1dbbcb69dc117fafa11d450fd17268884b1254971a7450

// -node=3 $ docker run -d -e CONSUL_BIND_INTERFACE=’eth0’ —name=consul_server_3 consul:1.4.4 agent -server -node=3 -join=’172.17.0.2’ 459948e6bd26e2b0b556ac6b4c5593b5dba2e4dc2b79d506d6ba4644f4ab0970

  1. 1. 通过 Web 管理器查看是否成功加入集群中<br />![](https://cdn.nlark.com/yuque/0/2020/png/278385/1598836426806-bacb9845-e481-4028-b777-e0768359e1a8.png#align=left&display=inline&height=381&margin=%5Bobject%20Object%5D&originHeight=381&originWidth=817&size=0&status=done&style=none&width=817)<br />
  2. <a name="VDKj3"></a>
  3. #### Client 加入集群
  4. Client Consul 集群中起到了代理 Server 的作用,Client 模式不持久化数据。一般情况每台应用服务器都会安装一个 Client ,这样可以减轻跨服务器访问带来性能损耗。也可以减轻 Server 的请求压力。
  5. 1. 加入集群

$ docker run -d -e CONSUL_BIND_INTERFACE=’eth0’ —name=consul_server_4 consul:1.4.4 agent -client -node=4 -join=’172.17.0.2’ -client=’0.0.0.0’ 6e0604490eb49363d28249a5277c03173b258aa55965d70eb5b5438a0a6b7eea

$ docker run -d -e CONSUL_BIND_INTERFACE=’eth0’ —name=consul_server_5 consul:1.4.4 agent -client -node=5 -join=’172.17.0.2’ -client=’0.0.0.0’ 25e9792c6d5949ba3fcf73432ed2933568726d214d6819ab52d2b6eaa00d7842

$ docker run -d -e CONSUL_BIND_INTERFACE=’eth0’ —name=consul_server_6 consul:1.4.4 agent -client -node=5 -join=’172.17.0.2’ -client=’0.0.0.0’ c7333068c1679f8f9e8c8c0be0fcf68f93f85b2c45dd177e4757217bdfa55d7a

  1. 1. 检查 Client 是否加入集群中

$ docker exec consul_server_1 consul members Node Address Status Type Build Protocol DC Segment 1 172.17.0.2:8301 alive server 1.4.4 2 dc1 2 172.17.0.3:8301 alive server 1.4.4 2 dc1 3 172.17.0.4:8301 alive server 1.4.4 2 dc1 25e9792c6d59 172.17.0.6:8301 alive client 1.4.4 2 dc1 6e0604490eb4 172.17.0.5:8301 alive client 1.4.4 2 dc1 c7333068c167 172.17.0.7:8301 alive client 1.4.4 2 dc1 ```

总结

Docker 部署 Consul 其实很简单,Consul 集群的配置主要是 Consul 的命令需要了解,建议多看看 Consul 的官方文档。

引用和附件

  1. Consul 原理和使用简介 : https://blog.coding.net/blog/intro-consul?type=hot
  2. Consul 镜像仓库地址 :https://hub.docker.com/_/consul
  3. Consul 镜像使用文档:https://github.com/docker-library/docs/tree/master/consul
  4. Consul 官方文档 :https://www.consul.io/docs/agent/basics.html
  5. 使用Consul和Registration对Docker容器进行服务发现
    https://livewyer.io/blog/2015/02/05/service-discovery-docker-containers-using-consul-and-registrator
  6. 基于Consul+Registrator+Nginx实现容器服务自动发现的集群框架
    http://www.mamicode.com/info-detail-2222200.html
  7. .NET Core微服务之基于Consul实现服务治理
    https://www.cnblogs.com/edisonchou/p/9124985.html