Zentralisiertes Logging mit Loki
Mit zentralisiertem Logging können Sie alle Ihre Container Logs an einem Ort ansehen und mit Hilfe von Grafana Loki durchsuchen
Details
Loki ist ein Log-Aggregierungssystem inspiriert von Prometheus. Es indexiert dabei nicht den kompletten Inhalt der Logs, sondern nur einzelne Labels für jeden Log Stream. Die Logs werden für 90 Tage aufbewahrt.
Verfügbarkeit
Zentralisiertes Logging ist standardmässig Teil von nine Managed GKE.
Nutzung
Loki kann über das Grafana Web UI genutzt werden. Die Login Details finden Sie auf runway.
Pods mit Labels versehen
Sofern Ihr Pod ein Teil eines Deployments, Statefulset oder eines anderen Controllers ist, werden die Logs automatisch von Loki aufgenommen. Wir empfehlen die "common Labels" zu setzen um die Logs einfacher zu finden.
Sofern ein einzelner Pod gestartet wird, benötigt ein Pod mindestens eines dieser Labels um von Loki gefunden zu werden:
app
name
Logs Abfragen mit LogQL
Die Query-Sprache von Loki nennt sich LogQL. Um die Logs abzufragen, öffnen Sie das Grafana UI und klicken Sie auf Explore in der Leiste auf der linken Seite oder nutzen Sie den direkten Link der auf runway zur Verfügung gestellt wird.
Ein LogQL Query besteht aus zwei Teilen: Dem Log Stream Selector und einem Such-Ausdruck. Ein Stream kann ausgewählt werden indem man ein oder mehrere Labels angibt:
{app="nginx", name=~"frontend.+"}
Um den Stream jetzt nach einer gewissen Zeichenfolge zu durchsuchen, kann ein Such-Ausdruck verwendet werden. Dies kann eine einfache Übereinstimmung sein mit |=
oder ein Regulärer Ausdruck mit Hilfe von |~
. Das ganze kann auch negiert werden, indem anstellt der Pipe ein !
verwendet wird. Hier ein paar Beispiele:
{app="nginx"} |= "GET"
{app="nginx"} |~ "200|201|202"
{app="nginx"} != "GET"
{app="nginx"} !~ "200|201|202"
Für mehr Details zu LogQL, schauen Sie sich die Loki Dokumentation an.
Benutzerdefinierte Logs pushen
Sollten Sie Container haben, welche ihre Log Informationen in Dateien und nicht auf STDOUT
schreiben, so können Sie einen beliebigen Loki client nutzen um Logs zu pushen. Ein Beispiel, wie das ganze aussehen könnte finden Sie weiter unten. In dem Beispiel wird fluent-bit mit dem Loki Plugin als Sidecar zu einem Nginx Container genutzt um zusätzliche Log-Dateien an Loki zu senden. Bitte stellen Sie sicher, dass die <LOKI_SERVICE_ADDRESS>
mit der Addresse, welche Sie auf runway finden können, ersetzt wird. Der Log-Pfad, das Format und die Labels werden mittels Umgebungsvariablen in der Pod Spec an fluent-bit überreicht. Mehr Informationen Über das 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:v0.4.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
Externe Logs pushen
Falls Sie Logs von externen System (wie bspw. einem externen Kubernetes Cluster) in Ihre Loki Instanz senden wollen, so können wir einen durch basic auth gesicherten Ingress erstellen, welcher die eingehenden Daten an Ihre Instanz weiterleitet. Sie können dann fluent-bit oder promtail nutzen um die Logs zu pushen. Bitte kontaktieren Sie den Support um dieses Feature nutzen zu können.