Prometheus 实战:容器资源指标 + 外部端点可用性全链路落地
前言
在现代微服务和容器化架构中,监控需要回答两个不同层次的问题:
-
“应用内部是否健康?” —— 容器 CPU/内存是否异常?OOM 是否发生过?
对应技术:
cAdvisor(运行实例资源消耗采集) -
“从用户视角能否正常访问?” —— 服务是不是真的通了?DNS 解析正常吗?
对应技术:
Blackbox Exporter(业务外联接口/网络连通可用性巡检,主动探测HTTP/HTTPS/TCP/ICMP)
二者结合才能形成从基础设施到业务入口的全链路观测能力。
一、整体架构梳理
整套监控链路组成:
-
资源采集组件(
cadvisor):部署在宿主机,采集宿主机上所有运行实例CPU、内存、磁盘IO、网络、进程等运行指标; -
链路探测组件(
blackbox-exporter):独立部署,提供HTTP/TCP/ICMP/DNS探测能力,由Prometheus主动下发探测目标; -
Prometheus Server:统一配置job,周期性拉取两类组件指标,存储时序数据;
-
AlertManager:配置资源超限、链路异常告警;
-
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可视化面板落地
-
容器资源大盘:导入官方cadvisor模版(常用ID:893),自动聚合宿主机下全部容器CPU、内存、磁盘、网络趋势图,筛选node_host标签区分多宿主机;
-
链路探测大盘:官方Blackbox模版(常用ID:13659,7587)。
五、踩坑记录&优化方案
-
cadvisor target异常DOWN:检查目录挂载权限,系统内核过低会导致cgroup读取异常,升级内核或调整挂载参数;
-
blackbox探测不通但本机curl正常:防火墙放行blackbox出口流量,宿主机安全组放开外联访问权限;
-
容器内存limit为0指标计算报错:limit=0代表无内存配额,告警表达式增加过滤
container_memory_limit_bytes!=0。 -
cAdvisor 指标中 image="" 的容器需要排除
那些是系统内部容器(pause),过滤方式:container_label_io_kubernetes_pod_namespace=""或简单用image!=""。 -
Blackbox 探测 HTTPS 证书错误导致 probe_success=0
如果内网自签证书,可在模块中配置tls_config: { insecure_skip_verify: true },但生产环境建议保持校验。 -
容器 OOM 告警不准确
OOM 事件不是持续指标,建议用increase(container_oom_events_total[5m]) > 0结合for: 0s触发。 -
Blackbox 耗时包括本地网络延迟
将 Blackbox 部署在靠近被探测服务的网络区域(如同一 VPC)以减小误差。
六、总结
-
cadvisor聚焦容器运行时资源采集,补齐宿主机内部实例监控盲区;
-
blackbox-exporter聚焦外部端点可用性探测,从业务侧验证链路连通性;
-
二者搭配Prometheus实现「内部资源+外部链路」双层监控,覆盖运维80%日常故障发现场景,是云原生基础监控标配方案。

浙公网安备 33010602011771号