Zum Inhalt

ServiceMonitor

Der ServiceMonitor-Helper erstellt Prometheus ServiceMonitor-Ressourcen für automatisches Metrics-Scraping.

Übersicht

ServiceMonitors sind Custom Resources des Prometheus Operators. Sie definieren, wie Prometheus Metriken von Ihren Services scrapen soll.

Voraussetzung

Der Prometheus Operator muss im Cluster installiert sein, um ServiceMonitors zu verwenden.

Basis-Konfiguration

monitoring:
  - name: my-service
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics
        interval: 30s

Konfigurationsoptionen

Endpoints

monitoring:
  - name: my-service
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics           # Port-Name des Service
        interval: 30s           # Scrape-Intervall
        path: /metrics          # Metrics-Pfad (Standard: /metrics)
        scheme: http            # http oder https

Mehrere Endpoints

Ein Service kann mehrere Metrics-Endpoints haben:

monitoring:
  - name: my-service
    namespace: monitoring
    release: prometheus
    endpoints:
      # Haupt-Metriken
      - port: metrics
        interval: 15s
        path: /metrics

      # Slow-Queries Metriken
      - port: metrics
        interval: 60s
        path: /metrics/slow

      # Health Metriken
      - port: http
        interval: 30s
        path: /healthz

Mehrere ServiceMonitors

monitoring:
  # API Service
  - name: api
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics
        interval: 15s

  # Database Exporter
  - name: postgres-exporter
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics
        interval: 30s

  # Redis Exporter
  - name: redis-exporter
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics
        interval: 30s

Label-Matching

Der ServiceMonitor verwendet automatisch Labels zum Matchen:

monitoring:
  - name: my-api  # Wird zu my-api-metrics
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics
        interval: 30s

Prometheus Operator sucht nach Services mit dem Label:

app.kubernetes.io/name: my-api

Vollständiges Beispiel

Mit Chart-Modus

chart:
  enabled: true
  fullnameOverride: "my-api"

  container:
    image: myapp/api:latest
    ports:
      - name: http
        containerPort: 8080
      - name: metrics
        containerPort: 9090

  service:
    type: ClusterIP
    ports:
      - port: 80
        targetPort: http
        name: http
      - port: 9090
        targetPort: metrics
        name: metrics

  # ServiceMonitor für Prometheus
  monitoring:
    - name: my-api
      namespace: monitoring
      release: prometheus
      endpoints:
        - port: metrics
          interval: 15s
          path: /metrics
          scheme: http

Standalone Helper

# Chart.yaml
apiVersion: v2
name: monitoring-setup
version: 1.0.0

dependencies:
  - name: ohmyhelm
    alias: mon
    repository: https://gitlab.com/ayedocloudsolutions/ohmyhelm
    version: 1.13.0
# values.yaml
mon:
  monitoring:
    # Kubernetes Nodes
    - name: node-exporter
      namespace: monitoring
      release: prometheus
      endpoints:
        - port: metrics
          interval: 30s

    # Kubernetes API Server
    - name: kube-apiserver
      namespace: monitoring
      release: prometheus
      endpoints:
        - port: https
          interval: 30s
          scheme: https
          tlsConfig:
            insecureSkipVerify: true

    # etcd
    - name: etcd
      namespace: monitoring
      release: prometheus
      endpoints:
        - port: metrics
          interval: 30s

Erweiterte Konfiguration

Mit TLS

monitoring:
  - name: secure-service
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: https-metrics
        interval: 30s
        scheme: https
        tlsConfig:
          insecureSkipVerify: true
          # Oder mit Zertifikat:
          # caFile: /etc/prometheus/secrets/ca.crt
          # certFile: /etc/prometheus/secrets/client.crt
          # keyFile: /etc/prometheus/secrets/client.key

Mit Basic Auth

monitoring:
  - name: protected-service
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics
        interval: 30s
        basicAuth:
          username:
            name: metrics-auth
            key: username
          password:
            name: metrics-auth
            key: password

Mit Bearer Token

monitoring:
  - name: token-service
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics
        interval: 30s
        bearerTokenSecret:
          name: metrics-token
          key: token

Prometheus Operator Labels

Der ServiceMonitor muss Labels haben, die der Prometheus-Konfiguration entsprechen:

monitoring:
  - name: my-service
    namespace: monitoring
    release: prometheus  # Muss dem Prometheus-Release entsprechen

Der release Wert wird als Label gesetzt:

metadata:
  labels:
    release: prometheus

Prometheus sucht nach ServiceMonitors mit diesem Label:

serviceMonitorSelector:
  matchLabels:
    release: prometheus

Best Practices

  1. Sinnvolle Intervalle - Kurze Intervalle für kritische Metriken, längere für weniger wichtige
  2. Namespace-Trennung - ServiceMonitors im monitoring Namespace erstellen
  3. Labels konsistent halten - Verwenden Sie das korrekte release Label
  4. Resource Labels - Fügen Sie Labels für Filterung hinzu
  5. Dokumentation - Dokumentieren Sie welche Metriken verfügbar sind

Troubleshooting

ServiceMonitor prüfen

# ServiceMonitors anzeigen
kubectl get servicemonitors -n monitoring

# Details anzeigen
kubectl describe servicemonitor my-api-metrics -n monitoring

# Prometheus Targets prüfen
kubectl port-forward svc/prometheus 9090:9090 -n monitoring
# Dann: http://localhost:9090/targets

Häufige Probleme

Problem Ursache Lösung
Target nicht gefunden Label-Mismatch Service Labels prüfen
Scrape fehlgeschlagen Port/Path falsch Endpoints-Konfiguration prüfen
Keine Metriken App exposed keine Metriken Metriken-Endpoint der App prüfen

Service Labels prüfen

# Service Labels anzeigen
kubectl get svc my-api -n production -o yaml | grep -A 10 labels

# Selector des ServiceMonitors
kubectl get servicemonitor my-api-metrics -n monitoring -o yaml | grep -A 10 selector

Siehe auch