Skip to main content

Risiken

Anforderungen für Logging, Monitoring and Alarming

Protokollierung

Die Protokollierung ist für das Verständnis des Anwendungsverhaltens, die Fehlerbehebung und die Überwachung der Clusteraktivität unerlässlich. Es ist jedoch unzureichend, sich ausschließlich auf Protokollierungsmechanismen auf Knotenebene zu verlassen, da Protokolle verloren gehen können, wenn ein Container abstürzt oder ein Knoten nicht mehr erreichbar ist. Daher ist eine robuste Protokollierungslösung auf Clusterebene erforderlich, um Protokolle unabhängig von Knoten, Pods oder Containern zu speichern, zu analysieren und abzufragen.

Protokollierung auf Knotenebene

Beispiel für eine Logging-Konfiguration:

{ "log-driver": "json-file", "log-opts": 
    { "max-size": "10m", "max-file": "3", "labels": "production_status", "env": "os,customer" } 
}

Zu berücksichtigende Merkmale:

  • Log Rotation: Sorgt dafür, dass alte Protokolle in regelmäßigen Abständen gelöscht werden, um Speicherplatz freizugeben.
  • Log Format: Das JSON-Format wird für Protokollnachrichten empfohlen, um die Verarbeitung und Abfrage zu erleichtern.

Cluster-Level Logging

Annäherungen:

  1. Anwendungen protokollieren (Logging Aplications): Verwenden Sie Daemonsets, um Protokollierungsanwendungen auf jedem Knoten einzusetzen, die auf Container-Protokollverzeichnisse zugreifen.
  2. Sidecar-Container: Fügen Sie jedem Pod einen Sidecar-Container für die Protokollierung hinzu.
  3. Direkte Protokollierung (Direct Logging): Anwendungen senden Protokolle direkt an ein Backend. Dies wird jedoch nicht empfohlen, da es außerhalb des Anwendungsbereichs von Kubernetes liegt.

Protokollierung durch Anwendungen (Daemonsets)

  • Am einfachsten zu implementieren und einzusetzen mit Daemonsets.
  • Keine Änderungen an den zu protokollierenden Anwendungen erforderlich.
  • Verwendung von PodSecurityPolicies, SecurityContexts, NetworkPolicies zur Sicherung der Protokollierungsimplementierung.

Logging durch Sidecars

  • Fügt zu jedem Pod einen zusätzlichen Container hinzu.
  • Ressourcenintensiv, bietet aber bessere Skalierbarkeit.
  • Zwei Varianten:
    • Der Streaming-Container sendet die Protokolle an stdout und stderr.
    • Der Logging Application Container liest und verarbeitet die Protokolle.

Direktes Logging zum Backend

  • Jede Anwendung sendet Protokolle direkt an ein Logging-Backend.
  • Nicht empfohlen, da dies außerhalb des Kubernetes-Ökosystems liegt.

Empfohlene Protokollierungslösung

  • Verwenden Sie den EFK-Stack (Elasticsearch, Fluentd, Kibana) für die Protokollierung.
  • Implementieren Sie Protokollrotation und -filterung.
  • Weisen Sie bestimmte Knoten für die Protokollierung und Überwachung mithilfe von Taints, Toleranzen und Knotenaffinitäten zu.
  • Beschränken Sie den Befehl kubectl logs auf Administratoren.
  • Verwenden Sie das JSON-Format für Protokollnachrichten.
  • Sicherstellen, dass VMs, die Kubernetes-Komponenten (Kubelet, API-Server, etcd) hosten, ebenfalls protokolliert werden.

Monitoring

Im Gegensatz zur Protokollierung gibt es für die Überwachung in Kubernetes einen empfohlenen Ansatz, bei dem Daemonsets verwendet werden, um sicherzustellen, dass jeder Knoten über einen Monitoring-Pod verfügt.

Empfohlene Monitoring Lösung

  • Verwenden Sie Prometheus für das Monitoring und Grafana für Dashboards.
  • Trennen Sie Monitoring- und Logging-Anwendungen in verschiedene Namespaces.

Schwerpunktbereiche der Überwachung

  • Auslastung des gesamten Clusters.
  • Last auf jedem Knoten.
  • Auslastung der einzelnen Namespaces.
  • Arbeitslast der Pods, insbesondere der Control-Plane-Pods.
  • Anzahl der Pods und Container.
  • Anzahl der laufenden Pods und Container.

Prometheus und Grafana Konfiguration

  • Verwenden Sie Prometheus, um Metriken zu sammeln und Grafana, um sie zu visualisieren.
  • Stellen Sie Prometheus mithilfe eines Daemonsets bereit, um sicherzustellen, dass jeder Knoten überwacht wird.
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: prometheus-node-exporter
spec:
  selector:
    matchLabels:
      app: prometheus-node-exporter
  template:
    metadata:
      labels:
        app: prometheus-node-exporter
    spec:
      containers:
      - name: prometheus-node-exporter
        image: quay.io/prometheus/node-exporter
        ports:
        - containerPort: 9100

Alarming

Richten Sie eine Alarmin-Funktion ein, um Administratoren über kritische Ereignisse und Anomalien zu benachrichtigen, die durch das Logging und Überwachung erkannt wurden.

Logging Alarme

  • Lösen Sie Alarme zunächst bei stderr-Meldungen aus.
  • Verfeinern Sie die Alarme im Laufe der Zeit auf der Grundlage bestimmter Fehlermeldungen und -muster.

Monitoring Alarme

  • Hohe Auslastung des Clusters.
  • Hohe Knotenauslastung.
  • Hohe Namespace-Auslastung.
  • Hohe Pod-Auslastung, insbesondere bei Control-Plane-Pods.
  • Unerwartete Anzahl von Pods oder Containern (höher oder niedriger als erwartet).

Prometheus Alertmanager Konfigurationsbeispiel

groups:
- name: KubernetesMonitoring
  rules:
  - alert: HighClusterUtilization
    expr: sum(rate(container_cpu_usage_seconds_total[5m])) / sum(machine_cpu_cores) * 100 > 80
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "High Cluster CPU Utilization"
      description: "Cluster CPU utilization is above 80% for more than 5 minutes."

Schlussfolgerung

Eine umfassende Protokollierungs-, Überwachungs- und Alarmierungsstrategie ist entscheidend für die Aufrechterhaltung des Zustands und der Sicherheit eines Kubernetes-Clusters. Die Implementierung des Logging auf Clusterebene mit Lösungen wie dem EFK-Stack, das Monitoring mit Prometheus und Grafana sowie die Einrichtung robuster Alarme gewährleisten, dass Administratoren Probleme schnell erkennen und darauf reagieren können. Überprüfen und aktualisieren Sie regelmäßig die Protokollierungs- und Überwachungsrichtlinien, um sie an die sich entwickelnden Anforderungen und Best Practices anzupassen.


Orientieren Sie sich an folgenden Maßnahmen: