Blackbox Exporter 网络探测监控实战指南
实战背景
在复杂的云原生环境中,确保外部服务和应用的可访问性至关重要。Blackbox Exporter 是 Prometheus 生态系统中的一个重要组件,专门用于进行黑盒监控,即从外部探测目标服务的可用性。通过 Blackbox Exporter,我们可以监控 HTTP、HTTPS、TCP 等服务的连通性和响应时间,确保用户能够正常访问我们的服务。
一、技术架构概览
Blackbox Exporter 是一个官方提供的 Prometheus exporter,用于进行黑盒探测,支持多种探测协议。结合 Probe(Prometheus Operator 的自定义资源),可以实现对各种网络服务的自动化监控配置。
1.1 核心组件
- Blackbox Exporter:负责执行探测任务并收集指标
- Service:为 Blackbox Exporter 提供网络访问入口
- Probe:告诉 Prometheus Operator 需要探测哪些目标
- ConfigMap:存储探测配置
二、部署配置详解

2.1 基础部署配置
# deployment.yaml
# Blackbox Exporter 的 Deployment 配置
# 用于定义如何部署和运行 Blackbox Exporter 容器
kind: Deployment
apiVersion: apps/v1
metadata:
# Deployment 的名称
name: blackbox-exporter
spec:
# Pod 模板定义
template:
spec:
# 容器定义
containers:
- name: blackbox-exporter
# Blackbox Exporter 镜像地址,后续会被 kustomize 替换为实际镜像
image: blackbox-exporter-image
# 启动参数配置
args:
# 指定配置文件路径
- '--config.file=/etc/blackbox_exporter/blackbox.yml'
# 设置日志级别为 debug,便于调试问题
- '--log.level=debug'
# 设置 Web 监听地址和端口
- '--web.listen-address=:9115'
# 容器端口配置
ports:
# HTTP 端口,用于提供指标和探测服务
- name: http
containerPort: 9115
protocol: TCP
# 资源限制和请求配置
resources:
# 资源限制,防止容器消耗过多资源
limits:
cpu: 200m # CPU 使用上限为 200 毫核
memory: 256Mi # 内存使用上限为 256 兆字节
# 资源请求,保证容器运行所需的最小资源
requests:
cpu: 100m # CPU 请求为 100 毫核
memory: 50Mi # 内存请求为 50 兆字节
2.2 服务配置
# service.yaml
# Blackbox Exporter 的 Service 配置
# 用于为 Blackbox Exporter 提供稳定的网络访问入口
kind: Service
apiVersion: v1
metadata:
# Service 的名称
name: blackbox-exporter-node
spec:
# 端口配置
ports:
# HTTP 端口配置
- name: http-9115
protocol: TCP # 协议类型为 TCP
port: 9115 # Service 端口为 9115
targetPort: 9115 # 目标端口为 9115,对应容器端口
nodePort: 32618 # NodePort 端口为 32618,用于外部访问
# 服务类型为 NodePort,允许从集群外部访问
type: NodePort
2.3 配置挂载
# mount.yaml
# Blackbox Exporter 配置文件挂载补丁
# 用于将 ConfigMap 中的配置文件挂载到容器中
kind: Deployment
apiVersion: apps/v1
metadata:
name: blackbox-exporter
spec:
template:
spec:
# 卷定义
volumes:
# 配置卷,用于挂载 Blackbox Exporter 配置文件
- name: config
configMap:
# 引用的 ConfigMap 名称
name: blackbox-exporter
# 文件权限设置为 420 (十进制),对应 rw-r--r-- 权限
defaultMode: 420
# 容器定义
containers:
- name: blackbox-exporter
# 卷挂载配置
volumeMounts:
# 挂载配置卷到容器中
- name: config
# 挂载路径为 /etc/blackbox_exporter
mountPath: /etc/blackbox_exporter
2.4 健康检查配置
# probe.yaml
# Blackbox Exporter 健康检查配置补丁
# 用于确保 Blackbox Exporter 容器的健康状态
kind: Deployment
apiVersion: apps/v1
metadata:
name: blackbox-exporter
spec:
template:
spec:
containers:
- name: blackbox-exporter
# 存活探针配置,用于检测容器是否正在运行
livenessProbe:
# 使用 TCP Socket 探针检测端口连通性
tcpSocket:
port: 9115 # 检测 9115 端口
initialDelaySeconds: 5 # 容器启动后等待 5 秒再开始探测
timeoutSeconds: 5 # 探测超时时间为 5 秒
periodSeconds: 10 # 探测间隔为 10 秒
successThreshold: 1 # 连续 1 次成功即认为探测成功
failureThreshold: 3 # 连续 3 次失败即认为探测失败
# 就绪探针配置,用于检测容器是否准备好接收流量
readinessProbe:
# 使用 TCP Socket 探针检测端口连通性
tcpSocket:
port: 9115 # 检测 9115 端口
initialDelaySeconds: 5 # 容器启动后等待 5 秒再开始探测
timeoutSeconds: 5 # 探测超时时间为 5 秒
periodSeconds: 10 # 探测间隔为 10 秒
successThreshold: 1 # 连续 1 次成功即认为探测成功
failureThreshold: 3 # 连续 3 次失败即认为探测失败
2.5 配置文件
# configmap.yaml
# Blackbox Exporter 配置文件 ConfigMap
# 包含各种探测模块的配置
kind: ConfigMap
apiVersion: v1
metadata:
# ConfigMap 名称
name: blackbox-exporter
data:
# Blackbox Exporter 主配置文件
blackbox.yml: |-
# 模块定义,每个模块定义一种探测方式
modules:
# HTTP 2xx 探测模块
# 用于探测 HTTP 服务是否返回 2xx 状态码
http_2xx:
# 使用 HTTP 探针
prober: http
# 探测超时时间为 2 秒
timeout: 2s
# HTTP 探针配置
http:
# 支持的 HTTP 版本
valid_http_versions: ["HTTP/1.1", "HTTP/2"]
# 有效的 HTTP 状态码
valid_status_codes: [200,301,302]
# HTTP 请求方法为 GET
method: GET
# 优先使用 IPv4 协议
preferred_ip_protocol: "ip4"
# ruoyi_howlaisi_com: 监控 https://ruoyi.howlaisi.com 站点
# 配置说明:
# - prober: http 使用HTTP探针
# - timeout: 5s 超时时间5秒
# - valid_status_codes: [200,301,302] 有效状态码
# - fail_if_not_ssl: true 如果不是SSL连接则失败(因为是HTTPS站点)
ruoyi_howlaisi_com:
# 使用 HTTP 探针
prober: http
# 探测超时时间为 5 秒
timeout: 5s
# HTTP 探针配置
http:
# 支持的 HTTP 版本
valid_http_versions: ["HTTP/1.1", "HTTP/2"]
# 有效的 HTTP 状态码
valid_status_codes: [200,301,302]
# HTTP 请求方法为 GET
method: GET
# 优先使用 IPv4 协议
preferred_ip_protocol: "ip4"
# 不检查是否为 SSL 连接(设为 false)
fail_if_ssl: false
# 检查是否为 SSL 连接(设为 true,因为是 HTTPS 站点)
fail_if_not_ssl: true
# 通用HTTPS应用监控模块
# 适用于所有需要监控HTTPS连接的应用
https_app:
# 使用 HTTP 探针
prober: http
# 探测超时时间为 5 秒
timeout: 5s
# HTTP 探针配置
http:
# 支持的 HTTP 版本
valid_http_versions: ["HTTP/1.1", "HTTP/2"]
# 有效的 HTTP 状态码
valid_status_codes: [200,301,302]
# HTTP 请求方法为 GET
method: GET
# 优先使用 IPv4 协议
preferred_ip_protocol: "ip4"
# 检查是否为 SSL 连接(设为 true)
fail_if_not_ssl: true
# TCP 连接探测模块
# 用于探测 TCP 端口是否开放
tcp_connect:
# 使用 TCP 探针
prober: tcp
# 探测超时时间为 2 秒
timeout: 2s
2.6 探测配置
# probe/infrastructure/www-probe.yaml
# Probe 资源定义
# 用于告诉 Prometheus Operator 需要探测哪些目标
kind: Probe
apiVersion: monitoring.coreos.com/v1
metadata:
# Probe 资源名称
name: www-probe
spec:
# 探测间隔为 15 秒
# 可选值:5s, 10s, 30s, 1m, 5m 等
# 默认值:60s
interval: 15s
# 使用的探测模块为 https_app
# 该模块在 blackbox.yml 配置文件中定义
# 可选值:http_2xx, https_app, tcp_connect 等
module: https_app
# Blackbox Exporter 地址
# Prometheus 通过该地址访问 Blackbox Exporter 执行探测
prober:
# Blackbox Exporter 服务地址和端口
# 格式:service-name.namespace:port
url: blackbox-exporter-node.infrastructure:9115
# 探测目标配置
targets:
# 静态配置方式定义探测目标
staticConfig:
# 自定义标签,用于标识应用
# 这些标签会被添加到生成的指标中,便于查询和分类
labels:
# 应用标识标签
application: www-frontend
# 静态探测目标列表
# 每个目标都是一个需要探测的 URL
static:
# 探测目标 URL
# Blackbox Exporter 会通过 HTTPS 协议探测这些地址
- https://www.howlaisi.com
- https://howlaisi.com
这部分配置定义了一个 Probe 资源,用于监控网站的可用性:
- kind: Probe - 指定资源类型为 Probe,这是 Prometheus Operator 提供的自定义资源
- apiVersion: monitoring.coreos.com/v1 - 使用的 API 版本
- metadata.name: www-probe - Probe 资源的名称,必须在同一名空间内唯一
- spec.interval: 15s - 探测间隔,表示每隔 15 秒执行一次探测
- spec.module: https_app - 使用的探测模块,对应 blackbox.yml 中定义的模块
- spec.prober.url - Blackbox Exporter 的服务地址,Prometheus 通过此地址发起探测请求
- spec.targets.staticConfig.labels - 为探测目标添加标签,这些标签会附加到生成的指标中
- spec.targets.staticConfig.static - 需要探测的目标 URL 列表
工作原理:
- Prometheus Operator 监听 Probe 资源的创建和变更
- 根据 Probe 配置生成相应的 Prometheus 作业配置
- Prometheus 定期向 blackbox-exporter-node.infrastructure:9115 发送探测请求
- Blackbox Exporter 接收到请求后,根据指定的 module 对目标 URL 进行探测
- 探测结果以指标形式暴露,Prometheus 抓取这些指标用于监控和告警


