1.Prometheus服务发现
1.1 为什么需要服务发现
Prometheus 采⽤ Pull 模型来抓取⽬标主机的指标数据,这就意味着Prometheus必须事先知道每个要监控的⽬标的端点地址。然后才能从对应的Exporter或Instrumentation 进⾏数据抓取。对于规模较⼩,且监控的⽬标不会频繁的发⽣变动,直接使⽤
但是,当我们⾯对容器应⽤的场景时,会发现监控的这些⽬标端点可能会频繁的发⽣变化。因此使⽤静态配置⽅法可能不太适⽤了。那么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 则会周期性地检查该⽂件,⼀旦发现有任何变更,则会⽴即更新对应的监控⽬标。
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 是否已经成功纳⼊监控
2、基于⾃定义标签进⾏过滤
3、Prometheus基于Consul服务发现
3.1 Consul基本介绍
Consul是⼀个开源的服务发现和配置管理系统,任何服务都可以向Consul注册⾃⼰的实例信息(例如Web服务器、数据库、各种内部API等),并且其他服务可以通过Consul查询这些已注册的服务信息。
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
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、检查注册的节点信息
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 是否已经成功纳⼊监控
4、验证,添加和删除consul中的实例,检查Prometheus是否会⾃动完成更新。
标签:服务,Consul,192.168,Prometheus,监控,consul From: https://blog.51cto.com/u_13236892/12074978