概述:
说明:前面我们构建的,都是手动在配置文件中指定要抓取的IP和端口,这种场景适用于主机较少的情形,在主机规模较大时,或者是使用容器和基于云的实例的动态集群,手动几乎无法实现监控维护,prometheus通过使用服务发现解决上述问题
prometheus服务发现实现方式:
1. 基于文件的服务发现
2. 查询API的服务发现
3. 使用DNS记录的服务发现
方式一: 基于文件的服务发现
说明:基于文件的服务发现只是比静态配置先进一点,实现原理是:在文件中配置target的目标和端口,prometheus读取文件中target作为监控目标,实现指标数据采集。这里注意:文件的数据来源,可以是ansible、CMDB等
具体实现:
1) prometheus server配置
- job_name: "node"
file_sd_configs:
- files:
- targets/nodes/*.json
refresh_interval: 5m说明:我们使用file_sd_configs模块代替static_configs模块,并指定files路径,并指定每5分钟prometheus重新加载该配置文件
2) 创建主机清单的JSON文件
mkdir -p /usr/local/prometheus/targets/nodes/
cat >/usr/local/prometheus/targets/nodes/nodes.json<<EOF
- targets:
- "192.168.161.116:9100"
- "192.168.161.117:9100"
- "192.168.161.118:9100"EOF
清单文件的第二种写法:
[{
"targets": [
"192.168.161.116:9100",
"192.168.161.117:9100",
"192.168.161.118:9100"
],labels: {
"locaiton": "BeiJing"
}
}]
3) 重新加载prometheus即可验证
方式二:基于API的服务发现
kubernetes内置的API支持Prometheus,这些API可以返回目标列表
待细化
方式三:基于DNS查询的服务发现
实现方式: 通过指定DNS条目列表,然后查询这些条目中的记录以发现目标列表,它依赖于A,AAAA或SRV DNS记录查询
注意: DNS记录将由Prometheus服务器上的本地定义的DNS服务器解析
- job_name: webapp
dns_sd_configs:
- names: ["_prometheus._tcp.myapp.com"]说明:
1. 指定job名称为webapp
2. 指定dns_sd_configs块,替代static_configs块
3. names指定我们要查询的DNS条目
4. prometheus的DNS服务发现假定会你查询SRV或者服务记录、服务记录是一种在DNS配置中定义服务的方法,服务通常由运行服务的一个或多个目标主机和端口组成,格式如下:
_service.proto.name TTL IN SRV priority weight port target.
_service: 要查询的服务的名称
_proto: 服务的协议
.name: 条目名称
TTL: time to live ,跳数
IN: 标准的DNS类
priority: 优先级
weight: 权重
port和target: 指定运行的端口和主机名
示例:监控prometheus
_prometheus._tcp.example.com 300 IN SRV 10 1 9100 webapp1.
配置prometheus
- job_name: webapp
dns_sd_configs:
- names: ["myapp.com"]
type: A
port: 9100