2.7 Kustomize 配置
# base/kustomization.yaml
# 基础层 Kustomize 配置
# 定义基础资源配置和补丁
resources:
# 引用基础资源文件
- ./deployment.yaml
- ./service.yaml
- ./configmap.yaml
# 应用补丁文件
patches:
- ./mount.yaml
- ./probe.yaml
# 通用注解,会添加到所有资源上
commonAnnotations:
# 应用标识
application: blackbox-exporter应用
# 通用标签,会添加到所有资源上
commonLabels:
# 应用标签
app: black-exporter
# overlays/infrastructure/kustomization.yaml
# 基础设施层 Kustomize 配置
# 定义基础设施环境的特定配置
resources:
# 引用基础层配置
- ../../base
# 引用探测配置
- ./probe
# 部署命名空间为 infrastructure
namespace: infrastructure
# 镜像替换配置
images:
# 替换 blackbox-exporter-image 镜像
- name: blackbox-exporter-image
# 新镜像名称
newName: k8s-harbor:30002/prom/blackbox-exporter
# 新镜像标签
newTag: v0.21.0
# overlays/infrastructure/probe/infrastructure/kustomization.yaml
# 探测资源配置
# 定义所有需要探测的目标
resources:
# 各个探测目标配置文件
- www-probe.yaml
三、配置参数详解
3.1 Blackbox Exporter 配置参数
| 参数 | 说明 | 可选值/示例 |
|---|---|---|
prober | 探测器类型 | http, tcp, icmp, dns |
timeout | 探测超时时间 | 2s, 5s, 10s |
valid_http_versions | 有效的HTTP版本 | ["HTTP/1.1", "HTTP/2"] |
valid_status_codes | 有效的HTTP状态码 | [200,301,302] |
method | HTTP方法 | GET, POST |
preferred_ip_protocol | 优先使用的IP协议 | ip4, ip6 |
fail_if_ssl | 如果是SSL连接则失败 | true, false |
fail_if_not_ssl | 如果不是SSL连接则失败 | true, false |
3.2 Probe 配置参数
| 参数 | 说明 | 可选值/示例 | 默认值 |
|---|---|---|---|
apiVersion | API版本 | monitoring.coreos.com/v1 | - |
kind | 资源类型 | Probe | - |
metadata.name | Probe名称 | www-probe | - |
spec.interval | 探测间隔 | 15s, 30s, 1m, 5m等 | 60s |
spec.module | 使用的探测模块 | https_app, http_2xx | http_2xx |
spec.prober.url | Blackbox Exporter 地址 | blackbox-exporter-node.infrastructure:9115 | - |
spec.targets.staticConfig.static | 探测目标列表 | https://www.howlaisi.com | - |
spec.targets.staticConfig.labels | 自定义标签 | application: www-frontend | - |
3.3 Prometheus 配置参数
| 参数 | 说明 | 可选值/示例 | 默认值 |
|---|---|---|---|
probeNamespaceSelector | 选择包含 Probe 的命名空间 | matchLabels: {monitoring: probe} | {} |
probeSelector | 选择要监控的 Probe | matchLabels: {app: blackbox-exporter} | {} |
四、Argo CD 应用配置
通过 Argo CD 实现 GitOps 方式的持续部署:
# infrastructure/blackbox-exporter-0210.yaml
# Argo CD Application 配置
# 用于定义如何通过 GitOps 方式部署 Blackbox Exporter
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
# Application 名称
name: blackbox-exporter-0210
spec:
# 目标集群配置
destination:
# 目标集群名称(空表示默认集群)
name: ''
# 目标命名空间
namespace: infrastructure
# 目标集群地址
server: 'https://kubernetes.default.svc'
# 源码配置
source:
# 配置路径
path: howlaisi-workspace/infrastructure/blackbox-exporter/blackbox-exporter-0210/overlays/infrastructure
# Git 仓库地址
repoURL: 'http://192.168.3.3/howlaisi/argocd-gitops.git'
# 目标分支
targetRevision: HEAD
# Argo CD 项目
project: default
# 同步策略配置
syncPolicy:
# 自动化同步配置
automated:
# 自动清理已删除的资源
prune: true
# 自动修复配置偏差
selfHeal: true
五、Grafana 仪表盘推荐
集成监控后,可以使用以下常用的 Grafana 仪表盘来可视化 Blackbox Exporter 指标:
5.1 推荐的仪表盘 ID
| 仪表盘名称 | ID | 说明 |
|---|---|---|
| Prometheus Blackbox Exporter | 7587 | 官方提供的 Blackbox Exporter 仪表盘 |
| Blackbox Exporter Overview | 13659 | 包含丰富的探测指标展示 |
| Blackbox Exporter HTTP Prober | 12006 | 专门针对 HTTP 探测的监控面板 |
![]() |
六、关键配置说明
6.1 探测模块配置
Blackbox Exporter 支持多种探测模块:
- http_2xx:HTTP 探测,检查返回状态码是否为 2xx
- https_app:HTTPS 应用探测,验证 SSL 证书
- tcp_connect:TCP 连接探测,检查端口是否开放
6.2 资源限制配置
根据实际业务负载情况,合理配置资源请求和限制:
# 资源限制和请求配置
resources:
# 资源限制,防止容器消耗过多资源
limits:
cpu: 200m # CPU 使用上限为 200 毫核
memory: 256Mi # 内存使用上限为 256 兆字节
# 资源请求,保证容器运行所需的最小资源
requests:
cpu: 100m # CPU 请求为 100 毫核
memory: 50Mi # 内存请求为 50 兆字节
七、监控指标说明
Blackbox Exporter 提供了丰富的监控指标,主要包括:
-
探测结果指标:
probe_success:探测是否成功(1为成功,0为失败)probe_duration_seconds:探测持续时间
-
HTTP探测指标:
probe_http_status_code:HTTP状态码probe_http_content_length:响应内容长度probe_http_redirects:重定向次数
-
SSL证书指标:
probe_ssl_earliest_cert_expiry:最早过期证书时间probe_ssl_last_chain_expiry_timestamp_seconds:证书链最后过期时间
八、部署验证
部署完成后,可以通过以下方式验证是否正常工作:
-
检查 Pod 状态:
kubectl get pods -n infrastructure | grep blackbox-exporter -
检查 Service 是否正常:
kubectl get svc -n infrastructure | grep blackbox-exporter -
验证探测是否正常工作:
kubectl port-forward svc/blackbox-exporter-node 9115:9115 -n infrastructure然后访问
http://localhost:9115/probe?module=http_2xx&target=https://howlaisi.com查看探测结果 -
检查 Prometheus 是否成功抓取指标:
在 Prometheus UI 中查询 probe 相关指标
九、常见问题与解决方案
9.1 探测失败问题
如果探测失败,需要检查以下几点:
- 探测目标是否可访问
- 网络策略是否阻止了访问
- SSL证书是否有效
- 探测模块配置是否正确
9.2 DNS解析问题
如果遇到DNS解析问题:
- 检查Kubernetes集群DNS配置
- 确认目标域名是否正确
- 验证网络连通性
9.3 证书验证失败
对于HTTPS探测,如果证书验证失败:
- 检查证书是否过期
- 确认证书链是否完整
- 验证证书域名是否匹配
9.4 Prometheus Targets 页面不显示 Probe 目标
这是一个常见但容易忽略的问题。即使成功创建了 Probe 对象,在 Prometheus Targets 页面也可能看不到相应的探测目标。
根本原因
Prometheus Operator 不会自动采集所有命名空间中的 Probe 资源。只有当 Prometheus 实例的配置明确指定要监控包含 Probe 的命名空间时,这些 Probe 才会被加载和执行。
换句话说,虽然通过以下命令成功创建了 Probe:
kubectl apply -f probe.yaml
但如果 Prometheus 的 CRD(Prometheus 资源)没有配置去监控这个 Probe 所在的命名空间(例如 infrastructure),Prometheus 根本不会加载这个 Probe。
逐步排查与修正
① 检查 Prometheus 实例是否配置了 probeNamespaceSelector
执行以下命令查看 Prometheus 配置:
kubectl -n kubesphere-monitoring-system get prometheus -o yaml
在输出中找到类似以下的配置:
spec:
probeNamespaceSelector: {}
probeSelector: {}
如果 probeNamespaceSelector 没有配置,表示只会监控和 Prometheus 同一命名空间的 Probe 对象。
如果您的 Probe 在 infrastructure 命名空间,而 Prometheus 在 kubesphere-monitoring-system 命名空间,就不会被采集。
解决方式
修改 Prometheus CRD 配置:
spec:
probeNamespaceSelector: {}
probeSelector: {}
验证配置是否生效
修改完 Prometheus 配置后,可以通过以下方式验证:
- 检查 Prometheus 配置是否已更新:
kubectl -n kubesphere-monitoring-system get prometheus -o yaml
-
检查 Prometheus Targets 页面是否显示 Probe 目标
-
查看 Prometheus 日志确认是否有相关错误信息:
kubectl -n kubesphere-monitoring-system logs prometheus-k8s-0
十、性能优化建议
- 合理设置探测间隔,避免过于频繁的探测影响网络性能
- 根据实际需要调整资源限制,避免资源浪费
- 对于关键业务系统,可以设置更短的探测间隔
- 定期审查探测目标,移除不再需要的探测
总结
通过 Blackbox Exporter 与 Prometheus 的集成,我们可以实现对网络服务的全面监控。结合 Argo CD 的 GitOps 部署方式,能够确保监控配置的一致性和可追溯性。合理配置探测模块和告警规则,有助于及时发现和解决网络连通性问题,保障业务系统的稳定运行。

评论区