بروميثيوس: رصد HTTP من خلال مصدر Blackbox

تحية للجميع. في شهر مايو ، أطلقت OTUS ورشة عمل حول المراقبة والتسجيل ، لكل من البنية التحتية والتطبيقات ، باستخدام Zabbix و Prometheus و Grafana و ELK. في هذا الصدد ، نشارك تقليديًا مواد مفيدة حول هذا الموضوع.




يسمح لك مُصدِّر Blackbox لـ Prometheus بمراقبة الخدمات الخارجية من خلال HTTP و HTTPS و DNS و TCP و ICMP. في هذه المقالة ، سأوضح لك كيفية تكوين مراقبة HTTP / HTTPS باستخدام مصدر Blackbox. سنطلق مصدر Blackbox في Kubernetes.

بيئة


سنحتاج إلى ما يلي:

  • Kubernetes
  • عامل بروميثيوس

تكوين مصدر 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. يتم وصف تكوين مصدر الصندوق الأسود بمزيد من التفصيل في الوثائق .

نشر مصدر الصندوق الأسود في مجموعة 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.

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.



إذا انتقلت إلى العنوان http: // localhost: 9115 / probe؟ Module = http_2xx & target = https: //www.google.com ، فسترى نتيجة التحقق من عنوان URL المحدد ( https://www.google.com ). تعني قيمة



المقياس probe_success1 تحقق ناجح. تشير قيمة 0 إلى خطأ.

إنشاء بروميثيوس


بعد نشر مصدر 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 # The blackbox exporter.

إنشاء 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

حدد additional-scrape-configsعامل بروميثيوس باستخدام 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





نرى مقاييس وأهداف Blackbox.

إضافة قواعد التنبيهات (تنبيه)


لتلقي إشعارات من مصدر Blackbox ، أضف القواعد إلى مشغل Prometheus.

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 failed (instance {{ $labels.instance }})"
        description: "Probe failed\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"
    - alert: SlowProbe
      expr: avg_over_time(probe_duration_seconds[1m]) > 1
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Slow probe (instance {{ $labels.instance }})"
        description: "Blackbox probe took more than 1s to complete\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"
    - alert: HttpStatusCode
      expr: probe_http_status_code <= 199 OR probe_http_status_code >= 400
      for: 5m
      labels:
        severity: error
      annotations:
        summary: "HTTP Status Code (instance {{ $labels.instance }})"
        description: "HTTP status code is not 200-399\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"
    - alert: SslCertificateWillExpireSoon
      expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "SSL certificate will expire soon (instance {{ $labels.instance }})"
        description: "SSL certificate expires in 30 days\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"
    - alert: SslCertificateHasExpired
      expr: probe_ssl_earliest_cert_expiry - time()  <= 0
      for: 5m
      labels:
        severity: error
      annotations:
        summary: "SSL certificate has expired (instance {{ $labels.instance }})"
        description: "SSL certificate has expired already\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"
    - alert: HttpSlowRequests
      expr: avg_over_time(probe_http_duration_seconds[1m]) > 1
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "HTTP slow requests (instance {{ $labels.instance }})"
        description: "HTTP request took more than 1s\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"
    - alert: SlowPing
      expr: avg_over_time(probe_icmp_duration_seconds[1m]) > 1
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Slow ping (instance {{ $labels.instance }})"
        description: "Blackbox ping took more than 1s\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"

في واجهة الويب الخاصة بـ Prometheus ، انتقل إلى Status => Rules وابحث عن قواعد التنبيه الخاصة بمصدر Blackbox.



تكوين إخطارات انتهاء صلاحية شهادة SSL لخادم Kubernetes API Server


فلنقم بإعداد مراقبة انتهاء صلاحية شهادات Kubernetes API Server SSL. سوف يرسل إخطارات مرة واحدة في الأسبوع.

أضف وحدة مُصدِّر 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

إضافة تكوين كشط بروميثيوس

- 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 # The blackbox exporter.

تطبيق 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: "Kubernetes API Server SSL certificate will expire after three months (instance {{ $labels.instance }})"
        description: "Kubernetes API Server SSL certificate expires in 90 days\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"

روابط مفيدة





المراقبة وتسجيل الدخول في Docker



All Articles