date: 2020-10-28title: prometheus基于consul服务发现 #标题
tags: 监控 #标签
categories: 监控 # 分类

Consul是分布式k/v数据库,是一个服务注册组件,其他服务都可以注册到consul上,Prometheus也不例外,通过consul的服务发现,我们可以避免在Prometheus中指定大量的target。
prometheus基于consul的服务发现流程如下:
(1)在consul注册服务或注销服务(监控targets);
(2)Prometheus一直监视consul服务,当发现consul中符合要求的服务有新变化就会更新Prometheus监控对象。

部署Prometheus

在一台机器上部署即可。

  1. $ wget https://github.com/prometheus/prometheus/releases/download/v2.20.1/prometheus-2.20.1.linux-amd64.tar.gz
  2. $ tar zxf prometheus-2.20.1.linux-amd64.tar.gz -C /opt/
  3. $ ln -sf /opt/prometheus-2.20.1.linux-amd64 /opt/prometheus
  4. $ ln -sf /opt/prometheus-2.20.1.linux-amd64/prometheus /usr/local/bin/
  5. # 配置文件调整
  6. $ sed -i 's/localhost/192.168.20.2/g' /opt/prometheus/prometheus.yml
  7. # 启动Prometheus
  8. prometheus --config.file="/opt/prometheus/prometheus.yml" \
  9. --web.enable-lifecycle --storage.tsdb.path=/opt/prometheus/data \
  10. --storage.tsdb.retention.time=30d &
  11. # --config.file: 指定配置文件
  12. # --web.enable-lifecycle: 支持通过http请求重载配置
  13. # --storage.tsdb.path: 指定数据存储目录(默认当前目录的的data目录,若不存在则新建)
  14. # --storage.tsdb.retention.time: 指定数据保留时间(默认15d)
  15. # 确定端口在监听
  16. $ ss -lnput | grep 9090 # 确定端口在监听
  17. tcp LISTEN 0 128 :::9090 :::* users:(("prometheus",pid=16429,fd=11))

浏览器访问

访问Prometheus主机的 9090 端口,点击如下,即可看到监控主机的相关信息(Prometheus默认监控本机):
prometheus基于consul服务发现 - 图1

部署consul集群

consul简介

Consul是一个分布式的,高可用的服务注册系统,由server端和client端组成,每个server和client都是consul的一个节点,consul客户端不保存数据,客户端将接收到的请求转发给响应的Server端。Server之间通过局域网或广域网通信实现数据一致性。

环境准备

OS IP role
CentOS 7.5 192.168.20.2 server
CentOS 7.5 192.168.20.3 client
CentOS 7.5 192.168.20.4 client

部署consul集群

如下操作需在所有节点进行:

  1. $ wget https://releases.hashicorp.com/consul/1.8.4/consul_1.8.4_linux_amd64.zip
  2. $ unzip consul_1.8.4_linux_amd64.zip -d /usr/bin/

至此,各个机器上的consul就配置好了,现在依次启动它们,注:server端和client的启动命令是不一样的。

node1启动server端

  1. $ consul agent -server -bootstrap -bind=192.168.20.2 -client=192.168.20.2 -datacenter=dc1 -data-dir=/data/consul -ui -node=192.168.20.2 &
  2. # 注:如果你想记录下consul的日志信息,请将启动命令末尾的 & 符号改为 &> /log/path。
  3. # 可执行 consul agent --help 查看所有选项含义。
  4. $ ss -lnput | grep consul | grep tcp # server端监听端口如下
  5. tcp LISTEN 0 128 192.168.20.2:8300 *:* users:(("consul",pid=32173,fd=6))
  6. tcp LISTEN 0 128 192.168.20.2:8301 *:* users:(("consul",pid=32173,fd=12))
  7. tcp LISTEN 0 128 192.168.20.2:8302 *:* users:(("consul",pid=32173,fd=8))
  8. tcp LISTEN 0 128 192.168.20.2:8500 *:* users:(("consul",pid=32173,fd=16))
  9. tcp LISTEN 0 128 192.168.20.2:8600 *:* users:(("consul",pid=32173,fd=15))

node2启动consul

  1. $ consul agent -bind=192.168.20.3 -client=192.168.20.3 -datacenter=dc1 -data-dir=/data/consul -node=192.168.20.3 -join=192.168.20.2 &
  2. # 上述命令中,前面指定的都是自己本身的IP,只有后面的 -join 指定的是node1的IP,也就是server端的IP
  3. # 监听端口如下
  4. $ ss -lnput | grep consul | grep tcp
  5. tcp LISTEN 0 128 192.168.20.3:8301 *:* users:(("consul",pid=32090,fd=7))
  6. tcp LISTEN 0 128 192.168.20.3:8500 *:* users:(("consul",pid=32090,fd=11))
  7. tcp LISTEN 0 128 192.168.20.3:8600 *:* users:(("consul",pid=32090,fd=10))

node3启动consul

  1. $ consul agent -bind=192.168.20.4 -client=192.168.20.4 -datacenter=dc1 -data-dir=/data/consul -node=192.168.20.4 -join=192.168.20.2 &

