了解 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会提供最低的资源开销并且仅消耗少量的网络带宽。