在本章中,我们将 Consul 配置为基于虚拟机的测试环境中的示例服务发现系统 - Consul 的设置非常简单,这使其非常适合我们的示例。它的工作方式是在每个节点中以客户端模式运行一个代理,并在服务器模式下运行奇数个代理来维护服务目录。客户端节点上可用的服务直接与服务器节点通信,而集群成员资格使用八卦协议(随机点对点消息传递)在集群中的每个节点之间传播。由于我们的主要目标是使用 Consul 展示 Prometheus 服务发现,我们将测试环境配置为在开发模式下运行的代理,这使得内存中的服务器可以使用。当然,这完全无视安全性、可扩展性、数据安全性和弹性;关于如何正确配置 Consul 的文档可以在 https://learn.hashicorp.com/consul/,在生产环境中部署和维护Consul时应该考虑到。
要了解如何在测试环境中设置它,我们需要连接到运行 Consul 的实例:
从这里开始,我们可以开始探索 Consul 是如何设置的。例如,下面的代码片段显示了正在使用的 systemd 单元文件,我们可以在其中看到正在使用的配置标志 – 它被配置为在开发模式下作为代理运行,并且必须将其端口绑定到实例的面向外部的 IP 地址:
如果我们运行 ss 并过滤其输出以仅显示属于 Consul 的行,我们可以找到它正在使用的所有端口:
正如我们所见,Consul 监听了很多端口,包括 TCP 和 UDP。我们感兴趣的端口是服务于 HTTP API 的端口,默认为 TCP 端口 8500。如果我们打开网络浏览器访问 http://192.168.42.11:8500,我们会看到类似下面的内容:
Figure 12.7: Consul web interface displaying its default configuration
默认配置了一个服务,即 Consul 服务本身。
为了让这个例子更有趣,我们还在 consul 实例中部署了 consul_exporter(Prometheus 项目提供的导出器)。这个导出器不需要 Consul 方面的任何额外配置,所以它应该可以工作。我们可以在 systemd 单元文件中找到用于运行此服务的配置,如下所示:
要验证导出器是否正确联系 Consul 并解析其指标,我们可以运行以下指令:
当导出器可以成功连接并从 Consul 收集指标时,导出器将 consul_up 指标设置为 1。我们还可以看到 consul_catalog_services 指标,它告诉我们 Consul 知道一项服务,与我们在 Web 界面中看到的相匹配。
我们现在可以断开与 consul 实例的连接,并使用以下命令连接到 prometheus 实例:
如果我们看一下 Prometheus 服务器配置,我们会发现以下内容:
此配置允许 Prometheus 连接到 Consul API 地址(可在 http://192.168.42.11:8500 获得),并通过 relabel_configs 重写 job 标签,使其与服务名称相匹配(如 __meta_consul_service 标签中所示)。如果我们检查 Prometheus Web 界面,我们可以找到以下信息:
Figure 12.8: Prometheus /service-discovery endpoint showing Consul default service
现在,有趣的部分:让我们通过在 Consul 中将其定义为服务来自动为 consul_exporter 添加一个抓取目标。本章的资源中提供了带有 Consul 服务配置的 JSON 有效负载,因此我们可以通过 Consul API 添加它。可以在以下路径中找到有效负载:
使用以下指令,我们将通过 HTTP API 将这个新服务添加到 Consul 的服务目录中:
运行此命令后,我们可以通过查看 Consul Web 界面来验证是否添加了新服务,该界面将显示如下内容:
Figure 12.9: Consul web interface showing the consul-exporter service
最后,我们可以检查 Prometheus /service-discovery 端点并检查我们是否有一个新目标,证明 Consul 服务发现按预期工作:
Figure 12.10: Prometheus /service-discovery endpoint showing consul-exporter target
如果我们再次查询 consul_catalog_services 指标,我们可以看到它已更改为 2。由于我们现在正在 Prometheus 中收集 consul_exporter 指标,我们可以查询其当前使用 promtool 的值:
Consul 标签可用于使用 relabel_configs 为具有不同要求的服务进行抓取作业配置,例如在存在给定标签时更改指标路径,或者具有标记来标记是否使用 HTTPS 抓取. __meta_consul_tags 标签值的开头和结尾都有逗号分隔符,以便于匹配;这样,您不需要根据您要匹配的标签在字符串中的位置对正则表达式进行特殊处理。工作中的一个例子可能是:
这只会保留在 Consul 中使用 exporter 标记注册的服务,而丢弃其他所有内容。