Docker搭建Consul集群

了解 Consul

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

Consul关键特性

  • 服务发现:支持服务发现。你可以通过 DNS 或 HTTP 的方式获取服务信息。
  • 健康检查:支持健康检查。可以提供与给定服务相关联的任何数量的健康检查(如 web 状态码或 cpu 使用率)。
  • K/V 存储:键/值对存储。你可用通过 consul 存储如动态配置之类的相关信息。
  • 多数据中心:支持多数据中心,开箱即用。
  • WEB-UI:支持WEB-UI。点点点,你就能够了解你的服务现在的运行情况,一目了然,对开发运维是非常友好的。

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与其他同类产品优势

开始实战

拉取Consul镜像

docker pull consul

Consul挂载目录

/consul/data 持久化数据存储
/consul/config 配置文件

创建Consul Server节点

docker run -d -p 8001:8500 --restart=always 
--mount type=volume,source=consul-data-1,target=/consul/data 
--mount type=volume,source=consul-conf-1,target=/consul/config 
-e CONSUL_BIND_INTERFACE='eth0' 
--name consul-server-1 consul agent -server -node server-1 
--bootstrap-expect 3 -client 0.0.0.0 -ui 
-data-dir=/consul/data -config-dir=/consul/config -datacenter=dh_dc

创建其他Consul节点并且加入集群

docker run -d -p 8001:8500 --restart=always 
--mount type=volume,source=consul-data-1,target=/consul/data 
--mount type=volume,source=consul-conf-1,target=/consul/config 
-e CONSUL_BIND_INTERFACE='eth0' 
--name consul-server-1 consul agent -server -node server-1 
--bootstrap-expect 3 -client 0.0.0.0 -ui 
-data-dir=/consul/data -config-dir=/consul/config -datacenter=dh_dc -join=172.17.0.2

创建Consul Client节点

docker run -d -p 8500:8500 --restart=always 
--mount type=volume,source=consul-data-4,target=/consul/data 
--mount type=volume,source=consul-conf-4,target=/consul/config 
-e CONSUL_BIND_INTERFACE='eth0' --name=consul-client-1 consul 
agent -node=client-1 -join=172.17.0.2 -client='0.0.0.0' -datacenter=dh_dc 
-ui -config-dir /consul/config -data-dir=/consul/data

查询Consul集群信息

docker exec consul-server-1consul members

命令介绍

agent : 表示启动 Agent 进程。
-server:表示启动 Consul Server 模式。
-client:表示启动 Consul Cilent 模式。
-bootstrap:表示这个节点是 Server-Leader ,每个数据中心只能运行一台服务器。技术角度上讲 Leader 是通过 Raft 算法选举的,但是集群第一次启动时需要一个引导 Leader,在引导群集后,建议不要使用此标志。
-bootstrap-expect:集群期望的 Server 节点数,只有达到这个值才会选举 Leader
-ui:表示启动 Web UI 管理器
-node:节点的名称,集群中必须是唯一的。
-client:表示 Consul 将绑定客户端接口的地址,0.0.0.0 表示所有地址都可以访问。
-join:表示加入到某一个集群中去。 如:-join=192.168.1.23
-bind: 指定节点绑定的地址
-datacenter: 数据中心
-config-file: 要加载的配置文件
---
**环境变量介绍**
CONSUL_CLIENT_INTERFACE :配置 Consul 的 -client=<interface ip> 命令参数。
CONSUL_BIND_INTERFACE :配置 Consul 的 -bind=<interface ip> 命令参数。
CONSUL_DATA_DIR :配置 Consul 的数据持久化目录。
CONSUL_CONFIG_DIR:配置 Consul 的配置文件目录。

端口介绍

TCP/8300	8300 端口用于服务器节点。客户端通过该端口 RPC 协议调用服务端节点。服务器节点之间相互调用
TCP/UDP/8301	8301 端口用于单个数据中心所有节点之间的互相通信,即对 LAN 池信息的同步。它使得整个数据中心能够自动发现服务器地址,分布式检测节点故障,事件广播(如领导选举事件)。
TCP/UDP/8302	8302 端口用于单个或多个数据中心之间的服务器节点的信息同步,即对 WAN 池信息的同步。它针对互联网的高延迟进行了优化,能够实现跨数据中心请求。
8500	8500 端口基于 HTTP 协议,用于 API 接口或 WEB UI 访问。
8600	8600 端口作为 DNS 服务器,它使得我们可以通过节点名查询节点信息。

使用ACL控制权限

开启ACL,在Consul配置文件增加如下配置 acl.json

{
  "acl": {
    "enabled": true,
    "default_policy": "deny",
    "down_policy": "extend-cache"
  }
}

进入consul容器

docker exec -it consul-name bin/sh

生成第一个无限权限的令牌

consul acl bootstrap

Consul策略表

在UI 操作ACL,添加策略,分配角色,生成角色Token。

添加策略示例
service_prefix "" {
  policy = "write"
  }
key_prefix "" {
  policy = "write"
  }
node_prefix "" {
  policy = "write"
  }

为什么有了server端,还要再弄一个client?

一个Client是一个转发所有RPC到server的代理,它本身不持久化这些信息。client是相对无状态的。client唯一执行的后台动作是加入LAN gossip池。client会提供最低的资源开销并且仅消耗少量的网络带宽。
原文地址:https://www.cnblogs.com/net666/p/12944655.html