Prometheus blackbox export 安装配置

blackbox_exporter 是一个由 Prometheus 社区维护的项目,它允许用户通过 HTTP、HTTPS、DNS、TCP 和 ICMP 协议对服务进行“黑盒”方式的探测,以检测和监控网络协议的可用性和响应时间。

本文档以在 Kubernetes 中部署 blackbox_exporter 为例,演示其使用方法。

为了能够监控到 Kubernetes 集群内部的部分信息(如 api-server 的证书等),建议 参考文档为其配置 RBAC 策略 以使其能读取 kube-apiserver 相关资源,本文档中的配置示例基于此权限配置。Namespace 为 prometheus

Kubernetes 中部署 blackbox_export

创建 ConfigMap 以外部化 blackbox_export 配置

blackbox_export 基于配置文件运行,将其配置文件通过 Kubernetes 的 ConfiMap 存储,分离运行环境和配置,方便管理。

参考以下配置,创建 ConfigMap

apiVersion: v1
data:
blackbox.yml: |-
modules:
http_2xx:
prober: http
timeout: 10s
http:
preferred_ip_protocol: "ip4" ##如果http监测是使用ipv4 就要写上
tcp_connect:
prober: tcp
kind: ConfigMap
metadata:
name: blackbox-export-config
namespace: prometheus

部署 blackbox_export

参考以下内容,创建 Deployment 和 Service,在此配置中,使用上面创建的 ConfigMap 作为 blackbox_export 的配置文件

apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus-blackbox-export
namespace: prometheus
labels:
app: prometheus-blackbox-export
spec:
replicas: 1
selector:
matchLabels:
app: prometheus-blackbox-export
template:
metadata:
labels:
app: prometheus-blackbox-export
spec:
containers:
- name: prometheus-blackbox-export
image: bitnami/blackbox-exporter
args:
- "--config.file=/etc/blackbox/blackbox.yml"
ports:
- containerPort: 9115
resources:
requests:
cpu: 500m
memory: 500M
limits:
cpu: 1
memory: 1Gi
volumeMounts:
- name: blackbox-config-volume
mountPath: /etc/blackbox/
volumes:
- name: blackbox-config-volume
configMap:
defaultMode: 420
name: blackbox-export-config
---
apiVersion: v1
kind: Service
metadata:
name: blackbox-service
namespace: prometheus
spec:
ports:
- name: blackbox-port
port: 9115
protocol: TCP
targetPort: 9115
selector:
app: prometheus-blackbox-export

部署成功后,从 prometheus 的 Namespace 中测试访问 blackbox_export 的 Endpoint blackbox-service:9115,如果是在其他 Namespace,可以使用 Endpoint blackbox-service.prometheus.svc.cluster.local:9115。如果集群的域名不是 cluster.local,修改为实际值。


prometheus-7589d5bbdd-xdjwt:~# curl -v blackbox-service:9115
* Trying 10.111.137.0:9115...
* Connected to blackbox-service (10.111.137.0) port 9115 (#0)
> GET / HTTP/1.1
> Host: blackbox-service:9115
> User-Agent: curl/8.0.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/html
< Date: Tue, 26 Sep 2023 09:11:25 GMT
< Content-Length: 544
<
<html>
<head><title>Blackbox Exporter</title></head>
<body>
<h1>Blackbox Exporter</h1>
<p><a href="probe?target=prometheus.io&module=http_2xx">Probe prometheus.io for http_2xx</a></p>
<p><a href="probe?target=prometheus.io&module=http_2xx&debug=true">Debug probe prometheus.io for http_2xx</a></p>
<p><a href="metrics">Metrics</a></p>
<p><a href="config">Configuration</a></p>
<h2>Recent Probes</h2>
<table border='1'><tr><th>Module</th><th>Target</th><th>Result</th><th>Debug</th></table></body>
* Connection #0 to host blackbox-service left intact
</html>

Prometheus 读取 blackbox_exporter 数据

在 Prometheus 配置中添加以下内容,使 Prometheus 抓取 black_exporter 的监控数据

- job_name: 'blackbox_http_2xx'
scrape_interval: 60s
metrics_path: /probe
params:
module: [http_2xx] # Look for a HTTP 200 response.
static_configs:
- targets:
- http://www.google.com:5000/
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-service.prometheus.svc.cluster.local:9115

部署完成后,观察过 Prometheus 的 Target,正常情况下可以看到监控目标的状态。

使用示例

使用 blackbox_exporter 和 Prometheus 监控 Kubernetes API Server 的 Endpoint

本示例演示使用 blackbox_exporter 和 Prometheus 监控 Kubernetes API Server 的 Endpoint,Kubernetes 集群默认的域为 cluster.local,本示例中的 Kubernetes 集群使用默认域。Kubernetes 集群中和 kube-apiserver 的通信一般都是使用 HTTPS,因此在使用 blackbox_exporter 监控时需要指定使用 HTTPS 请求 kube-apiserver,同时可以达到监控 kube-apiserver HTTPS 证书的目的。

使用 kubeadmin 初始化的集群默认使用自签名的证书,客户端使用 HTTPS 访问时需要提供 CA 证书。以下 blackbox_exporter 配置中,模块 http_k8s_cluster 配置了必须使用 HTTPS 请求 Endpoint,并且配置了 CA 路径

modules:
http_2xx:
prober: http
timeout: 10s
http:
preferred_ip_protocol: "ip4" ##如果http监测是使用ipv4 就要写上
tcp_connect:
prober: tcp
http_k8s_cluster:
prober: http
timeout: 5s
http:
method: GET
fail_if_ssl: false
fail_if_not_ssl: true
valid_status_codes: [200, 403]
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: false

在 Prometheus 配置中添加以下 Target,用于监控 kube-apiserver 的 Endpoint https://kubernetes.default.svc.cluster.local

- job_name: 'blackbox_http_k8s_cluster'
scrape_interval: 60s
metrics_path: /probe
params:
module: [http_k8s_cluster] # Look for a HTTP 200 response.
static_configs:
- targets:
- https://kubernetes.default.svc.cluster.local
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-service.prometheus.svc.cluster.local:9115

配置成功后,观察 Prometheus 中的 Targets,可以看到 Targets 状态

监控 HTTPS 类型 的 Endpoints 的证书过期时间

假如在 blackbox_exporter 配置了 proberhttp 类型的 module,当在 Prometheus 中配置的 targets 的请求协议使用 https 时,blackbox_exporter 提供了关于证书的监控指标。配置示例可以参考 使用 blackbox_exporter 和 Prometheus 监控 Kubernetes API Server 的 Endpoint

probe_ssl_earliest_cert_expiry 指标显示了证书链中最早到期的证书的过期时间。其值是一个 Unix 时间戳,表示证书的过期日期和时间。

如果要计算证书剩余的有效天数,可以使用以下表达式计算

(probe_ssl_earliest_cert_expiry - time()) / 86400