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 ,需要配置。默认使用 IPv6 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
配置了 prober
为 http
类型的 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
|