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
在一台机器上部署即可。
$ wget https://github.com/prometheus/prometheus/releases/download/v2.20.1/prometheus-2.20.1.linux-amd64.tar.gz
$ tar zxf prometheus-2.20.1.linux-amd64.tar.gz -C /opt/
$ ln -sf /opt/prometheus-2.20.1.linux-amd64 /opt/prometheus
$ ln -sf /opt/prometheus-2.20.1.linux-amd64/prometheus /usr/local/bin/
# 配置文件调整
$ sed -i 's/localhost/192.168.20.2/g' /opt/prometheus/prometheus.yml
# 启动Prometheus
prometheus --config.file="/opt/prometheus/prometheus.yml" \
--web.enable-lifecycle --storage.tsdb.path=/opt/prometheus/data \
--storage.tsdb.retention.time=30d &
# --config.file: 指定配置文件
# --web.enable-lifecycle: 支持通过http请求重载配置
# --storage.tsdb.path: 指定数据存储目录(默认当前目录的的data目录,若不存在则新建)
# --storage.tsdb.retention.time: 指定数据保留时间(默认15d)
# 确定端口在监听
$ ss -lnput | grep 9090 # 确定端口在监听
tcp LISTEN 0 128 :::9090 :::* users:(("prometheus",pid=16429,fd=11))
浏览器访问
访问Prometheus主机的 9090 端口,点击如下,即可看到监控主机的相关信息(Prometheus默认监控本机):
部署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集群
如下操作需在所有节点进行:
$ wget https://releases.hashicorp.com/consul/1.8.4/consul_1.8.4_linux_amd64.zip
$ unzip consul_1.8.4_linux_amd64.zip -d /usr/bin/
至此,各个机器上的consul就配置好了,现在依次启动它们,注:server端和client的启动命令是不一样的。
node1启动server端
$ 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 &
# 注:如果你想记录下consul的日志信息,请将启动命令末尾的 & 符号改为 &> /log/path。
# 可执行 consul agent --help 查看所有选项含义。
$ ss -lnput | grep consul | grep tcp # server端监听端口如下
tcp LISTEN 0 128 192.168.20.2:8300 *:* users:(("consul",pid=32173,fd=6))
tcp LISTEN 0 128 192.168.20.2:8301 *:* users:(("consul",pid=32173,fd=12))
tcp LISTEN 0 128 192.168.20.2:8302 *:* users:(("consul",pid=32173,fd=8))
tcp LISTEN 0 128 192.168.20.2:8500 *:* users:(("consul",pid=32173,fd=16))
tcp LISTEN 0 128 192.168.20.2:8600 *:* users:(("consul",pid=32173,fd=15))
node2启动consul
$ 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 &
# 上述命令中,前面指定的都是自己本身的IP,只有后面的 -join 指定的是node1的IP,也就是server端的IP
# 监听端口如下
$ ss -lnput | grep consul | grep tcp
tcp LISTEN 0 128 192.168.20.3:8301 *:* users:(("consul",pid=32090,fd=7))
tcp LISTEN 0 128 192.168.20.3:8500 *:* users:(("consul",pid=32090,fd=11))
tcp LISTEN 0 128 192.168.20.3:8600 *:* users:(("consul",pid=32090,fd=10))
node3启动consul
$ 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/)即可看到所有节点,如下:
部署node_exporter
node_exporter用于收集主机运行信息,比如CPU、内存、磁盘等资源使用情况。
各种监控exporter,可以去官网下载
$ wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz
$ tar zxf node_exporter-1.0.1.linux-amd64.tar.gz -C /opt/
$ ln -sf /opt/node_exporter-1.0.1.linux-amd64 /opt/node_exporter
$ nohup /opt/node_exporter/node_exporter &
$ ss -lnput | grep 9100 # 确定端口在监听
tcp LISTEN 0 128 [::]:9100 [::]:* users:(("node_exporter",pid=7352,fd=3))
注册服务到consul
使用HTTP API 方式注册node-exporter服务注册到Consul,在任意节点上(只要可以访问consul服务)执行如下指令:
$ 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中看到如下信息:
现在接着把剩下两个节点注册到consul中,如下:
$ 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
$ 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中了:
若后续需要移除在consul中不可用的服务,可以执行如下命令:
$ curl --request PUT http://192.168.20.2:8500/v1/agent/service/deregister/node-exporter-4
$ curl --request PUT http://192.168.20.2:8500/v1/agent/service/deregister/node-exporter-2
$ curl --request PUT http://192.168.20.2:8500/v1/agent/service/deregister/node-exporter-3
注:上述移除服务的请求最后指定的 node-exporter-x为service id,service id在哪里找?如下:
好,至此,只要consul中可以看到如下页面,就可以去配置Prometheus了:
修改Prometheus配置文件
$ vim /opt/prometheus/prometheus.yml # 增加如下job配置(关于配置含义稍后解释)
- job_name: consul
honor_labels: true
metrics_path: /metrics
scheme: http
consul_sd_configs:
- server: 192.168.20.2:8500
services: []
relabel_configs:
- source_labels: ['__meta_consul_tags']
target_label: 'product'
- source_labels: ['__meta_consul_dc']
target_label: 'idc'
- source_labels: ['__meta_consul_service']
regex: "consul" #匹配为"consul" 的service
action: drop # 执行的动作
# 重启Prometheus生效。
$ kill -HUP $(ps -ef | grep prometheus | grep -v grep | awk '{print $2}')
访问Prometheus的target列表,可以看到如下,即表示配置成功。
Prometheus中关于consul的配置解释
- job_name: consul
honor_labels: true
metrics_path: /metrics
scheme: http
consul_sd_configs: # 基于consul服务发现的配置
# 以上除job_name是自定义外,其他都是固定字段
- server: 192.168.20.2:8500 # 这里是你consul的监听地址
services: [] # 这个表示匹配consul中所有的service
relabel_configs: # relabel_configs下面都是重写标签相关配置
- source_labels: ['__meta_consul_tags'] # 将__meta_consul_tags标签的至赋值给product
target_label: 'product'
- source_labels: ['__meta_consul_dc'] # 将__meta_consul_dc的值赋值给idc
target_label: 'idc'
- source_labels: ['__meta_consul_service']
regex: "consul" #匹配为"consul" 的service
action: drop # 执行的动作为删除