各个节点都启动完成后,访问consul的管理界面(server端的8500端口:http://192.168.20.2:8500/)即可看到所有节点,如下:

prometheus基于consul服务发现 - 图2

部署node_exporter

node_exporter用于收集主机运行信息,比如CPU、内存、磁盘等资源使用情况。

各种监控exporter,可以去官网下载

  1. $ wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz
  2. $ tar zxf node_exporter-1.0.1.linux-amd64.tar.gz -C /opt/
  3. $ ln -sf /opt/node_exporter-1.0.1.linux-amd64 /opt/node_exporter
  4. $ nohup /opt/node_exporter/node_exporter &
  5. $ ss -lnput | grep 9100 # 确定端口在监听
  6. tcp LISTEN 0 128 [::]:9100 [::]:* users:(("node_exporter",pid=7352,fd=3))

注册服务到consul

使用HTTP API 方式注册node-exporter服务注册到Consul,在任意节点上(只要可以访问consul服务)执行如下指令:

  1. $ curl -X PUT -d '{"id": "node-exporter-2","name": "node-exporter","address": "192.168.20.2","port":9100,"tags": ["node-exporter"],"checks": [{"http": "http://192.168.20.2:9100/","interval": "5s"}]}' http://192.168.20.2:8500/v1/agent/service/register

执行后,即可在consul中看到如下信息:

prometheus基于consul服务发现 - 图3

prometheus基于consul服务发现 - 图4

现在接着把剩下两个节点注册到consul中,如下:

  1. $ curl -X PUT -d '{"id": "node-exporter-3","name": "node-exporter","address": "192.168.20.3","port":9100,"tags": ["node-exporter"],"checks": [{"http": "http://192.168.20.3:9100/","interval": "5s"}]}' http://192.168.20.2:8500/v1/agent/service/register
  2. $ curl -X PUT -d '{"id": "node-exporter-4","name": "node-exporter","address": "192.168.20.4","port":9100,"tags": ["node-exporter"],"checks": [{"http": "http://192.168.20.4:9100/","interval": "5s"}]}' http://192.168.20.2:8500/v1/agent/service/register

最后,在consul中看到如下页面即说明node-exporter已经成功注册到consul中了:

prometheus基于consul服务发现 - 图5

若后续需要移除在consul中不可用的服务,可以执行如下命令:

  1. $ curl --request PUT http://192.168.20.2:8500/v1/agent/service/deregister/node-exporter-4
  2. $ curl --request PUT http://192.168.20.2:8500/v1/agent/service/deregister/node-exporter-2
  3. $ curl --request PUT http://192.168.20.2:8500/v1/agent/service/deregister/node-exporter-3

注:上述移除服务的请求最后指定的 node-exporter-x为service id,service id在哪里找?如下:

prometheus基于consul服务发现 - 图6

prometheus基于consul服务发现 - 图7

prometheus基于consul服务发现 - 图8

好,至此,只要consul中可以看到如下页面,就可以去配置Prometheus了:

prometheus基于consul服务发现 - 图9

修改Prometheus配置文件

  1. $ vim /opt/prometheus/prometheus.yml # 增加如下job配置(关于配置含义稍后解释)
  2. - job_name: consul
  3. honor_labels: true
  4. metrics_path: /metrics
  5. scheme: http
  6. consul_sd_configs:
  7. - server: 192.168.20.2:8500
  8. services: []
  9. relabel_configs:
  10. - source_labels: ['__meta_consul_tags']
  11. target_label: 'product'
  12. - source_labels: ['__meta_consul_dc']
  13. target_label: 'idc'
  14. - source_labels: ['__meta_consul_service']
  15. regex: "consul" #匹配为"consul" 的service
  16. action: drop # 执行的动作
  17. # 重启Prometheus生效。
  18. $ kill -HUP $(ps -ef | grep prometheus | grep -v grep | awk '{print $2}')

访问Prometheus的target列表,可以看到如下,即表示配置成功。

prometheus基于consul服务发现 - 图10

Prometheus中关于consul的配置解释

  1. - job_name: consul
  2. honor_labels: true
  3. metrics_path: /metrics
  4. scheme: http
  5. consul_sd_configs: # 基于consul服务发现的配置
  6. # 以上除job_name是自定义外,其他都是固定字段
  7. - server: 192.168.20.2:8500 # 这里是你consul的监听地址
  8. services: [] # 这个表示匹配consul中所有的service
  9. relabel_configs: # relabel_configs下面都是重写标签相关配置
  10. - source_labels: ['__meta_consul_tags'] # 将__meta_consul_tags标签的至赋值给product
  11. target_label: 'product'
  12. - source_labels: ['__meta_consul_dc'] # 将__meta_consul_dc的值赋值给idc
  13. target_label: 'idc'
  14. - source_labels: ['__meta_consul_service']
  15. regex: "consul" #匹配为"consul" 的service
  16. action: drop # 执行的动作为删除