Prometheus: HTTP-Überwachung über den Blackbox-Exporter

Hallo zusammen. Im Mai startet OTUS ein Praktikum zu Monitoring und Logging, sowohl für Infrastruktur als auch für Anwendungen mit Zabbix, Prometheus, Grafana und ELK. Aus diesem Grund teilen wir traditionell nützliche Materialien zu diesem Thema.

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

Umgebung

Wir benötigen Folgendes:

  • Kubernetes
  • Prometheus Operator

Konfiguration des Blackbox-Exporters

Wir konfigurieren die Blackbox über ConfigMap zur Einstellung http des Moduls für das Monitoring 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, dass der Webdienst den HTTP-Statuscode 2xx zurückgibt. Weitere Informationen zur Konfiguration des Blackbox-Exporters finden Sie in der Dokumentation..

Deployment des Blackbox-Exporters im Kubernetes-Cluster

Beschreiben Sie Deployment und Service für das Deployment 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. Namespace monitoring bezieht sich auf den Prometheus-Operator.

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

Stellen Sie sicher, dass alle Dienste laufen, indem Sie den folgenden Befehl verwenden:

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

Überprüfung der Blackbox

Sie können auf die Weboberfläche des Blackbox-Exporters zugreifen über 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 localhost:9115.

Prometheus: HTTP-Überwachung über den Blackbox-Exporter

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

Prometheus: HTTP-Überwachung über den Blackbox-Exporter

Metrikwert probe_success gleich 1 bedeutet eine erfolgreiche Überprüfung. Ein Wert von 0 weist auf einen Fehler hin.

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.

Generierung von Secret, indem Sie 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

Angeben 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

Öffnen Sie die Weboberfläche von Prometheus, um Metriken und Ziele zu überprüfen.

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

Prometheus: HTTP-Überwachung über den Blackbox-Exporter

Prometheus: HTTP-Überwachung über den Blackbox-Exporter

Sie sehen die Metriken und Ziele von Blackbox.

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

Um Benachrichtigungen vom Blackbox-Exporter zu erhalten, fügen wir Regeln im 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  LABELS: {{ $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: "Die Blackbox-Probe dauerte mehr als 1s zur Fertigstellungn  WERT = {{ $value }}n  LABELS: {{ $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  LABELS: {{ $labels }}"
    - alert: SslCertificateWillExpireSoon
      expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "SSL-Zertifikat läuft bald ab (Instanz {{ $labels.instance }})"
        description: "SSL-Zertifikat läuft in 30 Tagen abn  WERT = {{ $value }}n  LABELS: {{ $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  LABELS: {{ $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  LABELS: {{ $labels }}"

Im Web-Interface von Prometheus gehen Sie zu Status => Regeln und finden Sie die Benachrichtigungsregeln für den blackbox-exporter.

Prometheus: HTTP-Überwachung über den Blackbox-Exporter

Konfiguration 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 wir das Blackbox-Exporter-Modul für die Authentifizierung des Kubernetes API Servers hinzu.

kubectl --namespace=monitoring edit configmap prometheus-blackbox-exporter
...
      kube-api:
        http:
          methode: GET
          no_follow_redirects: false
          bevorzugtes_ip_protokoll: ip4
          tls_config:
            insecure_skip_verify: false
            ca_datei: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
          bearer_token_datei: /var/run/secrets/kubernetes.io/serviceaccount/token
          gültige_http_versionen:
          - HTTP/1.1
          - HTTP/2
          gültige_status_codes: []
        prober: http
        timeout: 5s

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

- job_name: 'kube-api-blackbox'
  metrics_path: /probe
  params:
    modul: [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.

Wenden wir das Prometheus Secret an.

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

Fügen wir die Benachrichtigungsregeln 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

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster