1. 首页
  2. >
  3. 服务器技术
  4. >
  5. Linux

Prometheus基于Consul的服务发现

Consul是由HashiCorp开发的一个支持多数据中心的分布式服务发现和键值对存储服务的开源软件,被大量应用于基于微服务的软件架构当中。

Consul使用

可以通过Consul官网https://www.consul.io/downloads.html下载对应操作系统版本的软件包。Consul与Prometheus同样使用Go语言进行开发,因此安装和部署的方式也极为简单,解压并将命令行工具放到系统PATH路径下即可。

Consul安装

# wget https://releases.hashicorp.com/consul/1.9.0/consul_1.9.0_linux_amd64.zip # unzip consul_1.9.0_linux_amd64.zip # cp consul /usr/local/bin/

在本地可以使用开发者模式在本地快速启动一个单节点的Consul环境:

# consul agent -dev ==> Starting Consul agent...            Version: '1.9.0'            Node ID: 'f8baf8b0-4bb3-4985-e854-793668506963'          Node name: 'node1'         Datacenter: 'dc1' (Segment: '<all>')             Server: true (Bootstrap: false)        Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)       Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)            Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false  ==> Log data will now stream in as it occurs:      2021-01-27T01:28:02.423Z [INFO]  agent.server.raft: initial configuration: index=1 servers="[{Suffrage:Voter ID:f8baf8b0-4bb3-4985-e854-793668506963 Address:127.0.0.1:8300}]"     2021-01-27T01:28:02.424Z [INFO]  agent.server.serf.wan: serf: EventMemberJoin: node1.dc1 127.0.0.1

在启动成功后,在一个新的terminal窗口中运行consul members可以查看当前集群中的所有节点:

# consul members Node   Address         Status  Type    Build  Protocol  DC   Segment node1  127.0.0.1:8301  alive   server  1.9.0  2         dc1  <all>   说明: Node: 节点名称 Address: 绑定IP和端口 DC: 默认dc1,可以指定

还可以通过HTTP API的方式查看当前集群中的节点信息:

# curl localhost:8500/v1/catalog/nodes [     {         "ID": "f8baf8b0-4bb3-4985-e854-793668506963",         "Node": "node1",         "Address": "127.0.0.1",         "Datacenter": "dc1",         "TaggedAddresses": {             "lan": "127.0.0.1",             "lan_ipv4": "127.0.0.1",             "wan": "127.0.0.1",             "wan_ipv4": "127.0.0.1"         },         "Meta": {             "consul-network-segment": ""         },         "CreateIndex": 11,         "ModifyIndex": 12     } ]

Consul还提供了内置的DNS服务,可以通过Consul的DNS服务的方式访问其中的节点:

# dig @127.0.0.1 -p 8600 localhost.node.consul  ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.2 <<>> @127.0.0.1 -p 8600 localhost.node.consul ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 19687 ;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; WARNING: recursion requested but not available  ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;localhost.node.consul.         IN      A  ;; AUTHORITY SECTION: consul.                 0       IN      SOA     ns.consul. hostmaster.consul. 1609149345 3600 600 86400 0  ;; Query time: 4 msec ;; SERVER: 127.0.0.1#8600(127.0.0.1) ;; WHEN: Mon Dec 28 04:55:45 EST 2020 ;; MSG SIZE  rcvd: 100

在Consul当中服务可以通过服务定义文件或者是HTTP API的方式进行注册。

1.使用服务定义文件的方式将本地运行的node_exporter通过服务的方式注册到Consul当中。

创建node_exporter.json文件 # sudo mkdir /etc/consul.d # echo '{"service": {"name": "node_exporter", "tags": ["exporter"], "port": 9100}}' | sudo tee /etc/consul.d/node_exporter.json  重新启动Consul服务,并且声明服务定义文件所在目录: # consul agent -dev -config-dir=/etc/consul.d -client=192.168.0.107 2020-12-28T04:58:38.146-0500 [DEBUG] agent: Node info in sync 2020-12-28T04:58:38.146-0500 [DEBUG] agent: Service in sync: service=node_exporter

2.服务注册成功之后就可以通过DNS或HTTP API的方式查询服务信息。默认情况下,所有的服务都可以使用NAME.service.consul域名的方式进行访问。

例如,可以使用node_exporter.service.consul域名查询node_exporter服务的信息:

# dig @192.168.0.107 -p 8600 node_exporter.service.consul  ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> @192.168.0.107 -p 8600 node_exporter.service.consul ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3507 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; WARNING: recursion requested but not available  ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;node_exporter.service.consul.  IN      A  ;; ANSWER SECTION: node_exporter.service.consul. 0 IN      A       127.0.0.1  ;; Query time: 44 msec ;; SERVER: 192.168.0.107#8600(192.168.0.107) ;; WHEN: Wed Jan 27 01:56:36 GMT 2021 ;; MSG SIZE  rcvd: 73

如上所示DNS记录会返回当前可用的node_exporter服务实例的IP地址信息。

