0
点赞
收藏
分享

微信扫一扫

​​Prometheus监控之服务发现

1.Prometheus服务发现

1.1 为什么需要服务发现

Prometheus 采⽤ Pull 模型来抓取⽬标主机的指标数据,这就意味着Prometheus必须事先知道每个要监控的⽬标的端点地址。然后才能从对应的Exporter或Instrumentation 进⾏数据抓取。对于规模较⼩,且监控的⽬标不会频繁的发⽣变动,直接使⽤

但是,当我们⾯对容器应⽤的场景时,会发现监控的这些⽬标端点可能会频繁的发⽣变化。因此使⽤静态配置⽅法可能不太适⽤了。那么Prometheus为了适应这种动态性,引⼊了多种类型的服务发现机制。这些机制使得Prometheus 能够动态地从“服务注册中⼼”⾃动的发现可被监控的⽬标。即使监控的⽬标端发⽣了变化,Prometheus 也能⾃动的发现这些变化并对相应的配置进⾏⾃动更新,⽽⽆需认为参与。⼤⼤的降低了维护成本。

​​Prometheus监控之服务发现_加载

1.2 服务发现的实现⽅式

Prometheus 的服务发现(Service Discovery, SD)可以与各种不同的服务发现系统集成,从⽽⾃动发现监控⽬标。以下是⼀些常⻅的服务发现机制的实现⽅式:

1、静态服务配置:可以通过配置⽂件指定固定地址和端⼝,对⽬标服务进⾏监控。

2、基于⽂件的发现机制以配置⽂件作为发现的源头,通过监控这些⽂件的变动来动态调整监控⽬标的增加或减少。通常会配合如像Ansible这样的⼯具⼀起使⽤,对配置⽂件进⾏批量更新,只需要让Prometheus重新加载这些配置,就能⾃动适应新的监控环境。

3、基于注册中⼼的发现机制:在微服务架构中,常常会使⽤Consul等服务注册中⼼来管理所有的服务。Prometheus可以读取Consul中的服务列表,从⽽⾃动发现并开始监控所有注册的服务。

4、基于公有云API的发现机制:当你需要监控公有云上的RDS服务时,⼀条条配置⾮常麻烦,这个时候就可以使⽤Prometheus基于公有云的OpenAPI进⾏服务发现。例如,配置Prometheus⾃动拉取AWS账号下所有RDS实例的列表,从⽽实现对所有数据库实例的监控。

5、基于 Kubernetes 的发现机制在Kubernetes环境中,Prometheus

可以通过调⽤kube-apiserver获取集群中的Node、Pod、Endpoint、

Ingress等信息。例如,如果你在Kubernetes集群中部署了⼀个新的应⽤,Prometheus可以⾃动发现并开始监控这个新的Pod。

6、基于 DNS、HTTP等等服务发现,使⽤的不多,就不⼀⼀展开

2、Prometheus基于⽂件服务发现

2.1 基于⽂件服务发现介绍

Prometheus 基于⽂件的服务发现⾮常的简单,因为它不依赖任何特定的平台或第三⽅服务。

⽤户只需在Prometheus配置⽂件中指定 file_sd_configs 选项来监视⼀个⽂件。这个⽂件包含了要监控的⽬标列表。那么Prometheus 则会周期性地检查该⽂件,⼀旦发现有任何变更,则会⽴即更新对应的监控⽬标。

​​Prometheus监控之服务发现_服务发现_02

json格式 
[
  {
    "targets": [ "<host>", ... ],
    "labels": {
      "<labelname>": "<labelvalue>", ...
    }
  },
  ...
]

YAML格式 
# - targets 是一组实例地址的列表
# - labels 是这组实例的标签,应用到列表中所有实例
- targets:
  [ - '<host>' ]
  labels:
    [ <labelname>: <labelvalue> ... ]

2.2 基于⽂件服务发现实践

将此前的node_exporter 修改为基于⽂件发现的⽅式

1、配置Prometheus

原先配置
  - job_name: "node_exporter"
    metrics_path: "/metrics"
    static_configs:
    - targets: ["192.168.137.128:9100","192.168.137.131:9100"]

修改为基于文件发现
  - job_name: "node_exporter"
    metrics_path: "/metrics"
    file_sd_configs:
    - files:
      - file_sd/node.yml

