Prometheus: HTTP-Monitoring über den Blackbox-Exporter

Hallo zusammen. Im Mai startet OTUS einen Praktikum über Überwachung und Protokollierung, sowohl für Infrastrukturen als auch für Anwendungen mit Zabbix, Prometheus, Grafana und ELK. In diesem Zusammenhang teilen wir traditionell nützliche Materialien zu diesem Thema.

Der Blackbox-Exporter für Prometheus ermöglicht die Überwachung externer Dienste über HTTP, HTTPS, DNS, TCP, ICMP. In diesem Artikel zeige ich Ihnen, wie Sie HTTP/HTTPS-Überwachung mit dem Blackbox-Exporter einrichten. Wir werden den Blackbox-Exporter in Kubernetes ausführen.

Umgebung

Wir brauchen Folgendes:

  • Kubernetes
  • Prometheus Operator

Konfiguration des Blackbox-Exporters

Wir konfigurieren Blackbox über ConfigMap zur Einrichtung http des Moduls zur Überwachung von Webdiensten.

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

Modul http_2xx wird verwendet, um zu überprüfen, ob der Webdienst den HTTP-Statuscode 2xx zurückgibt. Die Konfiguration des Blackbox-Exporters ist detailliert beschrieben in Dokumentation.

Bereitstellung des Blackbox-Exporters im Kubernetes-Cluster

Beschreiben Sie Deployment und Service für die Bereitstellung in 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

Der Blackbox-Exporter kann mit dem folgenden Befehl bereitgestellt werden. Der Namespace monitoring bezieht sich auf den Prometheus-Operator.

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

Stellen Sie sicher, dass alle Dienste mit dem folgenden Befehl ausgeführt werden:

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

Blackbox-Überprüfung

Sie können auf die Weboberfläche des Blackbox-Exporters zugreifen unter port-forward:

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

Verbinden Sie sich über einen Webbrowser mit der Weboberfläche des Blackbox-Exporters unter der Adresse localhost:9115.

Prometheus: HTTP-Monitoring über den Blackbox-Exporter

Wenn Sie die Adresse http://localhost:9115/probe?module=http_2xx&target=https://www.google.com, aufrufen, sehen Sie das Ergebnis der Überprüfung der angegebenen URL (https://www.google.com).

Prometheus: HTTP-Monitoring über den Blackbox-Exporter

Metrikwert probe_success gleich 1 bedeutet eine erfolgreiche Überprüfung. Der Wert 0 zeigt einen Fehler an.

Konfiguration von Prometheus

Nachdem der BlackBox-Exporter bereitgestellt wurde, konfigurieren wir Prometheus in 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 # Der Blackbox-Exporter.

Generieren wir Geheimnis, indem wir den folgenden Befehl verwenden.

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

Geben Sie an additional-scrape-configs für den Prometheus Operator, unter Verwendung von additionalScrapeConfigs.

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

Gehen Sie zur Weboberfläche von Prometheus und überprüfen Sie die Metriken und Ziele.

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

Prometheus: HTTP-Monitoring über den Blackbox-Exporter

Prometheus: HTTP-Monitoring über den Blackbox-Exporter

Wir sehen die Metriken und Ziele des Blackbox.

Hinzufügen von Regeln für Benachrichtigungen (alert)

Um Benachrichtigungen vom Blackbox-Exporter zu erhalten, fügen wir Regeln zum Prometheus Operator hinzu.

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: "Probe fehlgeschlagen (Instanz {{ $labels.instance }})"
        description: "Probe fehlgeschlagenn  WERT = {{ $value }}n  ETIKETTEN: {{ $labels }}"
    - alert: SlowProbe
      expr: avg_over_time(probe_duration_seconds[1m]) > 1
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Langsame Probe (Instanz {{ $labels.instance }})"
        description: "Blackbox-Probe dauerte mehr als 1s zur Vervollständigungn  WERT = {{ $value }}n  ETIKETTEN: {{ $labels }}"
    - alert: HttpStatusCode
      expr: probe_http_status_code = 400
      for: 5m
      labels:
        severity: error
      annotations:
        summary: "HTTP-Statuscode (Instanz {{ $labels.instance }})"
        description: "HTTP-Statuscode ist nicht 200-399n  WERT = {{ $value }}n  ETIKETTEN: {{ $labels }}"
    - alert: SslCertificateWillExpireSoon
      expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "SSL-Zertifikat wird bald ablaufen (Instanz {{ $labels.instance }})"
        description: "SSL-Zertifikat läuft in 30 Tagen abn  WERT = {{ $value }}n  ETIKETTEN: {{ $labels }}"
    - alert: SslCertificateHasExpired
      expr: probe_ssl_earliest_cert_expiry - time()  1
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Langsame HTTP-Anfragen (Instanz {{ $labels.instance }})"
        description: "HTTP-Anfrage dauerte mehr als 1sn  WERT = {{ $value }}n  ETIKETTEN: {{ $labels }}"
    - alert: SlowPing
      expr: avg_over_time(probe_icmp_duration_seconds[1m]) > 1
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Langsame Ping (Instanz {{ $labels.instance }})"
        description: "Blackbox-Ping dauerte mehr als 1sn  WERT = {{ $value }}n  ETIKETTEN: {{ $labels }}"

Im Webinterface von Prometheus gehen Sie zum Abschnitt Status => Regeln und suchen Sie die Alarmeinstellungen für den Blackbox-Exporter.

Prometheus: HTTP-Monitoring über den Blackbox-Exporter

Einrichtung von Benachrichtigungen über das Ablaufen von SSL-Zertifikaten für den Kubernetes API-Server.

Lassen Sie uns das Monitoring für das Ablaufen von SSL-Zertifikaten des Kubernetes API-Servers einrichten. Es wird einmal pro Woche Benachrichtigungen senden.

Fügen Sie das Blackbox-Exportermodul für die Authentifizierung des Kubernetes API-Servers hinzu.

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

Fügen Sie die Scrape-Konfiguration für Prometheus hinzu.

- 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 # Der Blackbox-Exporter.

Verwenden von 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

Wir fügen Alarmregeln hinzu

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: "Das SSL-Zertifikat des Kubernetes API Servers läuft in drei Monaten ab (Instanz {{ $labels.instance }})"
        description: "Das SSL-Zertifikat des Kubernetes API Servers läuft in 90 Tagen abn  WERT = {{ $value }}n  LABELS: {{ $labels }}"

Nützliche Links

Überwachung und Protokollierung in Docker

Quelle: habr.com

60GB SSD 8Gb DDR4