Prometheus: мониторинг на HTTP чрез Blackbox експортер

Здравейте на всички. През май OTUS стартира практически курс по мониторинг и логване, както на инфраструктура, така и на приложения с помощта на Zabbix, Prometheus, Grafana и ELK. В този контекст традиционно споделяме полезни материали по темата.

Blackbox експортер за Prometheus позволява мониторинг на външни услуги чрез HTTP, HTTPS, DNS, TCP, ICMP. В тази статия ще ви покажа как да настроите мониторинг на HTTP/HTTPS с помощта на Blackbox експортер. Ще стартираме Blackbox експортер в Kubernetes.

Окръжение

Нам потребуется следующее:

  • Kubernetes
  • Prometheus Operator

Конфигурация на blackbox експортер

Конфигурираме Blackbox чрез ConfigMap за настройка http модул за мониторинг на уеб услуги.

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-blackbox-exporter
  labels:
    app: prometheus-blackbox-exporter
data:
  blackbox.yaml: |
    modules:
      http_2xx:
        http:
          no_follow_redirects: false
          preferred_ip_protocol: ip4
          valid_http_versions:
          - HTTP/1.1
          - HTTP/2
          valid_status_codes: []
        prober: http
        timeout: 5s

Модулът http_2xx се използва за проверка на това дали уеб услугата връща код на състояние HTTP 2xx. Подробности за конфигурацията на blackbox експортер са описани в документацията.

Деплой на blackbox експортер в Kubernetes клъстера

Опишете Deployment и Service за разворане в Kubernetes.

---
kind: Service
apiVersion: v1
metadata:
  name: prometheus-blackbox-exporter
  labels:
    app: prometheus-blackbox-exporter
spec:
  type: ClusterIP
  ports:
    - name: http
      port: 9115
      protocol: TCP
  selector:
    app: prometheus-blackbox-exporter

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-blackbox-exporter
  labels:
    app: prometheus-blackbox-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus-blackbox-exporter
  template:
    metadata:
      labels:
        app: prometheus-blackbox-exporter
    spec:
      restartPolicy: Always
      containers:
        - name: blackbox-exporter
          image: "prom/blackbox-exporter:v0.15.1"
          imagePullPolicy: IfNotPresent
          securityContext:
            readOnlyRootFilesystem: true
            runAsNonRoot: true
            runAsUser: 1000
          args:
            - "--config.file=/config/blackbox.yaml"
          resources:
            {}
          ports:
            - containerPort: 9115
              name: http
          livenessProbe:
            httpGet:
              path: /health
              port: http
          readinessProbe:
            httpGet:
              path: /health
              port: http
          volumeMounts:
            - mountPath: /config
              name: config
        - name: configmap-reload
          image: "jimmidyson/configmap-reload:v0.2.2"
          imagePullPolicy: "IfNotPresent"
          securityContext:
            runAsNonRoot: true
            runAsUser: 65534
          args:
            - --volume-dir=/etc/config
            - --webhook-url=http://localhost:9115/-/reload
          resources:
            {}
          volumeMounts:
            - mountPath: /etc/config
              name: config
              readOnly: true
      volumes:
        - name: config
          configMap:
            name: prometheus-blackbox-exporter

Blackbox експортер може да бъде разположен с помощта на следната команда. Пространството от имената monitoring се отнася до Prometheus Operator.

kubectl --namespace=monitoring apply -f blackbox-exporter.yaml

Уверете се, че всички услуги са стартирани, използвайки следната команда:

kubectl --namespace=monitoring get all --selector=app=prometheus-blackbox-exporter

Проверка на Blackbox

Можете да получите достъп до уеб интерфейса на Blackbox експортер с помощта на port-forward:

kubectl --namespace=monitoring port-forward svc/prometheus-blackbox-exporter 9115:9115

Свържете се с уеб интерфейса на Blackbox експортер през уеб браузър на адрес localhost:9115.

Prometheus: мониторинг на HTTP чрез Blackbox експортер

Ако посетите адреса http://localhost:9115/probe?module=http_2xx&target=https://www.google.com, ще видите резултата от проверката на посочения URL (https://www.google.com).

Prometheus: мониторинг на HTTP чрез Blackbox експортер

Стойността на метриката probe_success 0 означава неуспешна проверка. Числото 1 показва успешен резултат.

Настройка на Prometheus

След като развернем BlackBox експортер, настройваме Prometheus в prometheus-additional.yaml.

- job_name: 'kube-api-blackbox'
  scrape_interval: 1w
  metrics_path: /probe
  params:
    module: [http_2xx]
  static_configs:
   - targets:
      - https://www.google.com
      - http://www.example.com
      - https://prometheus.io
  relabel_configs:
   - source_labels: [__address__]
     target_label: __param_target
   - source_labels: [__param_target]
     target_label: instance
   - target_label: __address__
     replacement: prometheus-blackbox-exporter:9115 # Blackbox експортер.

Генерираме Секретен, използвайки следната команда.

PROMETHEUS_ADD_CONFIG=$(cat prometheus-additional.yaml | base64)
cat << EOF | kubectl --namespace=monitoring apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: additional-scrape-configs
type: Opaque
data:
  prometheus-additional.yaml: $PROMETHEUS_ADD_CONFIG
EOF