2、定义发现规则⽂件(将128主机添加⼀个group=dev的标签,将131主机添加group=test的标签,这样后期就可以基于不同的环境做分析。

mkdir file_sd

vim file_sd/node.yml
- targets:
  - 192.168.137.128:9100
  labels:
    group: dev
- targets:
  - 192.168.137.131:9100
  labels:
    group: test

3、检测配置文件语法

/app/module/prometheus/promtool check config /app/module/prometheus/prometheus.yml

4、重新加载Prometheus配置⽂件

curl -X POST http://192.168.137.131:9090/-/reload

2.3 基于⽂件服务发现验证

1、检查Prometheus的Status->Targets⻚⾯,验证 node_exporter 是否已经成功纳⼊监控

​​Prometheus监控之服务发现_HTTP_03

2、基于⾃定义标签进⾏过滤

​​Prometheus监控之服务发现_服务发现_04

3、Prometheus基于Consul服务发现

3.1 Consul基本介绍

Consul是⼀个开源的服务发现和配置管理系统,任何服务都可以向Consul注册⾃⼰的实例信息(例如Web服务器、数据库、各种内部API等),并且其他服务可以通过Consul查询这些已注册的服务信息。

​​Prometheus监控之服务发现_服务发现_05

Prometheus基于Consul的服务发现流程如下:

1、当运⾏⼀个服务时,他会将⾃⼰服务的信息(如服务名称、地址、端⼝等。)注册到consul中,当服务不再可⽤时,它会从Consul中注销。

2、 Prometheus配置基于consul的服务发现,那么它会定期向Consul查询当前可⽤的服务列表和元数据。

3、Prometheus使⽤从Consul获取的服务信息,来构建⽬标URL,然后对这些URL进⾏数据采集,以监控服务的运⾏状况。

4、如果某个服务在Consul中被标记为不健康或被注销,Prometheus会⾃动将这个服务从监控⽬标列表中移除,确保监控⽬标的准确性。

3.2 安装Consul服务

1、访问consul官⽅下载地址https://www.consul.io/downloads/,下载consul
wget https://releases.hashicorp.com/consul/1.17.1/consul_1.17.1_linux_amd64.zip 

2、解压consul
mkdir /app/module/consul
unzip consul_1.17.1_linux_amd64.zip -d /app/module/consul

3、准备consul启动⽂件
vim /usr/lib/systemd/system/consul.service
[Unit]
Description=Consul Service Discovery Agent
Documentation=https://www.consul.io/
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
Group=root
ExecStart=/app/module/consul/consul agent -server -ui \
  -node=consul-server \
  -bootstrap-expect=1 \
  -data-dir=/app/module/consul/data \
  -bind=192.168.137.131 \
  -client=0.0.0.0
Restart=on-failure
[Install]
WantedBy=multi-user.target


agent:执⾏的命令,各参数含义:
-server :表示节点是server类型 
-ui :启⽤consul的web⻚⾯管理 
-node :节点名称
-bootstrap-expect :表示集群中有⼏个server节点进⾏Leader选举,单节点集群,就为1 
-data-dir :数据⽬录
-bind :集群内部通信地址,默认是0.0.0.0 
-client :客户端地址,默认是127.0.0.1 

4 启动consul
systemctl daemon-reload
systemctl start consul.service

访问consul的UI⻚⾯,通过 http://IP:8500

​​Prometheus监控之服务发现_服务发现_06

3.3 注册实例⾄Consul

1、注册节点信息⾄Consul

# 128启动状态
curl -X PUT --data '{
  "Name": "node_exporter",
  "ID": "node01",
  "Address": "192.168.137.128",
  "Port": 9100,
  "Tags": ["shanghai","prod"],
  "Checks": [{
    "HTTP": "http://192.168.137.128:9100/metrics",
    "Interval": "5s"
  }]
}' http://192.168.137.131:8500/v1/agent/service/register

# 131启动状态
curl -X PUT --data '{
  "Name": "node_exporter",
  "ID": "node02",
  "Address": "192.168.137.131",
  "Port": 9100,
  "Tags": ["shanghai","prod"],
  "Checks": [{
    "HTTP": "http://192.168.137.131:9100/metrics",
    "Interval": "5s"
  }]
}' http://192.168.137.131:8500/v1/agent/service/register

# 132宕机状态
curl -X PUT --data '{
  "Name": "node_exporter",
  "ID": "node03",
  "Address": "192.168.137.132",
  "Port": 9100,
  "Tags": ["beijing","test"],
  "Checks": [{
    "HTTP": "http://192.168.137.132:9100/metrics",
    "Interval": "5s"
  }]
}' http://192.168.137.131:8500/v1/agent/service/register

2、检查注册的节点信息

​​Prometheus监控之服务发现_加载_07

3、如何注销对应实例的注册信息

curl --request PUT http://192.168.137.131:8500/v1/agent/service/deregister/node03

3.4 配置Prometheus

1、配置Prometheus,添加⼀个名为 consul_nodes 的Job,并使⽤

Consul进⾏服务发现,步骤如下

- job_name: "consul_nodes"
    consul_sd_configs:
    - server: "192.168.137.131:8500"
    #services: ["node_exporter"] # 限定仅从Consul的node_exporter这个Service发现实例信息(可不配置)

2、重新加载Prometheus配置⽂件

curl -X POST http://192.168.137.131:9090/-/reload

3、检查Prometheus的Status->Targets⻚⾯,验证 consul_nodes 是否已经成功纳⼊监控

​​Prometheus监控之服务发现_服务发现_08

4、验证,添加和删除consul中的实例,检查Prometheus是否会⾃动完成更新。

举报

相关推荐

0 条评论