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
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
1个Service下多个instance