Prometheus监控系统(6)监控对象的自动发现

TangLu 系统运维 2025-02-06 19672 0

一、Prometheus的自动发现介绍

当监控对象较少时,通过static_configs静态配置就可以满足监控需求。但是如果在容器应用场景或者是有大量资源需要被监控时,通过手动配置就不太现实了。为了解决这种问题,Prometheus 提供了多种自动发现机制,通过自动发现自动化添加监控对象,即使监控对象信息发生了变化也能被感知到,这样可以大大降低手动维护的成本。

Prometheus 常见的服务发现方式:

· 静态服务配置:通过修改配置文件static_configs的内容,对指定地址和端口进行监控

· 基于文件自动发现:通过file_sd_configs指定配置文件,Prometheus会定期检查配置文件是否有更新并按照该文件的内容对监控对象进行自动调整,服务端无需重启服务

· 注册中心自动发现在微服务架构中,通常使用Consul等服务注册中心来管理所有的服务。Prometheus可以读取Consul中的服务列表,从而自动发现并监控所有被注册的服务

· 公有云API自动发现当需要监控公有云上的服务时,可以使用Prometheus基于公有云的OpenAPI进行服务发现

· Kubernetes 自动发现在Kubernetes环境中,Prometheus可以通过调用kube-apiserver获取集群中的Node、Pod、Endpoint、Ingress等信息

· 其他服务发现方式:比如基于 DNS、HTTP等等服务发现,由于使用的不多就不一一展开



二、Prometheus 自动发现配置

· Prometheus 基于文件的自动发现配置

1、在Prometheus主配置文件中,通过file_sd_configs选项来代替static_configs实现基于文件的自动发现

cat /data/prometheus/conf/prometheus.yml

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    metrics_path: "/metrics"
    static_configs:
    - targets: ["192.168.159.101:9090"]

#  - job_name: "node"
#    metrics_path: "/metrics"
#    static_configs:
#    - targets: ["192.168.159.101:9100"]

  - job_name: "node_sd"
    metrics_path: "/metrics"
    file_sd_configs:
    - files:
      - /data/prometheus/conf/node_sd.yml
      refresh_interval: 1m


2、创建对应的yml文件并配置需要监控的节点信息,后续要修改监控对象的话都可以通过修改该文件来让Prometheus自动发现

cat /data/prometheus/conf/node_sd.yml
- targets:
  - 192.168.159.101:9100
  labels:
    env: prod

- targets:
  - 192.168.159.102:9100
  labels:
    env: test


3、重新加载服务查看是否生效

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

Prometheus_sd1.png


· Prometheus 基于consul的自动发现配置

consul是一个开源的分布式服务注册中心,常用于容器化微服务场景的自动发现。新的服务启动时,它会自动向 Consul 注册自己的信息(如 IP 地址、端口等)。而其他服务如果需要调用这个服务,可以通过 Consul 查询到可用的服务实例信息,从而实现服务间的动态发现

。在 Prometheus 的应用上,监控对象可以将自己的信息注册到consul中,而Prometheus则通过consul来自动获取监控对象的信息。

consul通过多个代理节点组成集群,代理节点类型可分为Server和Client,二者区别在于Client是客户端模式,该模式下所有注册到当前节点的服务会被转发到Server,而且不会持久化这部分服务信息。Server模式会把所有信息持久化到本地,遇到故障数据也可以保留。


1、通过consul官网https://www.consul.io/downloads/进行下载,官方提供了yum地址和二进制包

#yum方式
yum install -y yum-utils
yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo 
yum -y install consul

#二进制包方式,解压后就是启动程序
wget https://releases.hashicorp.com/consul/1.20.2/consul_1.20.2_linux_amd64.zip
unzip consul_1.20.2_linux_amd64.zip


2、使用二进制包启动consul服务端并开启WEB UI,默认监听8500端口,

nohup ./consul agent -server -bootstrap-expect 1 -data-dir=/data/consul -node=consul_server -bind=0.0.0.0 -client=0.0.0.0 -ui &

# agent:启动 Consul 代理程序
# -server:以服务器模式运行,而不是客户端模式。服务器节点参与 Raft 协议,存储和复制数据。
# -bootstrap-expect 1:服务器节点数量为1表示单点运行,集群化时只有达到这个数量时才可以正常启动并引导集群
# -data-dir:数据存储目录,Consul会在这个目录中存储所有状态信息,包括集群成员信息、服务注册信息等
# -node=consul_server:节点名称,集群中必须唯一
# -bind=0.0.0.0:指定 Consul 监听的地址
# -client=0.0.0.0:允许客户端地址
#-ui:启用内置的Web界面


3、将consul注册为系统服务

cat /etc/systemd/system/consul.service

[Unit]
Description=Consul Service Discovery Agent
Documentation=https://www.consul.io/
After=network.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/src/consul agent \
    -server \
    -bootstrap-expect 1 \
    -data-dir=/data/consul \
    -node=consul_server \
    -bind=0.0.0.0 \
    -client=0.0.0.0 \
    -ui

ExecStop=/usr/local/src/consul leave
KillMode=process
KillSignal=SIGTERM
TimeoutStopSec=30

Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target


4、启动服务

systemctl daemon-reload
systemctl start consul


5、通过浏览器访问consul

Prometheus_sd2.png


6、被监控对象调用consul API进行服务注册,这样consul中就有了被监控对象的信息

curl -X PUT "http://192.168.159.101:8500/v1/agent/service/register" \
-H "Content-Type: application/json" \
-d '{
  "ID": "node_102",
  "Name": "node_exporter_102",
  "Address": "192.168.159.102",
  "Port": 9100,
  "Tags": ["prod"],
  "Check": {
    "HTTP": "http://192.168.159.102:9100/metrics",
    "Interval": "10s"
  }
}'

Prometheus_sd3.png

7、在Prometheus主配置文件中配置基于consul自动发现

cat /data/prometheus/conf/prometheus.yml

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    metrics_path: "/metrics"
    static_configs:
    - targets: ["192.168.159.101:9090"]

#  - job_name: "node"
#    metrics_path: "/metrics"
#    static_configs:
#    - targets: ["192.168.159.101:9100"]

#  - job_name: "node_sd"
#    metrics_path: "/metrics"
#    file_sd_configs:
#    - files:
#      - /data/prometheus/conf/node_sd.yml
#      refresh_interval: 1m

  - job_name: "node_by_consul"
    consul_sd_configs:
    - server: "192.168.159.101:8500"


8、重新加载服务,查看监控对象是否成功被监控

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

Prometheus_sd4.png

9、对已监控的节点进行注销

#通过命令行注销 
consul services deregister -id="node_exporter-node1"

#通过API注销
curl -X PUT "http://192.168.159.101:8500/v1/agent/service/deregister/myapp-1"


评论