Benutzer-Werkzeuge

Webseiten-Werkzeuge


it-wiki:kubernetes:cluster_logging_loki

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
it-wiki:kubernetes:cluster_logging_loki [2025/09/04 11:13] markoit-wiki:kubernetes:cluster_logging_loki [2025/09/05 07:36] (aktuell) – [Installation von Loki] marko
Zeile 70: Zeile 70:
   * **Microservice**   * **Microservice**
 (vgl. [[https://grafana.com/docs/loki/latest/setup/install/helm/ (vgl. [[https://grafana.com/docs/loki/latest/setup/install/helm/
-concepts/|]]Grafana Labs Documentation)+concepts/|Grafana Labs Documentation]])
 \\ \\
  
Zeile 217: Zeile 217:
 | Writer | loki.write | | Writer | loki.write |
 | Writer | otelcol.exporter.loki | | 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>helm install grafana-alloy grafana/alloy --values alloy-values.yaml -n loki</code>
 +  - **Überprüfung der laufenden Pods und Services:**\\ <code bash>kubectl get pods,svc -n loki</code>
 +
 +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/loki > config-loki.yaml
 +</code>
 +
 +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.
 +''alloy-values.yaml''
 +<code yaml>
 +alloy:
 +  configMap:
 +    content: |-
 +      logging {
 +        level = "debug"
 +        format = "logfmt"
 +      }
 +      discovery.kubernetes "pods" {
 +        role = "pod"
 +      }
 +      discovery.relabel "pods" {
 +        targets = discovery.kubernetes.pods.targets
 +
 +        rule {
 +          source_labels = ["__meta_kubernetes_namespace"]
 +          target_label = "namespace"
 +          action = "replace"
 +        }
 +
 +        rule {
 +          source_labels = ["__meta_kubernetes_pod_label_app_kubernetes_io_name"]
 +          target_label = "app"
 +          action = "replace"
 +        }
 +
 +        rule {
 +          source_labels = ["__meta_kubernetes_pod_container_name"]
 +          target_label = "container"
 +          action = "replace"
 +        }
 +
 +        rule {
 +          source_labels = ["__meta_kubernetes_pod_name"]
 +          target_label = "pod"
 +          action = "replace"
 +        }
 +      }
 +      loki.source.kubernetes "pods" {
 +        targets    = discovery.relabel.pods.output
 +        forward_to = [loki.process.process.receiver]
 +      }
 +      loki.process "process" {
 +        forward_to = [loki.write.loki.receiver]
 +
 +        stage.drop {
 +          older_than          = "1h"
 +          drop_counter_reason = "too old"
 +        }
 +        stage.match { 
 +          selector = "{instance=~\".*\"}"
 +          stage.json {
 +            expressions = {
 +              level = "\"level\"",
 +            }
 +          }
 +          stage.labels {
 +            values = { 
 +              level = "level",
 +            }
 +          }
 +        }
 +        stage.label_drop {
 +          values = [ "service_name" ]
 +        }
 +      }
 +      loki.write "loki" {
 +        endpoint {
 +          url = "http://loki-gateway/loki/api/v1/push"
 +        }
 +      }
 +  mounts:
 +    varlog: true
 +    dockercontainers: true
 +
 +  resources:
 +    limits:
 +      cpu: 200m
 +      memory: 128Mi
 +    requests:
 +      cpu: 100m
 +      memory: 128Mi
 +</code>
 +
 +===== 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/grafana -f grafana-values.yaml --create-namespace -n grafana
 +</code>
 +
 +Für die Installation empfiehlt sich die Verwendung einer vorbereiteten Konfigurationsdatei, welche die notwendigen Parameter für eine einfache Grafana-Instanz enthält. Diese kann unter folgender Adresse abgerufen werden:
 +[[https://grafana.com/docs/loki/latest/setup/install/helm/monitor-and-alert/with-grafana-cloud/?utm_source=chatgpt.com|Grafana Cloud Helm-Konfiguration]]
 +
 +Für unsere kleine Übung verwenden wir am besten folgende Konfiguration. Diese beinhaltet bereits ein vorkonfiguriertes Dashboard.
 +''grafana-values.yaml''
 +<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: null
 +
 +adminUser: admin
 +adminPassword: admin123
 +
 +# Service configuration
 +service:
 +  type: ClusterIP
 +  port: 80
 +
 +# Datasources
 +datasources:
 +  datasources.yaml:
 +    apiVersion: 1
 +    datasources:
 +    - name: Loki
 +      type: loki
 +      url: http://loki-gateway.loki.svc.cluster.local
 +      access: proxy
 +      isDefault: true
 +      jsonData:
 +        maxLines: 1000
 +        derivedFields:
 +          - datasourceUid: loki
 +            matcherRegex: "traceID=(\\w+)"
 +            name: TraceID
 +            url: "$${__value.raw}"
 +
 +# Dashboard providers
 +dashboardProviders:
 +  dashboardproviders.yaml:
 +    apiVersion: 1
 +    providers:
 +    - name: 'kubernetes'
 +      orgId: 1
 +      folder: 'Kubernetes'
 +      type: file
 +      disableDeletion: false
 +      editable: true
 +      updateIntervalSeconds: 10
 +      allowUiUpdates: true
 +      options:
 +        path: /var/lib/grafana/dashboards/kubernetes
 +    - name: 'loki'
 +      orgId: 1
 +      folder: 'Loki'
 +      type: file
 +      disableDeletion: false
 +      editable: true
 +      updateIntervalSeconds: 10
 +      allowUiUpdates: true
 +      options:
 +        path: /var/lib/grafana/dashboards/loki
 +
 +# Custom Dashboards
 +dashboards:
 +  kubernetes:
 +    kubernetes-cluster-overview:
 +      json: |
 +        {
 +          "annotations": {
 +            "list": [
 +              {
 +                "builtIn": 1,
 +                "datasource": "-- Grafana --",
 +                "enable": true,
 +                "hide": true,
 +                "iconColor": "rgba(0, 211, 255, 1)",
 +                "name": "Annotations & Alerts",
 +                "type": "dashboard"
 +              }
 +            ]
 +          },
 +          "description": "Kubernetes Cluster Overview with Loki Logs",
 +          "editable": true,
 +          "gnetId": null,
 +          "graphTooltip": 0,
 +          "id": null,
 +          "links": [],
 +          "panels": [
 +            {
 +              "datasource": "Loki",
 +              "fieldConfig": {
 +                "defaults": {},
 +                "overrides": []
 +              },
 +              "gridPos": {
 +                "h": 8,
 +                "w": 24,
 +                "x": 0,
 +                "y": 0
 +              },
 +              "id": 1,
 +              "options": {
 +                "showLabels": false,
 +                "showTime": false,
 +                "sortOrder": "Descending",
 +                "wrapLogMessage": false,
 +                "prettifyLogMessage": false,
 +                "enableLogDetails": true,
 +                "dedupStrategy": "none"
 +              },
 +              "targets": [
 +                {
 +                  "expr": "{namespace=~\".+\"} |= \"\"",
 +                  "refId": "A"
 +                }
 +              ],
 +              "title": "All Kubernetes Logs",
 +              "type": "logs"
 +            },
 +            {
 +              "datasource": "Loki",
 +              "fieldConfig": {
 +                "defaults": {
 +                  "color": {
 +                    "mode": "palette-classic"
 +                  },
 +                  "custom": {
 +                    "axisLabel": "",
 +                    "axisPlacement": "auto",
 +                    "barAlignment": 0,
 +                    "drawStyle": "line",
 +                    "fillOpacity": 10,
 +                    "gradientMode": "none",
 +                    "hideFrom": {
 +                      "legend": false,
 +                      "tooltip": false,
 +                      "vis": false
 +                    },
 +                    "lineInterpolation": "linear",
 +                    "lineWidth": 1,
 +                    "pointSize": 5,
 +                    "scaleDistribution": {
 +                      "type": "linear"
 +                    },
 +                    "showPoints": "never",
 +                    "spanNulls": false,
 +                    "stacking": {
 +                      "group": "A",
 +                      "mode": "none"
 +                    },
 +                    "thresholdsStyle": {
 +                      "mode": "off"
 +                    }
 +                  },
 +                  "mappings": [],
 +                  "thresholds": {
 +                    "mode": "absolute",
 +                    "steps": [
 +                      {
 +                        "color": "green",
 +                        "value": null
 +                      },
 +                      {
 +                        "color": "red",
 +                        "value": 80
 +                      }
 +                    ]
 +                  },
 +                  "unit": "short"
 +                },
 +                "overrides": []
 +              },
 +              "gridPos": {
 +                "h": 8,
 +                "w": 12,
 +                "x": 0,
 +                "y": 8
 +              },
 +              "id": 2,
 +              "options": {
 +                "legend": {
 +                  "calcs": [],
 +                  "displayMode": "list",
 +                  "placement": "bottom"
 +                },
 +                "tooltip": {
 +                  "mode": "single"
 +                }
 +              },
 +              "targets": [
 +                {
 +                  "expr": "sum(rate({namespace=~\".+\"}[5m])) by (namespace)",
 +                  "refId": "A"
 +                }
 +              ],
 +              "title": "Log Rate by Namespace",
 +              "type": "timeseries"
 +            },
 +            {
 +              "datasource": "Loki",
 +              "fieldConfig": {
 +                "defaults": {
 +                  "color": {
 +                    "mode": "thresholds"
 +                  },
 +                  "custom": {
 +                    "align": "auto",
 +                    "displayMode": "auto"
 +                  },
 +                  "mappings": [],
 +                  "thresholds": {
 +                    "mode": "absolute",
 +                    "steps": [
 +                      {
 +                        "color": "green",
 +                        "value": null
 +                      },
 +                      {
 +                        "color": "red",
 +                        "value": 80
 +                      }
 +                    ]
 +                  }
 +                },
 +                "overrides": []
 +              },
 +              "gridPos": {
 +                "h": 8,
 +                "w": 12,
 +                "x": 12,
 +                "y": 8
 +              },
 +              "id": 3,
 +              "options": {
 +                "showHeader": true
 +              },
 +              "targets": [
 +                {
 +                  "expr": "topk(10, sum(count_over_time({namespace=~\".+\"}[5m])) by (namespace, pod_name))",
 +                  "refId": "A"
 +                }
 +              ],
 +              "title": "Top 10 Pods by Log Volume",
 +              "type": "table"
 +            }
 +          ],
 +          "refresh": "30s",
 +          "schemaVersion": 30,
 +          "style": "dark",
 +          "tags": ["kubernetes", "logs"],
 +          "templating": {
 +            "list": []
 +          },
 +          "time": {
 +            "from": "now-1h",
 +            "to": "now"
 +          },
 +          "timepicker": {},
 +          "timezone": "",
 +          "title": "Kubernetes Cluster Overview",
 +          "uid": "kubernetes-cluster-overview",
 +          "version": 1
 +        }
 +
 +    kubernetes-namespace-logs:
 +      json: |
 +        {
 +          "annotations": {
 +            "list": []
 +          },
 +          "description": "Kubernetes Namespace Specific Logs",
 +          "editable": true,
 +          "
 +</code>
 +
 +===== 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/grafana 3000:80 -n grafana
 +</code>
 +
 +==== 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.1756984396.txt.gz · Zuletzt geändert: von marko