Zum Hauptinhalt springen

Loki

Loki ermöglicht es dir, die Logs deiner Container mit Grafana Loki anzusehen und abzufragen.

Details

Loki ist ein von Prometheus inspiriertes System zur Log-Zusammenstellung. Es listet nicht die Inhalte der Logs auf, sondern ein Set an Labels für jeden Log-Stream. Die Logs werden standardmässig 30 Tage gespeichert, aber du kannst diesen Zeitraum beliebig anpassen.

Verfügbarkeit

Loki ist als optionaler Service für NKE verfügbar und kann im Cockpit erstellt werden.

Nutzung

Auf Loki kann über die Grafana Web UI zugegriffen werden. Die Nutzungsanleitung findest du in der Grafana-Dokumentation.

Deinen Pods Labels zuweisen

Wenn dein Pod Teil eines Deployments, Statefulsets oder eines anderen Controllers ist, wird er von Loki automatisch aufgenommen, unabhängig der zugewiesenen Labels. Wir empfehlen die Nutzung dieser gebräuchlichen Labels, um deine Logs leicht zu finden.

Wenn du einen einzelnen Pod betreibst, wirst du eines dieser Labels verwenden müssen, um sicherzustellen, dass Loki deine Logs aufnimmt:

  • app
  • name

Abfrage von Logs mit LogQL

Die in Loki verwendete Query-Sprache ist LogQL. Um mit der Abfrage deiner Logs zu beginnen, gehe zur Grafana UI und klicke im Seitenmenü auf Explore.

Eine LogQL-Abfrage besteht aus zwei Teilen: dem Log Stream Selector und der Search Expression. Ein Stream wird ausgewählt, in dem ein oder mehr Labels vorgegeben werden, zum Beispiel:

{app="nginx", name=~"frontend.+"}

Um in den Ergebnissen nach einer bestimmten Zeichenfolge zu suchen, kannst du einen Suchausdruck (Search Expression) verwenden. Dabei kann es sich um eine einfache Text-Übereinstimmung mit |= oder einen regex-Ausdruck mit |~ handeln. Wenn du statt des Striches ! verwendest, kann der Ausdruck umgekehrt werden. Es folgen einige Beispiele:

{app="nginx"} |= "GET"
{app="nginx"} |~ "200|201|202"
{app="nginx"} != "GET"
{app="nginx"} !~ "200|201|202"

Für mehr Details schau dir bitte die Loki Dokumentation an.

Pushen eigener Logs

Wenn du Pods hast, die Dateien in Logs speichern, statt sie zu STDOUT hinzuzufügen, kannst du jeden Loki Client verwenden, um Logs dorthin zu pushen. Im Folgenden findest du ein Beispiel dafür, wie dies aussehen könnte. In dem Beispiel nutzen wir fluent-bit mit dem Loki-Plugin als Zusatz zu einem Nginx-Container, um Logs zu Loki zu senden. Bitte stelle sicher, dass du <LOKI_SERVICE_ADDRESS> mit deiner spezifischen Adresse ersetzt. Der Log Path, das Format und die Labels werden als Umgebungsvariablen an fluent-bit weitergereicht. Diese Variablen werden in den Pod Spezifikationen definiert. Mehr Informationen zum Fluent Bit Loki Plugin.

apiVersion: v1
kind: ConfigMap
metadata:
name: fluent-bit-loki
data:
fluent-bit.conf: |-
[INPUT]
Name tail
Path ${LOG_PATH}
[Output]
Name loki
Match *
Url http://<LOKI_SERVICE_ADDRESS>:3100/loki/api/v1/push
BatchWait 1
BatchSize 1001024
Labels {app="${APP_LABEL}",pod="${POD_NAME}",namespace="${POD_NAMESPACE}"}
LineFormat ${LOG_FORMAT}
LogLevel info
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
volumes:
- name: fluent-bit-config
configMap:
name: fluent-bit-loki
- name: logs
emptyDir: {}
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
volumeMounts:
- name: logs
mountPath: /var/log/nginx
- name: fluent-bit-loki
image: grafana/fluent-bit-plugin-loki:2.5.0-amd64
volumeMounts:
- name: fluent-bit-config
mountPath: /fluent-bit/etc
- name: logs
mountPath: /var/log/nginx
env:
- name: APP_LABEL
value: nginx
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: LOG_PATH
value: /var/log/nginx/*.log
- name: LOG_FORMAT
value: key_value

Pushen externer Logs

Wenn du Logs von externen Systemen (z. B. von einem externen Kubernetes Cluster) zu deiner Loki-Instanz pushen willst, erstelle bitte ein Support-Ticket. Wir stellen dir dann die benötigten Daten bereit.