Blackbox exporter и Prometheus Probe для мониторинга эндпоинтов
Published: 2026-05-06
Prometheus собирает метрики с работающих подов. Но он не знает, доступны ли внешние URL, не скоро ли истекут TLS-сертификаты и возвращает ли HTTP-эндпоинт 200. Этим занимается blackbox exporter совместно с объектами Probe от Prometheus Operator.
Компоненты
prometheus-blackbox-exporter— выполняет HTTP/HTTPS/TCP-проверки по запросу и выдаёт результаты как Prometheus-метрики.- CRD
Probe— говорит Prometheus Operator, какой список URL проверять через blackbox exporter по расписанию.
Оба разворачиваются на каждом кластере. Blackbox exporter живёт в base/monitoring/exporters/blackbox-exporter/. Объекты Probe — в spoke/monitoring/.
HelmRelease для blackbox exporter
yamlapiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: blackbox-exporter
namespace: observability
spec:
chart:
spec:
chart: prometheus-blackbox-exporter
version: ">=8.0.0"
sourceRef:
kind: HelmRepository
name: prometheus-community
namespace: flux-system
interval: 1h
values:
config:
modules:
http_2xx:
prober: http
timeout: 10s
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
valid_status_codes: [200, 301, 302]
follow_redirects: true
tls_config:
insecure_skip_verify: false
http_2xx_insecure:
prober: http
timeout: 10s
http:
valid_status_codes: [200]
tls_config:
insecure_skip_verify: true
tcp_connect:
prober: tcp
timeout: 5s
serviceMonitor:
enabled: true
labels:
release: kube-prom-stack # должен совпадать с селектором Prometheus
Два HTTP-модуля: http_2xx для эндпоинтов с публичными сертификатами и http_2xx_insecure для внутренних сервисов с самоподписанными.
Объекты Probe
Объекты Probe находятся в слое spoke/monitoring/ — это отдельная Kustomization (dev-monitoring-spoke), которая запускается после dev-spoke: CRD Probe приходит из kube-prom-stack.
yamlapiVersion: monitoring.coreos.com/v1
kind: Probe
metadata:
name: external-endpoints
namespace: observability
spec:
interval: 60s
module: http_2xx
prober:
url: blackbox-exporter.observability.svc.cluster.local:9115
targets:
staticConfig:
static:
- https://elasticsearch.dev.test.example.com
- https://prometheus.dev.test.example.com
- https://headlamp.dev.test.example.com
- https://links.dev.test.example.com
relabelingConfigs:
- sourceLabels: [__address__]
targetLabel: instance
yamlapiVersion: monitoring.coreos.com/v1
kind: Probe
metadata:
name: internal-endpoints
namespace: observability
spec:
interval: 30s
module: tcp_connect
prober:
url: blackbox-exporter.observability.svc.cluster.local:9115
targets:
staticConfig:
static:
- elasticsearch-master.elasticsearch.svc.cluster.local:9200
- prometheus-operated.observability.svc.cluster.local:9090
Ключевые метрики
| Метрика | Значение |
|---|---|
probe_success |
1 — проба прошла, 0 — провалилась |
probe_duration_seconds |
полное время пробы |
probe_http_status_code |
HTTP-код ответа |
probe_ssl_earliest_cert_expiry |
Unix timestamp истечения ближайшего сертификата |
probe_dns_lookup_time_seconds |
время DNS-запроса |
Примеры запросов:
promql# Эндпоинты, которые сейчас недоступны
probe_success == 0
# Дней до истечения TLS-сертификата
(probe_ssl_earliest_cert_expiry - time()) / 86400
# Среднее время пробы за час
avg_over_time(probe_duration_seconds[1h])
Правила алертинга
yamlapiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: blackbox-alerts
namespace: observability
labels:
release: kube-prom-stack
spec:
groups:
- name: blackbox
rules:
- alert: EndpointDown
expr: probe_success == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Эндпоинт {{ $labels.instance }} недоступен"
description: "Проба завершается с ошибкой уже 2 минуты"
- alert: TLSCertExpiringSoon
expr: (probe_ssl_earliest_cert_expiry - time()) / 86400 < 14
for: 1h
labels:
severity: warning
annotations:
summary: "TLS сертификат {{ $labels.instance }} истекает через < 14 дней"
- alert: SlowEndpoint
expr: probe_duration_seconds > 5
for: 5m
labels:
severity: warning
annotations:
summary: "Эндпоинт {{ $labels.instance }} отвечает медленно"
EndpointDown срабатывает через 2 минуты неудачных проб — чтобы не генерировать шум от кратковременных сбоев. TLSCertExpiringSoon даёт 14 дней на обновление.
Почему мониторинг в отдельной Kustomization
CRD Probe устанавливается kube-prom-stack. Если dev-monitoring-spoke запустится одновременно с dev-spoke, объекты Probe могут применяться до создания CRD — это вызовет ошибку reconcile.
dependsOn: [dev-spoke] гарантирует, что слой мониторинга ждёт spoke-слой (включая установку kube-prom-stack) перед применением Probe и PrometheusRule.
yaml# Kustomization dev-monitoring-spoke
spec:
interval: 10m
path: ./fluxcd/projects/dev/kustomization/spoke/monitoring/
dependsOn:
- name: dev-spoke
namespace: dev
Отладка ошибок проб
Обратиться к blackbox exporter напрямую, чтобы увидеть, что именно он возвращает:
bash# Проверить URL через модуль http_2xx
kubectl port-forward -n observability svc/blackbox-exporter 9115:9115
curl "http://localhost:9115/probe?module=http_2xx&target=https://example.com"
Вывод — сырой Prometheus text format. probe_success 1 — проверка прошла, probe_success 0 — нет, остальные метрики объясняют причину.