Ein minimalistischer ELK-Stack auf Minikube
Der ELK-Stack besteht aus drei Tools für die Sammlung, Speicherung, Suche, Analyse und Visualisierung von Logdaten in Echtzeit, was für die Überwachung von Anwendungen, die Fehlerbehebung und die Sicherheitsanalyse von entscheidender Bedeutung ist.
Um Know-how im Kontext des ELK-Stacks (Elasticsearch, Logstash (in diesem Fall Filebeat), Kibana) aufzubauen, habe ich mich entschieden, eine minimalistische lauffähige Version auf Minikube mit Helm und Kubernetes zu deployen.
Hier ein kurzer Wrap-up zu den Begriffen :
- Elasticsearch: Das ist das Herz des ELK-Stacks und eine leistungsstarke Such- und Analysemaschine. Elasticsearch speichert, indiziert und ermöglicht Abfragen von großen Mengen von Logdaten in Echtzeit. Es ist in der Lage, komplexe Suchanfragen durchzuführen und detaillierte Analysen zu liefern.
- Filebeat: Filebeat ist ein leichtgewichtiger Logshipper, der für das Sammeln von Logdaten von verschiedenen Quellen und deren Weiterleitung an Elasticsearch verantwortlich ist. Es liest Logdateien, verfolgt die Änderungen und sendet die Daten an Elasticsearch oder Logstash zur Indizierung.
- Kibana: Kibana ist das Visualisierungstool des ELK-Stacks. Es ermöglicht Benutzern, die in Elasticsearch gespeicherten Daten auf einfache Weise zu visualisieren und zu analysieren. Mit Kibana können Sie Dashboards erstellen, die komplexe Datenmengen in leicht verständlichen Diagrammen und Grafiken darstellen.
Über das Projekt
Das Ziel ist, den ELK-Stack mit den Hauptkomponenten wie Kibana, Elasticsearch und Filebeat auf der Minikube zu deployen. Die Sourcen dazu finden sich im Github Repo, das ich dazu angelegt habe.
1. Voraussetzungen
Bevor wir beginnen, müssen wir einige Voraussetzungen erfüllen. Dazu gehören die Installation und Konfiguration von Minikube und Helm. Ich hatte mich entschieden, Minikube mit 4 GB RAM zu konfigurieren, da Elasticsearch damit stabiler läuft:
minikube config set memory 4096
minikube config set cpus 2
minikube start
minikube config view
Die Verbindung zu Kibana können wir dann später einfach über Port-Forwarding einrichten und somit brauchen das Ingress-Addon für Minikube nicht.
2. Vorbereitung mit Helm
Nachdem wir Minikube und Helm konfiguriert haben, fügen wir das Helm-Repository von Elastic hinzu:
helm repo add elastic https://helm.elastic.co
helm repo update
Es hilft, die Helm-Charts einsehen zu können, um die jeweilige values-xxx.yaml zu konfigurieren:
helm pull elastic/elasticsearch --untar
helm pull elastic/kibana --untar
helm pull elastic/filebeat --untar
Wir werden die ELK-Helm-Charts in dem namespace “logging” anlegen.
3. Deployment Elasticsearch
Wir konfigurieren Elasticsearch wie folgt: siehe values-elastic.yaml. Kurz zusammengefasst sind dort diese Konfigurationen enthalten:
- Anzahl Instanzen
- JVM Speicher & K8s Ressourcen
- Persistent Volume um Daten vorzuhalten
In dem yaml-File sind die einzelnen Konfigurationen dokumentiert.
helm install elasticsearch elastic/elasticsearch -f ./values-elastic.yaml --namespace logging --create-namespace
In der Standardvariante der Helm-Charts hat Elasticsearch ein eigenes Zertifikat, Username & Password. Um zu prüfen, ob Elasticsearch korrekt läuft, kann man den Health-Rest-Endpunkt aufrufen. Dafür kann man wie folgt vorgehen (Wichtig user/pwd finden sich im secret: elasticsearch-master-credentials):
#Entweder ein eigenen pod im namespace deployen und von dort einen curl abschicken
kubectl -n logging run my-shell --rm -i --tty --image alpine/curl -- /bin/sh
curl -k -u elastic:${ELASTICSEARCH_PWD} https://elasticsearch-master:9200/_cluster/health?pretty=true
# oder eine Portweiterleitung für den elastic pod anlegen und dann vom lokalen Terminal curlen
kubectl -n logging port-forward svc/elasticsearch-master 9200
curl -k -u elastic:${ELASTICSEARCH_PWD} https://localhost:9200
Nachdem Elasticsearch läuft, können wir nun Filebeat deployen.
4. Deployment Filebeat
Wir konfigurieren Filebeat wie folgt: siehe values-filebeat.yaml. Kurz zusammengefasst sind dort diese Konfigurationen enthalten:
- Environment mapping der Elasticsearch credentials
- k8s memory resource limit
- Mount der Elasticsearch-CA für Kommunikation mit Elasticsearch
Die embedded filebeat.yml-Konfiguration wird hier kurz erläutert:
#Hier wird konfiguriert, das Filebeat alle k8s logs mit dem Pattern /var/log/containers/*.log liest.
filebeat.inputs:
- type: container
paths:
- /var/log/containers/*.log
#Hier wird beschrieben wie Filebeat die Log Events, vor dem weiterleiten an elastic verarbeiten soll.
#Dabei werden diese anhand des add_kubernetes_metadata processor mit k8s metadaten angereichert.
processors:
#Konfiguration des Prozessors mit Node Umgebungsvariable ${NODE_NAME} wo Filebeat läuft
- add_kubernetes_metadata:
host: ${NODE_NAME}
matchers:
- logs_path:
logs_path: "/var/log/containers/"
#Hier werden die elastic Verbindungsinformationen hinterlegt.
output.elasticsearch:
host: '${NODE_NAME}'
hosts: 'elasticsearch-master:9200'
username: '${ELASTICSEARCH_USERNAME}'
password: '${ELASTICSEARCH_PASSWORD}'
protocol: https
#Es gibt bereits eine ca von elasticsearch, die von dem daemonset gemountet wird,
#damit filebeat diese nutzen kann
ssl.certificate_authorities:
- /usr/share/filebeat/config/certs/ca.crt
Nun deployen wir Filebeat und prüfen mit kubectl, ob der Pod erfolgreich gestartet ist.
helm install filebeat elastic/filebeat -f ./values-filebeat.yaml --namespace logging
# warten bis der filebeat container läuft
kubectl get pods --namespace=logging -l app=filebeat-filebeat -w
5. Deployment Kibana
Schließlich deployen wir Kibana: Wir konfigurieren Kibana wie folgt: siehe values-kibana.yaml. Kurz zusammengefasst sind dort folgende Konfigurationen enthalten:
- Elasticsearch host und credentials, notwendig für die Kommunikation mit Elasticsearch
- Elasticuser wird dadurch für die Anmeldung bei Kibana verwendet
- Credentials als Env über secretRef einbinden, damit wird dieselbe CA wie bei Elasticsearch verwendet. Im yaml-File sind die einzelnen Konfigurationen dokumentiert.
helm install kibana elastic/kibana -f ./values-kibana.yaml --namespace logging
Und zu prüfen, ob Kibana auch funktioniert, können wir zum einen ein Port-forwarding einrichten, um von unseren Client-Rechner mit dem Browser auf die Kibana-UI zuzugreifen. Außerdem (hilft beim Debugging) können wir auch prüfen, ob die Kommunikation cluster-intern funktioniert. Dafür kann man sich auf den Kibana-Pod verbinden und mit curl von dort aus die Elasticsearch Rest-API aufrufen.
#Hiermit kann man über port-forwarding auf die kibana ui zugreifen http://localhost:5601/
kubectl -n logging port-forward pod/kibana-kibana-8647c65456-hb8k4 5601
#Anhand einer shell Verbindung mit den kibana pod kann man die Verbindung von Kibana nach Elastic prüfen
kubectl exec -it kibana-kibana-8647c65456-hb8k4 -- sh
curl -k -u elastic:${ELASTICSEARCH_PWD} https://elasticsearch-master:9200/_cluster/health?pretty=true
Fazit
Dieser Leitfaden zeigt, wie man einen minimalistischen ELK-Stack auf Minikube mit Helm und Kubernetes deployt. Die Verwendung von Minikube ermöglicht es uns, in einer isolierten Umgebung zu experimentieren und sich mit dem ELK-Stacks vertraut zu machen. Trotz der Komplexität der einzelnen Komponenten ist das Deployment und die Konfiguration mit den Standard-Helm-Charts und ein paar Anpassungen relativ überschaubar.