it-wiki:kubernetes:cluster_logging_loki
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
it-wiki:kubernetes:cluster_logging_loki [2025/09/04 09:33] – [Warum Loki] marko | it-wiki:kubernetes:cluster_logging_loki [2025/09/05 07:36] (aktuell) – [Installation von Loki] marko | ||
---|---|---|---|
Zeile 40: | Zeile 40: | ||
* **Datenvisualisierung: | * **Datenvisualisierung: | ||
- | Neben dieser etablierten Architektur hat sich mit der Kombination aus Loki und Grafana Alloy ein alternativer, | + | Neben dieser etablierten Architektur hat sich mit der Kombination aus Loki und Grafana Alloy ein alternativer, |
Loki bietet im Vergleich zu traditionellen Log-Aggregationssystemen eine Reihe spezifischer Vorteile: | Loki bietet im Vergleich zu traditionellen Log-Aggregationssystemen eine Reihe spezifischer Vorteile: | ||
Zeile 57: | Zeile 57: | ||
Obwohl Kibana und Graylog ein umfangreicheres Funktionsspektrum bereitstellen, | Obwohl Kibana und Graylog ein umfangreicheres Funktionsspektrum bereitstellen, | ||
+ | |||
+ | ==== Komponenten des Logging-Stack Loki und Grafana Alloy ===== | ||
+ | Ein auf Loki basierender Logging-Stack besteht aus drei Kernkomponenten: | ||
+ | - **Loki**\\ Loki bildet die zentrale Komponente des Stacks und verwaltet den Log-Index. Es fungiert als Hauptserver, | ||
+ | - **Grafana Alloy**\\ Grafana Alloy übernimmt die Erfassung und Weiterleitung von Log-Daten an Loki. Seine Hauptaufgabe ist es, die Logs aus den verschiedenen Pods und Containern im Cluster zu sammeln, sie zu verarbeiten (z.B. filtern oder Labels hinzufügen) und sie anschließend im richtigen Format an Loki zu senden. | ||
+ | - **Grafana**\\ Grafana ist ein Open-Source-Tool zur Überwachung und Visualisierung von Daten. Es ermöglicht die Erstellung und Verwaltung von Dashboards, welche Daten aus einer Vielzahl von Quellen – darunter InfluxDB, MySQL, PostgreSQL, Prometheus und Graphite – aggregieren können. Durch ein flexibles Plug-in-System lassen sich sowohl die Datenquellen als auch die Darstellungsoptionen erweitern. Im Kontext des Loki-Stacks dient Grafana als Visualisierungskomponente für die Abfrage und Darstellung der erfassten Logs. | ||
+ | |||
+ | ===== Installation von Loki ===== | ||
+ | Das **Loki Helm-Chart** unterstützt drei verschiedene Bereitstellungsmethoden: | ||
+ | * **Monolithic** | ||
+ | * **Simple Scalable** | ||
+ | * **Microservice** | ||
+ | (vgl. [[https:// | ||
+ | concepts/ | ||
+ | \\ | ||
+ | |||
+ | Standardmäßig wird das Chart im **Simple-Scalable-Modus** installiert, | ||
+ | |||
+ | < | ||
+ | )Umgebungen kann lokaler Storage genutzt werden – mit einigen Einschränkungen | ||
+ | u. a. bezüglich Geschwindigkeit und Sicherheit.</ | ||
+ | |||
+ | Für das Deployment im Rahmen des Trainings-Labs oder in einer Test- oder Entwicklungsumgebungen steht meistens kein Objektspeicher eines externen Storage-Providers zur Verfügung. Stattdessen wird lokaler Speicher in Kombination mit der Methode '' | ||
+ | |||
+ | Das Loki Helm-Chart umfasst standardmäßig **kein integriertes Monitoring**. Für eine übergreifende Überwachung des Loki-Clusters hinsichtlich Logs, Metriken und Traces empfiehlt sich der Einsatz des sogenannten // | ||
+ | Installation des Loki-Stacks auf Kubernetes | ||
+ | |||
+ | Die Bereitstellung von Loki erfolgt üblicherweise mittels Helm, einem Package-Manager für Kubernetes. Das offizielle Helm-Chart beinhaltet die erforderlichen Komponenten für das Trainingsszenario: | ||
+ | |||
+ | Die Installation erfolgt in folgenden Schritten: | ||
+ | - **Hinzufügen des Helm-Repositories: | ||
+ | - **Installation von Loki in einem separaten Namespace (z.B. '' | ||
+ | - **Überprüfung der laufenden Pods und Services: | ||
+ | |||
+ | ==== Konfiguration ==== | ||
+ | Zur Anpassung der Loki-Konfiguration kann die aktuelle Standardkonfiguration des Charts mit folgendem Befehl angezeigt und in eine Vorlage exportiert werden: | ||
+ | <code bash> | ||
+ | helm show values grafana/ | ||
+ | </ | ||
+ | |||
+ | Auf Basis dieser Datei können die erforderlichen Anpassungen für die eigene Umgebung vorgenommen werden.\\ | ||
+ | '' | ||
+ | <code yaml> | ||
+ | loki: | ||
+ | commonConfig: | ||
+ | replication_factor: | ||
+ | storage: | ||
+ | type: ' | ||
+ | bucketNames: | ||
+ | chunks: chunks | ||
+ | ruler: ruler | ||
+ | admin: admin | ||
+ | schemaConfig: | ||
+ | configs: | ||
+ | - from: " | ||
+ | store: tsdb | ||
+ | object_store: | ||
+ | schema: v13 | ||
+ | index: | ||
+ | prefix: loki_index_ | ||
+ | period: 24h | ||
+ | storage_config: | ||
+ | filesystem: | ||
+ | directory: / | ||
+ | pattern_ingester: | ||
+ | enabled: true | ||
+ | limits_config: | ||
+ | allow_structured_metadata: | ||
+ | volume_enabled: | ||
+ | ruler: | ||
+ | enable_api: true | ||
+ | auth_enabled: | ||
+ | |||
+ | minio: | ||
+ | enabled: false | ||
+ | | ||
+ | deploymentMode: | ||
+ | |||
+ | singleBinary: | ||
+ | replicas: 1 | ||
+ | persistence: | ||
+ | storageClass: | ||
+ | accessModes: | ||
+ | - ReadWriteOnce | ||
+ | size: 20Gi | ||
+ | |||
+ | resources: | ||
+ | requests: | ||
+ | cpu: " | ||
+ | memory: " | ||
+ | limits: | ||
+ | cpu: " | ||
+ | memory: " | ||
+ | |||
+ | sidecar: | ||
+ | image: | ||
+ | repository: kiwigrid/ | ||
+ | tag: 1.30.0 | ||
+ | resources: | ||
+ | requests: | ||
+ | cpu: 50m | ||
+ | memory: 50Mi | ||
+ | limits: | ||
+ | cpu: 100m | ||
+ | memory: 100Mi | ||
+ | |||
+ | backend: | ||
+ | replicas: 0 | ||
+ | read: | ||
+ | replicas: 0 | ||
+ | write: | ||
+ | replicas: 0 | ||
+ | |||
+ | chunksCache: | ||
+ | allocatedMemory: | ||
+ | </ | ||
+ | |||
+ | Weitere Konfigurationsbeispiele sind in der offiziellen Dokumentation verfügbar: | ||
+ | [[https:// | ||
+ | configuration-examples/ | ||
+ | |||
+ | ===== Einspeisen von Logs in Loki mittels Alloy ===== | ||
+ | Grafana Alloy ist ein vielseitiger Observability-Collector, | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | ==== Komponenten von Alloy für die Log-Verarbeitung ==== | ||
+ | Alloy-Pipelines bestehen aus einzelnen Komponenten, | ||
+ | * **Collector: | ||
+ | |||
+ | * **Transformer: | ||
+ | |||
+ | * **Writer: | ||
+ | |||
+ | ==== Log-Komponenten in Alloy ==== | ||
+ | |||
+ | Nachfolgend findet sich eine nicht abschließende Übersicht von Komponenten, | ||
+ | |||
+ | ^Type ^Component | | ||
+ | | Collector | loki.source.api | | ||
+ | | Collector | loki.source.awsfirehose | | ||
+ | | Collector | loki.source.azure_event_hubs | | ||
+ | | Collector | loki.source.cloudflare | | ||
+ | | Collector | loki.source.docker | | ||
+ | | Collector | loki.source.file | | ||
+ | | Collector | loki.source.gcplog | | ||
+ | | Collector | loki.source.gelf | | ||
+ | | Collector | loki.source.heroku | | ||
+ | | Collector | loki.source.journal | | ||
+ | | Collector | loki.source.kafka | | ||
+ | | Collector | loki.source.kubernetes | | ||
+ | | Collector | loki.source.kubernetes_events | | ||
+ | | Collector | loki.source.podlogs | | ||
+ | | Collector | loki.source.syslog | | ||
+ | | Collector | loki.source.windowsevent | | ||
+ | | Collector | otelcol.receiver.loki | | ||
+ | | Transformer | loki.relabel | | ||
+ | | Transformer | loki.process | | ||
+ | | Writer | loki.write | | ||
+ | | Writer | otelcol.exporter.loki | | ||
+ | |||
+ | ==== Installation von Grafana Alloy ==== | ||
+ | Der Alloy lässt sich über Helm Chart installieren. Diesen finden wir im selben Helm-Repository wie unseren Loki Chart. Daher ist kein weiteres Helm Repository hinzufügen nötig. | ||
+ | |||
+ | Die Installation erfolgt in folgenden Schritten: | ||
+ | - **Installation von Alloy im selben Namespace wie loki:**\\ <code bash> | ||
+ | - **Überprüfung der laufenden Pods und Services: | ||
+ | |||
+ | Für die Installation und Konfiguration von Alloy kann eine Values-Datei verwendet werden, in der sämtliche Parameter des Helm-Charts angepasst werden. Die verfügbaren Standardoptionen lassen sich mit folgendem Befehl anzeigen und gleichzeitig in eine Vorlage exportieren: | ||
+ | <code bash> | ||
+ | helm show values grafana/ | ||
+ | </ | ||
+ | |||
+ | Auf Basis dieser Konfigurationsvorlage können spezifische Anpassungen vorgenommen werden, um den Betrieb in der eigenen Umgebung sicherzustellen. Ein Beispiel für eine entsprechende Konfiguration wird nachfolgend dargestellt. | ||
+ | '' | ||
+ | <code yaml> | ||
+ | alloy: | ||
+ | configMap: | ||
+ | content: |- | ||
+ | logging { | ||
+ | level = " | ||
+ | format = " | ||
+ | } | ||
+ | discovery.kubernetes " | ||
+ | role = " | ||
+ | } | ||
+ | discovery.relabel " | ||
+ | targets = discovery.kubernetes.pods.targets | ||
+ | |||
+ | rule { | ||
+ | source_labels = [" | ||
+ | target_label = " | ||
+ | action = " | ||
+ | } | ||
+ | |||
+ | rule { | ||
+ | source_labels = [" | ||
+ | target_label = " | ||
+ | action = " | ||
+ | } | ||
+ | |||
+ | rule { | ||
+ | source_labels = [" | ||
+ | target_label = " | ||
+ | action = " | ||
+ | } | ||
+ | |||
+ | rule { | ||
+ | source_labels = [" | ||
+ | target_label = " | ||
+ | action = " | ||
+ | } | ||
+ | } | ||
+ | loki.source.kubernetes " | ||
+ | targets | ||
+ | forward_to = [loki.process.process.receiver] | ||
+ | } | ||
+ | loki.process " | ||
+ | forward_to = [loki.write.loki.receiver] | ||
+ | |||
+ | stage.drop { | ||
+ | older_than | ||
+ | drop_counter_reason = "too old" | ||
+ | } | ||
+ | stage.match { | ||
+ | selector = " | ||
+ | stage.json { | ||
+ | expressions = { | ||
+ | level = " | ||
+ | } | ||
+ | } | ||
+ | stage.labels { | ||
+ | values = { | ||
+ | level = " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | stage.label_drop { | ||
+ | values = [ " | ||
+ | } | ||
+ | } | ||
+ | loki.write " | ||
+ | endpoint { | ||
+ | url = " | ||
+ | } | ||
+ | } | ||
+ | mounts: | ||
+ | varlog: true | ||
+ | dockercontainers: | ||
+ | |||
+ | resources: | ||
+ | limits: | ||
+ | cpu: 200m | ||
+ | memory: 128Mi | ||
+ | requests: | ||
+ | cpu: 100m | ||
+ | memory: 128Mi | ||
+ | </ | ||
+ | |||
+ | ===== Installation von Grafana mittels Helm-Chart ===== | ||
+ | Die Bereitstellung von Grafana erfolgt analog zu Loki über ein offizielles Helm-Chart. Auch hier kann wieder das selbe Repository von Grafana verwendet werden. | ||
+ | |||
+ | <code bash> | ||
+ | helm install grafana grafana/ | ||
+ | </ | ||
+ | |||
+ | Für die Installation empfiehlt sich die Verwendung einer vorbereiteten Konfigurationsdatei, | ||
+ | [[https:// | ||
+ | |||
+ | Für unsere kleine Übung verwenden wir am besten folgende Konfiguration. Diese beinhaltet bereits ein vorkonfiguriertes Dashboard. | ||
+ | '' | ||
+ | <code yaml> | ||
+ | # grafana-values.yaml - Erweiterte Version mit Dashboards | ||
+ | replicas: 1 | ||
+ | |||
+ | resources: | ||
+ | limits: | ||
+ | cpu: 300m | ||
+ | memory: 512Mi | ||
+ | requests: | ||
+ | cpu: 100m | ||
+ | memory: 256Mi | ||
+ | |||
+ | persistence: | ||
+ | enabled: true | ||
+ | size: 5Gi | ||
+ | storageClassName: | ||
+ | |||
+ | adminUser: admin | ||
+ | adminPassword: | ||
+ | |||
+ | # Service configuration | ||
+ | service: | ||
+ | type: ClusterIP | ||
+ | port: 80 | ||
+ | |||
+ | # Datasources | ||
+ | datasources: | ||
+ | datasources.yaml: | ||
+ | apiVersion: 1 | ||
+ | datasources: | ||
+ | - name: Loki | ||
+ | type: loki | ||
+ | url: http:// | ||
+ | access: proxy | ||
+ | isDefault: true | ||
+ | jsonData: | ||
+ | maxLines: 1000 | ||
+ | derivedFields: | ||
+ | - datasourceUid: | ||
+ | matcherRegex: | ||
+ | name: TraceID | ||
+ | url: " | ||
+ | |||
+ | # Dashboard providers | ||
+ | dashboardProviders: | ||
+ | dashboardproviders.yaml: | ||
+ | apiVersion: 1 | ||
+ | providers: | ||
+ | - name: ' | ||
+ | orgId: 1 | ||
+ | folder: ' | ||
+ | type: file | ||
+ | disableDeletion: | ||
+ | editable: true | ||
+ | updateIntervalSeconds: | ||
+ | allowUiUpdates: | ||
+ | options: | ||
+ | path: / | ||
+ | - name: ' | ||
+ | orgId: 1 | ||
+ | folder: ' | ||
+ | type: file | ||
+ | disableDeletion: | ||
+ | editable: true | ||
+ | updateIntervalSeconds: | ||
+ | allowUiUpdates: | ||
+ | options: | ||
+ | path: / | ||
+ | |||
+ | # Custom Dashboards | ||
+ | dashboards: | ||
+ | kubernetes: | ||
+ | kubernetes-cluster-overview: | ||
+ | json: | | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ] | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ] | ||
+ | }, | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | }, | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | }, | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | |||
+ | kubernetes-namespace-logs: | ||
+ | json: | | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | </ | ||
+ | |||
+ | ===== Testen des Cluster Loggings ===== | ||
+ | Um sich nun das Gesamtergebnis schnell anschauen zu können richtet man am besten ein Port-Forwarding zum Grafana WebUI auf Port 3000 ein. | ||
+ | <code bash> | ||
+ | kubectl port-forward service/ | ||
+ | </ | ||
+ | |||
+ | ==== Zugriff auf das Grafana-Webinterface ==== | ||
+ | |||
+ | Nach erfolgreicher Installation und korrekter Konfiguration kann auf das Grafana-Webinterface zugegriffen werden. | ||
+ | |||
+ | Nach Eingabe der entsprechenden Zugangsdaten erfolgt die Anmeldung am System. Anschließend steht die vollständige Benutzeroberfläche von Grafana zur Verfügung, über die beispielsweise ein Dashboard für Loki genutzt oder eingerichtet werden kann. |
it-wiki/kubernetes/cluster_logging_loki.1756978394.txt.gz · Zuletzt geändert: von marko