Docker - 容器部署 Consul 集群
了解 Consul
Consul 是一个支持多数据中心分布式高可用的 服务发现
和 配置共享
的服务软件,由 HashiCorp
公司用 Go
语言开发, 基于 Mozilla Public License 2.0
的协议进行开源。 Consul 支持 健康检查
,并允许 HTTP
、GRPC
和 DNS
协议调用 API 存储键值对.
命令行超级好用的虚拟机管理软件 vgrant 也是 HashiCorp 公司开发的产品.
一致性协议采用 Raft 算法,用来保证服务的高可用. 使用 GOSSIP 协议管理成员和广播消息, 并且支持 ACL 访问控制.
Consul 使用场景
Docker
实例的注册与配置共享Coreos
实例的注册与配置共享SaaS
应用的配置共享、服务发现和健康检查。vitess
集群- 与 confd 服务集成,动态生成 nginx 和 haproxy 配置文件
Consul 优势
市面现在有很多类似的软件比如:zookeeper
、Etcd
、doozerd
、eureka
,Consul 相比这些软件有什么优势呢?
官方出了相比较这些软件区别的一篇 Consul vs. ZooKeeper,doozerd,etcd 文章。
下面总结一下 Consul 的优势有那几点:
-
使用
Raft
算法来保证一致性, 比复杂的Paxos
算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft. -
支持
多数据中心
,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟,分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持。 -
支持
健康检查
。 etcd 不提供此功能。 -
支持
HTTP
、DNS
和GPRS
协议接口。 zookeeper 的集成较为复杂,etcd 只支持 http 协议。 -
官方提供
WEB管理界面
,etcd 无此功能。 -
综合比较, Consul 作为服务注册和配置管理的新星,比较值得关注和研究。
Consul 中的概念
-
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 镜像到本地
[root@docker-01 ~]# docker pull consul
Using default tag: latest
latest: Pulling from library/consul
e7c96db7181b: Pull complete
06ba64850324: Pull complete
e2cfcbd06e76: Pull complete
211aae54ca69: Pull complete
1f22c1b42a0a: Pull complete
028c01a3f1b3: Pull complete
Digest: sha256:a167e7222c84687c3e7f392f13b23d9f391cac80b6b839052e58617dab714805
Status: Downloaded newer image for consul:latest
docker.io/library/consul:latest
[root@docker-01 ~]#
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_BIND_INTERFACE
设置为默认桥接网络 eth0
并且主机上不显示任何服务。
[root@docker-01 ~]# 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' Unable to find image 'consul:1.4.4' locally 1.4.4: Pulling from library/consul e7c96db7181b: Already exists e3ace54dae97: Pull complete ef9b42a6c6b1: Pull complete 3acea76fb7bc: Pull complete c76cd7cfc065: Pull complete 847a91f7fa82: Pull complete Digest: sha256:61ad29a7b0eac9c0a54a2719fd9e34e51b6dca987da94d7562fe1b57ec604c2a Status: Downloaded newer image for consul:1.4.4 9c17c9c3408de4e4b3a1ddb60b99bacbd24636a1a0596fe32887b27990d9d7d3
提示:/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.222
Web 管理器
上面命令已经启动了 Consul 和 Web 管理器,我们现在打开 Web 管理器来看一下是否启动成功。通过浏览器浏览
http://192.168.1.222:8500
上图显示已经启动成功了,启动了一个节点名称为 -node=1
的节点 ,并且可以通过管理器管理 Node 节点、Key/Value 功能等。
这里就不讲怎么使用 Consul ,我在附件中引用几篇文章你可以去看看,更细化怎么使用可以去查相关资料。
Server 加入集群
我们在上面单机版的基础上面来拓展集群,这样可以模拟集群的一步一步发展。下面我将加入二个 Server 模式的 Consul 到集群中,Server 模式在集群中建议是 三个以上
,这样更好的避免因为 Server 的宕机导致整个集群挂掉的风险。
通过命令查一下当前运行 Consul 集群信息
[root@docker-01 ~]# 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 <all>
加入到集群, 命名为 -node=2
、-node=3
。
[root@docker-01 ~]# 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'
aaf43b10fc9fbe9eeb145308324a23fa0f0b2cdcd43bfa75fc3cf523f29554a1
[root@docker-01 ~]# 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'
b1465f36c1e6078bf876049773d4a841d3319d9aae5298b0b36ade851a4ad117
Client 加入集群
Client 在 Consul 集群中起到了代理 Server 的作用,Client 模式不持久化数据。一般情况每台应用服务器都会安装一个 Client ,这样可以减轻跨服务器访问带来性能损耗。也可以减轻 Server 的请求压力。
加入集群
[root@docker-01 ~]# 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' 64fd9a5a3fec499c7225efefd7d2e7330361f6060a34c7bd71459aa45d31c272 [root@docker-01 ~]# 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' 296eedc33da53a232415361271f9e1df7eb8a3516a806c87a9a7f9f992baf5c0 [root@docker-01 ~]# 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' f3d4f9fceb0881b9ec7139166af55d8e53bae703318a9671d817312ca9e22fcb
检查 Client 是否加入集群中
[root@docker-01 ~]# docker exec consul_server_1 consul members Node Address Status Type Build Protocol DC Segment 1 Node Address Status Type Build Protocol DC Segment 1 172.17.0.2:8301 alive server 1.4.4 2 dc1 <all> 2 172.17.0.3:8301 alive server 1.4.4 2 dc1 <all> 3 172.17.0.4:8301 alive server 1.4.4 2 dc1 <all> 296eedc33da5 172.17.0.6:8301 alive client 1.4.4 2 dc1 <default> 64fd9a5a3fec 172.17.0.5:8301 alive client 1.4.4 2 dc1 <default> f3d4f9fceb08 172.17.0.7:8301 alive client 1.4.4 2 dc1 <default>
[root@docker-01 ~]# docker exec consul_server_1 consul members Node Address Status Type Build Protocol DC Segment 1 Node Address Status Type Build Protocol DC Segment 1 172.17.0.2:8301 alive server 1.4.4 2 dc1 <all> 2 172.17.0.3:8301 alive server 1.4.4 2 dc1 <all> 3 172.17.0.4:8301 alive server 1.4.4 2 dc1 <all> 296eedc33da5 172.17.0.6:8301 alive client 1.4.4 2 dc1 <default> 64fd9a5a3fec 172.17.0.5:8301 alive client 1.4.4 2 dc1 <default> 700319516cf0 172.17.0.8:8301 alive client 1.4.4 2 dc1 <default> 7887d4226c05 172.17.0.9:8301 alive client 1.4.4 2 dc1 <default> f3d4f9fceb08 172.17.0.7:8301 alive client 1.4.4 2 dc1 <default>
总结
Docker 部署 Consul 其实很简单,Consul 集群的配置主要是 Consul 的命令需要了解,建议多看看 Consul 的官方文档。 引用和附件 Consul 原理和使用简介 : https://blog.coding.net/blog/intro-consul?type=hot Consul 镜像仓库地址 :https://hub.docker.com/\_/consul Consul 镜像使用文档:https://github.com/docker-library/docs/tree/master/consul Consul 官方文档 :https://www.consul.io/docs/agent/basics.html 使用Consul和Registration对Docker容器进行服务发现 https://livewyer.io/blog/2015/02/05/service-discovery-docker-containers-using-consul-and-registrator 基于Consul+Registrator+Nginx实现容器服务自动发现的集群框架 http://www.mamicode.com/info-detail-2222200.html .NET Core微服务之基于Consul实现服务治理 https://www.cnblogs.com/edisonchou/p/9124985.html