基于Consul的服务发现
Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能,Consul提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。之前我们通过Prometheus实现监控,当新增一个Target时,需要变更服务器上的配置文件,即使使用file_sd_configs配置,也需要登录服务器修改对应Json文件,会非常麻烦,不过Prometheus官方支持多种自动服务发现的类型,其中就支持Consul
1)安装consul
[root@localhost opt] ll consul_1.7.3_linux_amd64.zip
-rw-r--r--. 1 root root 39717645 May 19 03:50 consul_1.7.3_linux_amd64.zip
[root@localhost opt] mkdir /usr/local/consul
[root@localhost opt] unzip consul_1.7.3_linux_amd64.zip -d /usr/local/consul/
2)启动consul
Consul必须启动agent才可使用,它是运行在Consul集群中每个成员上的守护进程,该进程负责维护集群中成员信息、注册服务、查询响应、运行检查等功能。Agent指令是Consul的核心,可以运行为Server或Client模式,操作如下:
[root@localhost ~] cd /usr/local/consul/
[root@localhost consul] ./consul agent -dev
输出信息详解:
Version:当前Consul版本
Node name:节点名称,是agent的唯一名称,默认情况下,是计算机的主机名,可以使用命令行选项-node对其进行自定义
Datacenter:数据中心,是将agent配置运行的数据中心,Consul为多个数据中心提供一流的支持,你是要高效工作,必须将每个节点配置为报告其数据中心,可以使用命令行选项-datacenter设置数据中心,对于单DC配置,代理将默认为“dc1”
Server:agent是在Server还是Client模式下运行
Client Addr:客户端地址,是用于agent的客户端接口的地址,包含HTTP和DNS接口的端口,默认情况下,仅绑定到localhost,如果更改此地址端口,则在运行Consul成员等命令时,都必须制定-http-addr,以指示如何访问agent,其他应用程序也可以使用HTTP地址和端口
Cluster Addr:用子Consul集群中agent之间通信的地址和端口集,不是集群中所有的agent都必须使用相同的端口,但是这个地址必须能够被所有节点访问。
查看集群中所有节点的信息
./consul members
Consul运行需要监听至少6个不同的默认端口才能工作,这些默认端口使用TCP或UDP协议,说明如下;
端口 | 说明 |
---|---|
8003 TCP | Server RPC端口,用于Client与Server通信或Server与Server通信 |
8301 TCP\UDP | 用于单个数据中心所有Client间通信 |
8302 TCP\UDP | 用于单个或多个数据中心之间Server信息同步 |
8400 TCP | 所有agent都要使用的端口,用于处理从CLI来的RPC |
8500 TCP | 用于API接口或WEB UI访问 |
8600 TCP/UDP | 用于解析DNS查询 |
Consul常用命令
命令 | 说明 |
---|---|
agent | Consul核心命令,运行agent来维护集群中成员信息、注册服务、查询响应、运行检查等功能 |
join | 通知Consul agent加入已经存在的集群中 |
members | 输出Consul agent目前所知道的所有成员以及其状态,节点的状态有alive、left、failed三种 |
reload | 重新加载agent的配置文件 |
monitor | 连接运行的agent且显示最近的日志 |
leave | 将agent关闭且移除所在集群,此后agent不会尝试再加入集群中 |
version | 打印Consul版本信息 |
Consul agent命令行选项
命令行选项 | 说明 |
---|---|
-bootstrap-expect | 在Server模式下提供数据中心内预测的Server数量。要么不设置该值,要么该值必须与机器中的其他Server一致。当设置该值后,Consul一致等到达到指定Server数目时才会引导整个集群,该选项不能和-bootstrap一起使用 |
-biind | 指定集群内部通信地址。集群中所有节点都可以访问该IP地址。默认是0.0.0.0时,如果主机有多个IPv4地址可用,Consul将在启动时退出并显示错误,这时需要指定对应的IP地址。 |
-config-dir | 配置文件目录,该目录下所有以.json结尾的文件都会被加载生效 |
-config-file | 指定特定需要加载的配置文件 |
-dev | 指定创建一个单节点的开发者模式的Consul环境 |
-data-dir | 指定一个目录用来存储agent的状态数据,所有的agent都需要该目录,特别是Server模式下更为重要,因为需要持久化集群的状态 |
-dc | 指定agent运行的datacenter的名称,默认是dc1 |
-json | 启动时要加入的另一个agent地址,可以多次指定多个agent地址。如果Consul无法加入任何指定的地址,则agent会启动失败,默认agent启动时不会加入任何节点 |
-node | 节点再集群中的名称,名称在集群中必须是唯一的。默认情况下为该计算机的主机名 |
-server | 指定agent运行在Server模式,每个数据中心至少有一个Server,官方推荐一个数据中心有3-5太Server最佳,但最多不要超过5个 |
3)服务注册发现
Consul服务注册提供了两种注册方法:一种是定义配置文件服务注册方法,即在配置文件中定义服务来进行注册;一种是HTTP API服务注册方法,即在启动后有服务自身通过调用API进行自我注册。
方法一:将本地运行的node_exporter通过服务的方式进行Consul服务注册。
[root@localhost consul] mkdir -p /usr/local/consul/consul.d
[root@localhost consul] cd /usr/local/consul/consul.d/
[root@localhost consul.d] vi node_exporter.json
{
"service": {
"id": "node_exporter",
"name": "node_exporter",
"tags": [
"dev_games"
],
"address": "127.0.0.1",
"port": 9100
}
}
配置文件说明:
id:服务ID,可选提供项。若提供,则将其设置为name一致
name:服务名称,必须提供项。要求每个节点上的所有服务都有唯一的ID。
tags:服务的标签,自定义的可选提供项,用于区分主节点和辅助节点。
address:地址字段,用于指定特定于服务的IP地址。默认情况下,使用agent的IP地址,因而不需要提供这个地址。可以理解为服务注册到Consul使用的IP,服务发现是发现的此IP地址。
port:可以简单理解为服务注册到Consul使用的端口,服务发现也是发现address对应的端口。
编辑完配置文件后,若是首次创建使用,需要重新启动Consul服务进行加载生效。Ctrl+c停掉终端已经启动的开发者模式consul agent服务,之后再重新启动Consul服务:
[root@localhost consul] ./consul agent -dev -config-dir=/usr/local/consul/consul.d
4)服务注册成功后,我们可以通过HTTP API和DNS两种方式进行服务发现。(此方法用的相对较少,一般使用3小节里的配置文件的方式查看)
通过HTTP API的方式在Consul主机中获取服务列表,操作如下:
[root@localhost ~] curl http://localhost:8500/v1/catalog/service/node_exporter
使用Consul提供的内置DNS服务访问当前集群中的节点信息,操作如下:(如果没有dig需要安装bind-utils)
[root@localhost consul.d] dig @127.0.0.1 -p 8600 node_exporter.service.consul
5)与prometheus集成
[root@localhost prometheus] vi prometheus.yml
配置里127.0.0.1:8500 是指consul所在服务的端口
[root@prometheus prometheus] systemctl restart prometheus
这里发现的值就是consul.d/node_exporter.json 里配置的地址
6)监控机下线
当被监控服务节点故障失效或回收下线,需要删除被发现服务,否则prometheus的targets列表中仍然会显示该服务。
下面我们对以上发现的node_exporter服务进行删除操作
[root@localhost ~] curl --request PUT http://127.0.0.1:8500/v1/agent/service/deregister/node_exporter
这里的“node_exporter”为配置文件中service的id,若没有配置id,即为name内容。
7)监控机上线
被监控服务节点故障恢复后,可以使用命令:#./consul reload重新加载生效。
[root@localhost ~] cd /usr/local/consul/
[root@localhost consul] ./consul reload
[root@localhost consul] systemctl restart prometheus