Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。使用起来也较 为简单。Consul使用Go语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。

1. Consul提供的关键功能

  • service discovery:服务发现,consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
  • health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
  • key/value storage:键值存储,一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作,包括动态配置,功能标记,协调,leader选举等等。
  • multi-datacenter:多数据中心支持,无需复杂的配置,即可支持任意数量的区域,这意味着Consul的用户不必担心构建额外的抽象层以扩展到多个区域。

2. consul架构图

Consul 是一个分布式,高可用的系统,集群架构图如下

Consul架构图

我们只看数据中心1,可以看出consul的集群是由N个SERVER,加上M个CLIENT组成的。而不管是SERVER还是CLIENT,都是consul的一个节点,所有的服务都可以注册到这些节点上,正是通过这些节点实现服务注册信息的共享。除了这两个,还有一些小细节,一一简单介绍。

  • CLIENT

CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。

  • SERVER

SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。

  • SERVER-LEADER

中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。

  • 其它信息

其它信息包括它们之间的通信方式,还有一些协议信息,算法。它们是用于保证节点之间的数据同步,实时性要求等等一系列集群问题的解决,例如raft保证服务节点之间数据一致性的协议,服务节点之间的通讯则是采用gossip协议来管理成员关系。

3. 集群推荐节点规划

为保证高可用,Consul集群一般推荐Server节点为单数且至少为3个,clinet节点按需增加。

4. 集群搭建

此次集群规划

节点ID 角色 是否leader 配置目录 数据目录 健康检查 数据中心 ui 端口
centos-vm1 client - /opt/consul/conf.d /opt/consul/data Y k8s Y 8300,8301,8302,8400,8500,8600
centos-vm2 server - /opt/consul/conf.d /opt/consul/data Y k8s - 8300,8301,8302,8400,8500,8600
centos-vm3 server - /opt/consul/conf.d /opt/consul/data Y k8s - 8300,8301,8302,8400,8500,8600
centos-vm4 server Y /opt/consul/conf.d /opt/consul/data Y k8s - 8300,8301,8302,8400,8500,8600

默认端口解析

端口号 协议 功能
8300 TCP agent server使用的,用于处理其他agent发来的请求,处理replication、rpc等协议
8301 TCP 、UDP agent使用此端口处理LAN中的gossip
8302 TCP 、UDP agent server使用此端口处理WAN中的与其他server的gossip
8400 TCP agent用于处理从CLI来的RPC请求
8500 TCP agent用于处理HTTP API
8600 TCP 、UDP agent用于处理DNS查询

环境:CentOS7.5_x64

consul版本:1.3.0

4.1 下载源码包

官方下载

1
2
3
4
cd /opt
wget https://releases.hashicorp.com/consul/1.3.0/consul_1.3.0_linux_amd64.zip
unzip consul_1.3.0_linux_amd64.zip
cp consul /usr/bin/

4.2 运行

consul运行命令consul agent常用参数解析:

  • -data-dir

    • 作用:指定agent储存状态的数据目录
    • 这是所有agent都必须的
    • 对于server尤其重要,因为他们必须持久化集群的状态
  • -config-dir

    • 作用:指定service的配置文件和检查定义所在的位置
    • 通常会指定为”某一个路径/consul.d”(通常情况下,.d表示一系列配置文 - 件存放的目录)
  • -config-file

    • 作用:指定一个要装载的配置文件
    • 该选项可以配置多次,进而配置多个配置文件(后边的会合并前边的,相同 - 的值覆盖)
  • -dev

    • 作用:创建一个开发环境下的server节点
    • 该参数配置下,不会有任何持久化操作,即不会有任何数据写入到磁盘
    • 这种模式不能用于生产环境(因为第二条)
  • -bootstrap-expect

    • 作用:该命令通知consul server我们现在准备加入的server节点个数,该参数是为了延迟日志复制的启动直到我们指定数量的server节点成功的加入后启动。
  • -node

    • 作用:指定节点在集群中的名称
    • 该名称在集群中必须是唯一的(默认采用机器的host)
    • 推荐:直接采用机器的IP
  • -bind

    • 作用:指明节点的IP地址
    • 有时候不指定绑定IP,会报Failed to get advertise address: - Multiple private IPs found. Please configure one. 的异常
  • -server

    • 作用:指定节点为server
    • 每个数据中心(DC)的server数推荐至少为1,至多为5
    • 所有的server都采用raft一致性算法来确保事务的一致性和线性化,事务修 - 改了集群的状态,且集群的状态保存在每一台server上保证可用性
    • server也是与其他DC交互的门面(gateway)
  • -client

    • 作用:指定节点为client,指定客户端接口的绑定地址,包括:web,ui、DNS、RPC
    • 默认是127.0.0.1,只允许回环接口访问
    • 若不指定为-server,其实就是-client
  • -join

    • 作用:将节点加入到集群,后面指定server节点IP即可
  • -datacenter(老版本叫-dc,-dc已经失效)

    • 作用:指定机器加入到哪一个数据中心中
  • -enable-script-checks=true

    • 作用:设置检查服务为可用
  • -ui

    • 作用:使用自带的ui

4.2.1 server节点

  • centos-vm4
1
2
3
4
5
6
7
8
9
consul agent -server \
-client 0.0.0.0 \
-bootstrap-expect 3 \
-data-dir /opt/consul/data \
-config-dir /opt/consul/conf.d \
-node=centos-vm4 \
-bind=192.168.134.114 \
-enable-script-checks=true \
-datacenter=k8s
  • centos-vm3
1
2
3
4
5
6
7
8
9
consul agent -server \
-client 0.0.0.0 \
-data-dir /opt/consul/data \
-config-dir /opt/consul/conf.d \
-node=centos-vm3 \
-bind=192.168.134.113 \
-enable-script-checks=true \
-datacenter=k8s \
-join 192.168.134.114
  • centos-vm2
1
2
3
4
5
6
7
8
9
consul agent -server \
-client 0.0.0.0 \
-data-dir /opt/consul/data \
-config-dir /opt/consul/conf.d \
-node=centos-vm2 \
-bind=192.168.134.112 \
-enable-script-checks=true \
-datacenter=k8s \
-join 192.168.134.114

4.2.2 client节点

  • centos-vm1
1
2
3
4
5
6
7
8
9
10
consul agent \
-ui \
-client 0.0.0.0 \
-data-dir /opt/consul/data \
-config-dir /opt/consul/conf.d \
-node=centos-vm1 \
-bind=192.168.134.111 \
-enable-script-checks=true \
-datacenter=k8s \
-join 192.168.134.114

注:此节点即为client节点,也开户了web ui访问,实际使用中可为ui单独创建client节点
注:-join可先不用,在节点服务启动后再使用consul join手动加入;但这种方式在节点重启后会失效,建议使用-join。

4.3 配置文件

也可以配置文件的方式运行consul,以下为示例:

/opt/consul/conf.d/config.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"datacenter": "dc1",
"data_dir": "/opt/consul/data",
"log_level": "INFO",
"ui": true,
"server": true,
"advertise_addr": "192.168.134.111",
"bind_addr": "192.168.134.111",
"client_addr": "0.0.0.0",
"bootstrap_expect": 3,
"enable_script_checks": true,
"disable_remote_exec": true,
"disable_update_check": true,
"enable_syslog": false,
"encrypt": "iN1tfer4cBrXNyf0JPXA==",
"addresses": {
},
"rejoin_after_leave": true,
"retry_join": [ "consul01", "consul02", "consul03" ],
"node_name": "consul01"
}

详细参数见官网

运行

1
consul agent -config-dir /opt/consul/conf.d