除了使用DNS的方式以外,Consul还支持用户使用HTTP API的形式获取服务列表:

# curl http://192.168.0.107:8500/v1/catalog/service/node_exporter [     {         "ID": "6f3e888c-d4ce-422b-6208-e90701a1174a",         "Node": "node1",         "Address": "127.0.0.1",         "Datacenter": "dc1",         "TaggedAddresses": {             "lan": "127.0.0.1",             "lan_ipv4": "127.0.0.1",             "wan": "127.0.0.1",             "wan_ipv4": "127.0.0.1"         },         "NodeMeta": {             "consul-network-segment": ""         },         "ServiceKind": "",         "ServiceID": "node_exporter",         "ServiceName": "node_exporter",         "ServiceTags": [             "exporter"         ],         "ServiceAddress": "",         "ServiceWeights": {             "Passing": 1,             "Warning": 1         },         "ServiceMeta": {},         "ServicePort": 9100,         "ServiceEnableTagOverride": false,         "ServiceProxy": {             "MeshGateway": {},             "Expose": {}         },         "ServiceConnect": {},         "CreateIndex": 14,         "ModifyIndex": 14     } ]

Consul也提供了一个Web UI可以查看Consul中所有服务以及节点的状态:

访问页面 http://192.168.0.107:8500/ui

Prometheus基于Consul的服务发现

consul UI

Consul集成Prometheus

1.Consul服务文件方式

name表示services名字, ID表示instance  我们可以实现,相同的service下面有多个instance。 # echo '{"service": {"name": "node_exporter","id": "node_exporter_192.168.0.107","address": "192.168.0.107","tags": ["consul-exporter"], "port": 9100}}' | sudo tee /etc/consul.d/node_exporter.json  # echo '{"service": {"name": "node_exporter","id": "node_exporter_192.168.0.108","address": "192.168.0.108","tags": ["consul-exporter"], "port": 9100}}' | sudo tee /etc/consul.d/node_exporter2.json  需要重启consul # consul agent -dev -config-dir=/etc/consul.d -client=192.168.0.107

查看Consul UI http://192.168.0.107:8500/ui/dc1/services/node_exporter/instances

Prometheus基于Consul的服务发现

1个Service下多个instance

这就表示一个Service下面我们可以添加多个同类型的机器信息。

2.Consul HTTP API方式

注册服务, 一个name下面可以添加多个id,表示不同的机器。 # curl -X PUT -d '{"name": "node-exporter-http","id": "node-exporter-192.168.0.107","address": "192.168.0.107","port": 9100,"tags": ["testenv"],"checks": [{"http": "http://192.168.0.107:9100/metrics", "interval": "5s"}]}'  http://192.168.0.107:8500/v1/agent/service/register  # curl -X PUT -d '{"name": "node-exporter-http","id": "node-exporter-192.168.0.108","address": "192.168.0.108","port": 9100,"tags": ["testenv"],"checks": [{"http": "http://192.168.0.108:9100/metrics", "interval": "5s"}]}'  http://192.168.0.107:8500/v1/agent/service/register 执行完毕后,刷新一下 Consul Web 控制台页面,可以看到成功注册到 Consul 中。  注销掉某个服务,这里的node-exporter,是ID # curl -X PUT http://192.168.0.107:8500/v1/agent/service/deregister/node-exporter   不需要重启Consul

查看Consul UI

http://192.168.0.107:8500/ui/dc1/services/node-exporter-http/instances

Prometheus基于Consul的服务发现

node-exporter-http

可以看到新添加的两个Instance,表示HTTP API添加成功。

Consul与Prometheus集成

修改/etc/prometheus/prometheus.yml

  - job_name: 'consul_node_exporter'     metrics_path: /metrics     scheme: http     consul_sd_configs:     - server: '192.168.0.107:8500'       services:         - node_exporter    - job_name: 'consul_node_exporter_http'     metrics_path: /metrics     scheme: http     consul_sd_configs:     - server: '192.168.0.107:8500'       services:         - node-exporter-http  注意: 这里通过 node-exporter 来过滤consul里面的 services。  如果不过滤,下面配置   - job_name: 'consul_node_exporter'     metrics_path: /metrics     scheme: http     consul_sd_configs:     - server: '9.98.12.85:8500'       services: []  重启Prometheus,让配置生效 # systemctl restart prometheus

查看Prometheus Target http://192.168.0.107:9090/targets

Prometheus基于Consul的服务发现

Prometheus集成Consul

上图可以看到,Prometheus从consul中获取了node信息,Consul服务文件和HTTP API方式都成功了。图中访问失败,是因为我没有192.168.0.108这个服务,可以忽略。


至此,Prometheus基于Consul服务发现功能搭建完成。

f-string:一种改进的Python格式语法
« 上一篇 2021年01月27日 pm21:02
开源监控系统wgcloud-v3.3.0发布
下一篇 » 2021年01月28日 am06:58

相关推荐