Prometheus 实战:容器资源指标 + 外部端点可用性全链路落地

前言

在现代微服务和容器化架构中,监控需要回答两个不同层次的问题:

  • “应用内部是否健康?” —— 容器 CPU/内存是否异常?OOM 是否发生过?

    对应技术:cAdvisor运行实例资源消耗采集

  • “从用户视角能否正常访问?” —— 服务是不是真的通了?DNS 解析正常吗?

    对应技术:Blackbox Exporter业务外联接口/网络连通可用性巡检,主动探测HTTP/HTTPS/TCP/ICMP)

二者结合才能形成从基础设施到业务入口的全链路观测能力。

一、整体架构梳理

整套监控链路组成:

  1. 资源采集组件(cadvisor:部署在宿主机,采集宿主机上所有运行实例CPU、内存、磁盘IO、网络、进程等运行指标;

  2. 链路探测组件(blackbox-exporter:独立部署,提供HTTP/TCP/ICMP/DNS探测能力,由Prometheus主动下发探测目标;

  3. Prometheus Server:统一配置job,周期性拉取两类组件指标,存储时序数据;

  4. AlertManager:配置资源超限、链路异常告警;

  5. Grafana:可视化资源大盘与链路可用性大盘。

架构流向:容器运行数据 → cadvisor → Prometheus;业务端点 → blackbox探测 → Prometheus。

二、第一部分:容器资源指标采集(基于 Docker 与 cAdvisor)

2.1 cadvisor容器部署

采用docker方式运行,挂载宿主机关键目录用于读取容器底层资源信息,命令如下:

docker run \
  -v /:/rootfs:ro \
  -v /var/run:/var/run:ro \
  -v /sys:/sys:ro \
  -v /var/lib/docker/:/var/lib/docker:ro \
  -v /dev/disk/:/dev/disk:ro \
  -p 18080:8080 \
  -d \
  --name=cadvisor \
  --privileged \
  --device=/dev/kmsg \
  gcr.io/cadvisor/cadvisor-amd64:v0.49.1

挂载说明:只读挂载宿主机根目录、sys、docker数据目录,是cadvisor读取容器cgroup资源数据必要条件,privileged权限用于访问内核设备。

部署完成验证:curl 127.0.0.1:18080/metrics,正常返回海量容器资源指标即部署成功。

2.2 Prometheus配置cadvisor采集任务

修改prometheus.yml新增job,标签区分宿主机环境:

scrape_configs:
  - job_name: "container_resource"
    static_configs:
      - targets: ["192.168.0.101:18080"]
        labels:
          node_host: docker01

重载Prometheus配置,curl -X POST http://prom地址/-/reload,Prometheus Target页面查看状态UP。

2.3 核心常用指标释义

指标名称 含义
container_cpu_usage_seconds_total 容器CPU累计使用时间
container_memory_usage_bytes 容器实时内存占用
container_network_receive_bytes_total 容器入网流量
container_fs_usage_bytes 容器磁盘占用

2.4 常用容器指标及 PromQL 示例

监控目的 PromQL 示例 说明
容器 CPU 使用率 sum(rate(container_cpu_usage_seconds_total{image!=""}[1m])) by (name) 排除 pause 容器
内存实际使用量 container_memory_working_set_bytes{image!=""} working_set 更接近真实使用
网络入流量 sum(rate(container_network_receive_bytes_total[1m])) by (name) 可用于定位流量突增容器
容器重启次数 changes(container_start_time_seconds[10m]) > 0 告警频繁重启

2.5 典型告警规则(用于 Prometheus Alertmanager)

groups:
  - name: container_alerts
    rules:
      - alert: ContainerMemoryHigh
        expr: |
          (container_memory_working_set_bytes{image!=""} 
           / container_spec_memory_limit_bytes{image!=""}) > 0.9
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "容器 {{$labels.name}} 内存使用超过限制的90%"
          
      - alert: ContainerOomKilled
        expr: |
          (container_last_seen - container_start_time_seconds) < 60
          and on (name) rate(container_oom_events_total[1m]) > 0
        for: 0m
        labels:
          severity: warning
        annotations:
          summary: "容器 {{$labels.name}} 最近发生了 OOM Kill"

三、第二部分:外部端点可用性全链路探测(Blackbox Exporter)

3.1 blackbox-exporter概述及部署

# blackbox黑盒监控网站站点及证书有效期等
  blackbox exporter支持基于HTTP, HTTPS, DNS, TCP, ICMP, gRPC协议来对目标节点进行监控。
  
  比如基于http协议我们可以探测一个网站的返回状态码为200判读服务是否正常。

  比如基于TCP协议我们可以探测一个主机端口是否监听。

  比如基于ICMP协议来ping一个主机的连通性。

  比如基于gRPC协议来调用接口并验证服务是否正常工作。

  比如基于DNS协议可以来检测域名解析。


	1.下载软件
wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.25.0/blackbox_exporter-0.25.0.linux-amd64.tar.gz


	2.解压软件包 
tar xf blackbox_exporter-0.25.0.linux-amd64.tar.gz


	3.启动blackbox
cd /app/blackbox_exporter-0.25.0.linux-amd64/

[root@docker blackbox_exporter-0.25.0.linux-amd64]# ll
total 21132
drwxr-xr-x  2 1001 1002     4096 Apr  9 21:00 ./
drwxr-xr-x 11 root root     4096 Sep  6 09:45 ../
-rwxr-xr-x  1 1001 1002 21606608 Apr  9 20:59 blackbox_exporter*
-rw-r--r--  1 1001 1002      956 Apr  9 21:00 blackbox.yml
-rw-r--r--  1 1001 1002    11357 Apr  9 21:00 LICENSE
-rw-r--r--  1 1001 1002       94 Apr  9 21:00 NOTICE
[root@docker blackbox_exporter-0.25.0.linux-amd64]# ./blackbox_exporter 

	4.访问blackbox的webui
http://10.0.0.42:9115/

    5. systemd服务
cat > /etc/systemd/system/blackbox_exporter.service <<EOF
[Unit]
Description=Blackbox Exporter
Documentation=https://github.com/prometheus/blackbox_exporter
After=network.target

[Service]
Type=simple
User=root
ExecStart=/app/blackbox_exporter-0.25.0.linux-amd64/blackbox_exporter \
  --config.file=/app/blackbox_exporter-0.25.0.linux-amd64/blackbox.yml \
  --web.listen-address=:9115

Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF
    6.启动服务
systemctl daemon-reload
systemctl enable blackbox_exporter
systemctl start blackbox_exporter
systemctl status blackbox_exporter

==================================
# docker版
==================================
mkdir -p /opt/blackbox
# 写入探测模块配置
cat > /opt/blackbox/blackbox.yml <<EOF
modules:
  http_2xx:
    prober: http
    http:
      valid_status_codes: []
  tcp_connect:
    prober: tcp
  icmp_ping:
    prober: icmp
EOF

docker run -d --name blackbox \
-p 9115:9115 \
-v /opt/blackbox/blackbox.yml:/etc/blackbox_exporter/config.yml \
prom/blackbox-exporter:v0.24.0

配置内置三种常用探测:HTTP接口状态探测、TCP端口连通探测、ICMP ping连通探测。

验证:curl 127.0.0.1:9115/probe?module=http_2xx&target=baidu.com

3.2 Prometheus动态配置探测任务

使用relabel_configs做目标转发,Prometheus请求blackbox,由blackbox实际探测目标地址,配置示例:

  - job_name: "endpoint_probe"
    metrics_path: /probe
    params:
      module: [http_2xx] #默认使用http探测模块
    static_configs:
      - targets:
          - https://www.baidu.com
          - https://prometheus.io
        labels:
          biz: public_web
      - targets:
          - 192.168.0.20:3306
        labels:
          biz: mysql_db
          probe_mod: tcp_connect
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.0.101:9115 #blackbox服务地址

逻辑:Prometheus把target传给blackbox,blackbox实际访问目标,返回探测指标。

3.3 Blackbox 关键指标与使用场景

指标 类型 作用
probe_success 瞬时值 1/0 探测是否成功(最重要)
probe_duration_seconds 耗时 衡量响应速度
probe_http_status_code 状态码 定位 HTTP 错误
probe_dns_lookup_time_seconds 分步耗时 判断 DNS 是否异常
probe_ssl_earliest_cert_expiry 时间戳 证书过期预警

3.4 外部探测告警示例

groups:
  - name: blackbox_alerts
    rules:
      - alert: EndpointDown
        expr: probe_success == 0
        for: 1m
        annotations:
          summary: "外部端点 {{$labels.instance}} 不可用"
          
      - alert: SSLCertificateExpiringSoon
        expr: (probe_ssl_earliest_cert_expiry - time()) < 7 * 24 * 3600
        for: 1h
        annotations:
          summary: "证书将在 7 天内过期,目标: {{$labels.instance}}"

3.5 blackbox 监控案例

案例一:prometheus基于blackbox的HTTP监控网站站点

  # Prometheus配置
vim /app/prometheus-3.5.0/prometheus.yml 
  - job_name: 'blackbox-exporter-http'
    metrics_path: /probe
    # 配置URL的相关参数
    params:
      # 此处表示使用的是blackbox的http模块,从而判断相应的返回状态码是否为200
      module: [http_2xx]
    static_configs:
      - targets:
        - https://www.baidu.com/
        - http://10.0.0.31:18080/containers/
        - http://10.0.0.42:9090
    # 对目标节点进行重新打标签配置
    relabel_configs:
        # 指定源标签,此处的"__address__"表示内置的标签,存储的是被监控目标的IP地址
      - source_labels: [__address__]
        # 指定目标标签,其实就是在"Endpoint"中加了一个target字段(用于指定监控目标),
        target_label: __param_target
        # 指定需要执行的动作,默认值为"replace",常用的动作有: replace, keep, and drop。
        # 但官方支持十几种动作: https://prometheus.io/docs/prometheus/2.45/configuration/configuration/
        # 将"__address__"传递给target字段。
        action: replace
        # 用__param_target的值覆盖instance的标签
      - source_labels: [__param_target]
        target_label: instance
        # 用replacement变量的值覆盖target_label标签的值
      - target_label: __address__
        replacement: 10.0.0.42:9115
...


  # 访问Prometheus的WebUI
http://10.0.0.42:9090/targets

  # grafana导入模板
7587

案例二:prometheus基于blackbox的ICMP监控目标主机是否存活

    1 修改Prometheus配置文件
vim /app/prometheus-3.5.0/prometheus.yml 
...
scrape_configs:
  ...
  - job_name: 'blackbox-exporter-icmp'
    metrics_path: /probe
    params:
      # 如果不指定模块,则默认类型为"http_2xx",不能乱写!乱写监控不到服务啦!
      module: [icmp]
    static_configs:
      - targets:
          - 10.0.0.31
          - 10.0.0.42
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 10.0.0.42:9115  
...


    2. 访问prometheus的WebUI
http://10.0.0.42:9090/targets


    3. 访问blackbox的WebUI
http://10.0.0.42:9115/


    4.grafana导入模板
24687

案例三:prometheus基于blackbox的TCP监控端口是否存活

  1 修改Prometheus配置文件
vim /app/prometheus-3.5.0/prometheus.yml 
...
scrape_configs:
  ...
  - job_name: 'blackox-exporter-tcp'
    metrics_path: /probe
    params:
      module: [tcp_connect]
    static_configs:
      - targets:
          - 10.0.0.8:80
          - 10.0.0.42:22
          - 10.0.0.31:18080
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 10.0.0.42:9115


  2. 访问prometheus的WebUI
http://10.0.0.42:9090/targets

  3.访问blackbox exporter的WebUI
http://10.0.0.42:9115/

四、Grafana可视化面板落地

  1. 容器资源大盘:导入官方cadvisor模版(常用ID:893),自动聚合宿主机下全部容器CPU、内存、磁盘、网络趋势图,筛选node_host标签区分多宿主机;

  2. 链路探测大盘:官方Blackbox模版(常用ID:13659,7587)。

五、踩坑记录&优化方案

  1. cadvisor target异常DOWN:检查目录挂载权限,系统内核过低会导致cgroup读取异常,升级内核或调整挂载参数;

  2. blackbox探测不通但本机curl正常:防火墙放行blackbox出口流量,宿主机安全组放开外联访问权限;

  3. 容器内存limit为0指标计算报错:limit=0代表无内存配额,告警表达式增加过滤container_memory_limit_bytes!=0

  4. cAdvisor 指标中 image="" 的容器需要排除
    那些是系统内部容器(pause),过滤方式:container_label_io_kubernetes_pod_namespace="" 或简单用 image!=""

  5. Blackbox 探测 HTTPS 证书错误导致 probe_success=0
    如果内网自签证书,可在模块中配置 tls_config: { insecure_skip_verify: true },但生产环境建议保持校验。

  6. 容器 OOM 告警不准确
    OOM 事件不是持续指标,建议用 increase(container_oom_events_total[5m]) > 0 结合 for: 0s 触发。

  7. Blackbox 耗时包括本地网络延迟
    将 Blackbox 部署在靠近被探测服务的网络区域(如同一 VPC)以减小误差。


六、总结

  1. cadvisor聚焦容器运行时资源采集,补齐宿主机内部实例监控盲区;

  2. blackbox-exporter聚焦外部端点可用性探测,从业务侧验证链路连通性;

  3. 二者搭配Prometheus实现「内部资源+外部链路」双层监控,覆盖运维80%日常故障发现场景,是云原生基础监控标配方案。

posted @ 2026-06-02 23:21  kyle_7Qc  阅读(29)  评论(0)    收藏  举报