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 — нет, остальные метрики объясняют причину.