Указваме additional-scrape-configs за Prometheus Operator, използвайки additionalScrapeConfigs.

kubectl --namespace=monitoring edit prometheuses k8s
...
spec:
  additionalScrapeConfigs:
    key: prometheus-additional.yaml
    name: additional-scrape-configs

Влизаме в уеб интерфейса на Prometheus, проверяваме метриките и целите.

kubectl --namespace=monitoring port-forward svc/prometheus-k8s 9090:9090

Prometheus: мониторинг на HTTP чрез Blackbox експортер

Prometheus: мониторинг на HTTP чрез Blackbox експортер

Виждаме метриките и целите на Blackbox.

Добавяне на правила за уведомления (alert)

За да получаваме известия от Blackbox експортер, добавяме правила в Prometheus Operator.

kubectl --namespace=monitoring edit prometheusrules prometheus-k8s-rules
...
  - name: blackbox-exporter
    rules:
    - alert: ProbeFailed
      expr: probe_success == 0
      for: 5m
      labels:
        severity: error
      annotations:
        summary: "Неуспешно пробване (инстанция {{ $labels.instance }})"
        description: "Неуспешно пробванеn  VALUE = {{ $value }}n  LABELS: {{ $labels }}"
    - alert: SlowProbe
      expr: avg_over_time(probe_duration_seconds[1m]) > 1
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Бавно пробване (инстанция {{ $labels.instance }})"
        description: "Blackbox пробването отнема повече от 1s за завършване n  VALUE = {{ $value }}n  LABELS: {{ $labels }}"
    - alert: HttpStatusCode
      expr: probe_http_status_code = 400
      for: 5m
      labels:
        severity: error
      annotations:
        summary: "HTTP статус код (инстанция {{ $labels.instance }})"
        description: "HTTP статус кодът не е 200-399n  VALUE = {{ $value }}n  LABELS: {{ $labels }}"
    - alert: SslCertificateWillExpireSoon
      expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "SSL сертификатът ще изтече скоро (инстанция {{ $labels.instance }})"
        description: "SSL сертификатът изтича след 30 дниn  VALUE = {{ $value }}n  LABELS: {{ $labels }}"
    - alert: SslCertificateHasExpired
      expr: probe_ssl_earliest_cert_expiry - time()  1
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Бавни HTTP заявки (инстанция {{ $labels.instance }})"
        description: "HTTP заявката отнема повече от 1sn  VALUE = {{ $value }}n  LABELS: {{ $labels }}"
    - alert: SlowPing
      expr: avg_over_time(probe_icmp_duration_seconds[1m]) > 1
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Бавен пинг (инстанция {{ $labels.instance }})"
        description: "Blackbox пинг отнема повече от 1sn  VALUE = {{ $value }}n  LABELS: {{ $labels }}"

В уеб интерфейса на Prometheus, отидете на Status => Rules и намерете правилата за уведомления за blackbox-exporter.

Prometheus: мониторинг на HTTP чрез Blackbox експортер

Настройка на уведомления за изтичане на SSL-сертификати на Kubernetes API Server

Нека настроим мониторинг на изтичането на срока на SSL сертификатите на Kubernetes API сървъра. Той ще изпраща известия веднъж седмично.

Добавяме модула Blackbox експортера за удостоверяване на Kubernetes API сървъра.

kubectl --namespace=monitoring edit configmap prometheus-blackbox-exporter
...
      kube-api:
        http:
          method: GET
          no_follow_redirects: false
          preferred_ip_protocol: ip4
          tls_config:
            insecure_skip_verify: false
            ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
          bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
          valid_http_versions:
          - HTTP/1.1
          - HTTP/2
          valid_status_codes: []
        prober: http
        timeout: 5s

Добавяме конфигурация за сбор на данни в Prometheus

- job_name: 'kube-api-blackbox'
  metrics_path: /probe
  params:
    module: [kube-api]
  static_configs:
   - targets:
      - https://kubernetes.default.svc/api
  relabel_configs:
   - source_labels: [__address__]
     target_label: __param_target
   - source_labels: [__param_target]
     target_label: instance
   - target_label: __address__
     replacement: prometheus-blackbox-exporter:9115 # Черният бокс експортер.

Прилагаме Prometheus Secret

PROMETHEUS_ADD_CONFIG=$(cat prometheus-additional.yaml | base64)
cat << EOF | kubectl --namespace=monitoring apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: additional-scrape-configs
type: Opaque
data:
  prometheus-additional.yaml: $PROMETHEUS_ADD_CONFIG
EOF

Добавяме правила за известия

kubectl --namespace=monitoring edit prometheusrules prometheus-k8s-rules
...
  - name: k8s-api-server-cert-expiry
    rules:
    - alert: K8sAPIServerSSLCertExpiringAfterThreeMonths
      expr: probe_ssl_earliest_cert_expiry{job="kube-api-blackbox"} - time() < 86400 * 90 
      for: 1w
      labels:
        severity: warning
      annotations:
        summary: "SSL сертификатът на Kubernetes API сървъра ще изтече след три месеца (инстанция {{ $labels.instance }})"
        description: "SSL сертификатът на Kubernetes API сървъра изтича след 90 дниn  VALUE = {{ $value }}n  LABELS: {{ $labels }}"

Полезни линкове

Мониторинг и логиране в Docker

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster