Prometheus: HTTP-monitoring via Blackbox exporter

Hallo allemaal. In mei start OTUS een praktijkopleiding over monitoring en logging, zowel van infrastructuren als van applicaties met behulp van Zabbix, Prometheus, Grafana en ELK. Daarom delen we traditioneel nuttig materiaal over dit onderwerp.

Blackbox exporter voor Prometheus maakt het mogelijk om externe services te monitoren via HTTP, HTTPS, DNS, TCP, ICMP. In dit artikel laat ik je zien hoe je HTTP/HTTPS monitoring instelt met de Blackbox exporter. We zullen de Blackbox exporter draaien in Kubernetes.

De omgeving

We hebben het volgende nodig:

  • Kubernetes
  • Prometheus Operator

Configuratie van de blackbox exporter

Laten we de Blackbox configureren via ConfigMap voor de instellingen http van de monitoring module voor webservices.

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

Module http_2xx wordt gebruikt om te controleren of de webservice een HTTP-statuscode 2xx retourneert. Meer details over de configuratie van de blackbox exporter zijn beschreven in de documentatie.

De deployment van de blackbox exporter in het Kubernetes-cluster

Beschrijf Deployment en Service voor de uitrol 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

De Blackbox exporter kan worden uitgerold met behulp van de volgende opdracht. De namespace monitoring verbindt aan de Prometheus Operator.

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

Zorg ervoor dat alle services draaien met de volgende opdracht:

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

Blackbox controle

U kunt toegang krijgen tot de webinterface van de Blackbox-exporteur met port-forward:

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

Verbind met de webinterface van de Blackbox-exporteur via een webbrowser op localhost:9115.

Prometheus: HTTP-monitoring via Blackbox exporter

Als u naar het adres gaat http://localhost:9115/probe?module=http_2xx&target=https://www.google.com, ziet u het resultaat van de controle van de opgegeven URL (https://www.google.com).

Prometheus: HTTP-monitoring via Blackbox exporter

De waarde van de metriek probe_success gelijk aan 1 duidt op een succesvolle controle. Een waarde van 0 betekent een fout.

Configuratie van Prometheus

Na de implementatie van de BlackBox-exporteur configureren we 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 # De blackbox-exporteur.

We genereren Secret, met de volgende opdracht.

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

Geef op additional-scrape-configs voor de Prometheus Operator, met gebruik van additionalScrapeConfigs.

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

Ga naar de webinterface van Prometheus, controleer de metriek en doelen.

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

Prometheus: HTTP-monitoring via Blackbox exporter

Prometheus: HTTP-monitoring via Blackbox exporter

We zien de metriek en doelen van Blackbox.

Regels toevoegen voor meldingen (alert)

Voor het ontvangen van meldingen van de Blackbox-exporteur voegen we regels toe aan de 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: "Probe mislukt (instance {{ $labels.instance }})"
        description: "Probe misluktn  WAARDE = {{ $value }}n  LABELS: {{ $labels }}"
    - alert: SlowProbe
      expr: avg_over_time(probe_duration_seconds[1m]) > 1
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Langzame probe (instance {{ $labels.instance }})"
        description: "Blackbox-probe duurde meer dan 1s om te voltooienn  WAARDE = {{ $value }}n  LABELS: {{ $labels }}"
    - alert: HttpStatusCode
      expr: probe_http_status_code = 400
      for: 5m
      labels:
        severity: error
      annotations:
        summary: "HTTP-statuscode (instance {{ $labels.instance }})"
        description: "HTTP-statuscode is niet 200-399n  WAARDE = {{ $value }}n  LABELS: {{ $labels }}"
    - alert: SslCertificateWillExpireSoon
      expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "SSL-certificaat verloopt binnenkort (instance {{ $labels.instance }})"
        description: "SSL-certificaat verloopt in 30 dagenn  WAARDE = {{ $value }}n  LABELS: {{ $labels }}"
    - alert: SslCertificateHasExpired
      expr: probe_ssl_earliest_cert_expiry - time()  1
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Langzame HTTP-verzoeken (instance {{ $labels.instance }})"
        description: "HTTP-verzoek duurde meer dan 1sn  WAARDE = {{ $value }}n  LABELS: {{ $labels }}"
    - alert: SlowPing
      expr: avg_over_time(probe_icmp_duration_seconds[1m]) > 1
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Langzame ping (instance {{ $labels.instance }})"
        description: "Blackbox-ping duurde meer dan 1sn  WAARDE = {{ $value }}n  LABELS: {{ $labels }}"

Ga in de webinterface van Prometheus naar Status => Rules en zoek de alarmregels voor blackbox-exporter.

Prometheus: HTTP-monitoring via Blackbox exporter

Configuratie van meldingen voor het verstrijken van SSL-certificaten op de Kubernetes API-server.

Laten we de monitoring voor het verstrijken van de SSL-certificaten op de Kubernetes API-server instellen. Dit zal één keer per week meldingen verzenden.

We voegen de Blackbox-exportermodule toe voor de Kubernetes API-serverauthenticatie.

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

We voegen de scrape-configuratie van Prometheus toe.

- 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 # De blackbox-exporteur.

Prometheus Secret toepassen

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

Waarschuwing regels toevoegen

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-certificaat van de Kubernetes API-server verloopt over drie maanden (instance {{ $labels.instance }})"
        description: "Het SSL-certificaat van de Kubernetes API-server verloopt over 90 dagenn  VALUE = {{ $value }}n  LABELS: {{ $labels }}"

Nuttige links

Monitoring en logging in Docker

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster