Im vorherigen Kapitel haben wir Prometheus installiert, um unseren Kubernetes Cluster monitoren zu können. Prometheus alleine speichert jedoch lediglich Metriken in einer Datenbank. Um die Daten auch nutzbar zu machen, z. B. in Dashboards, möchten wir noch einen zusätzlichen Dienst hinzufügen, welcher die Daten aus Prometheus visualisiert. Dabei soll kurz darauf eingegangen werden, wie Services im Kubernetes adressiert werden können und wie ein Dashboard für den Service installiert werden kann.
Grafana deployen
Wie bei Prometheus und dem Ingress Controller zuvor müssen für das Deployment die Kommentare für das Grafana Modul entfernt werden:
module "grafana" {
source = "./modules/grafana"
kubeconfig_path = var.kubeconfig_path
cluster_name = var.cluster_name
}
Der Aufruf von
terraform plan -out=k8s_svc.plan
mit anschließendem
terraform apply k8s_svc.plan
erzeugt dann die Ressourcen im Cluster.
Um auf Grafana zuzugreifen, gibt es zwei Möglichkeiten. Entweder können wir Portforwarding analog zum Zugriff auf Prometheus verwenden oder wir wählen den Weg über den Loadbalancer. Beim Zugriff auf den Loadbalancer muss beachtet werden, dass für den DNS-Namen des Grafanas (grafana.kube.home) kein DNS-Eintrag besteht. Am einfachsten lässt sich dies lösen, indem man die /etc/hosts Datei um einen speziellen Eintrag erweitert, der auf die öffentliche IP des Loadbalancers zeigt: 162.55.154.61 grafana.kube.home
Verbinden von Grafana und Prometheus
Nun können wir Grafana im Browser unter der oben angegebenen Adresse erreichen. Nach dem Login (Credentials: admin/admin) muss als erstes eine Datenquelle hinzugefügt werden. Dies geschieht im Menüpunkt Configuration.
Als mögliche Datenquelle wird Prometheus ausgewählt:
Im nachfolgenden Menü müssen keine großen Anpassungen vorgenommen werden. Es genügt, den Service zu adressieren. Dies erfolgt über das Namensschema <Servicename>.<Namespace>.svc.cluster.local, in diesem Fall prometheus.prometheus metrics.svc.cluster.local.
Hinzufügen des Kubernetes Dashboards
Das Grafana hat Zugriff auf den Datenbestand des Prometheus und jetzt lassen sich mit diesen Daten Dashboards erzeugen. Ein Beispiel-Dashboard befindet sich im Pfad modules/grafana/templates/dashboard.json. Das Dashboard kann über die Zwischenablage in Grafana importiert werden, indem man im linken Seitenmenü unterhalb des ‚+‘ Buttons das Import-Menü öffnet:
Anschließend wählt man dort die zuvor konfigurierte Datenquelle aus und kann dann auf das das Dashboard zugreifen:
Log-Aggregation mit Loki
Loki ist ein von Grafana entwickeltes Log-Aggregations Tool, welches es ermöglicht, im Kubernetes-Cluster Logs einzusammeln. Loki greift dabei einige Ideen von Prometheus auf, worauf die Entwickler:innen auch hinweisen. Im Wesentlichen stellt Loki nach außen eine API bereit, über die Daten gelesen und geschrieben werden können.
Um Logfiles auf einem Cluster-Knoten einzusammeln, benötigt Loki einen lokal laufenden Daemon, der die Daten liest und an Loki sendet. Dies ist im vorliegenden Fall Promtail. Promtail verwendet die Annotation analog zu Prometheus und erlaubt auch im Cluster Service-Discovery.
Um die Service Discovery zu nutzen, müssen wir Promtail lediglich die notwendigen Informationen in der Konfiguration mitgeben. Sollen die Logs in laufenden Containern überwacht werden, genügt es, dies in Promtail einzustellen. Eine weitere wichtige Konfigurationsoption ist unter Clients zu finden. Hier findet sich die Adresse des Service, der den Zugriff auf Loki ermöglicht.
server:
log_level: info
http_listen_port: 3101
clients:
- url: http://simple-loki.loki.svc.cluster.local:3100/loki/api/v1/push
positions:
filename: /run/promtail/positions.yaml
scrape_configs:
# See also
https://github.com/grafana/loki/blob/master/production/ksonnet/promtail/scrap e_config.libsonnet for reference
- job_name: kubernetes-pods
pipeline_stages:
- cri: {}
kubernetes_sd_configs:
- role: pod
Deployment von Loki/Promtail
Um Loki und Promtail zu installieren werden zunächst die Kommentare für das Terraform Modul entfernt:
module "loki" {
source = "./modules/loki"
kubeconfig_path = var.kubeconfig_path
cluster_name = var.cluster_name
}
Danach können beide einfach über ein
terraform plan -out=k8s_svc.plan
mit anschließendem
terraform apply k8s_svc.plan
installiert werden.
Ist Loki installiert, kann man sich die installierten Pods genauer ansehen und sie zu einem Port auf einem der Promtail Daemons verbinden:
$ kubectl get pods --namespace=loki
NAME READY STATUS RESTARTS AGE
simple-loki-0 1/1 Running 0 24h
simple-promtail-jl292 1/1 Running 0 23h
simple-promtail-rqjln 1/1 Running 0 8m36s
simple-promtail-wtqm9 1/1 Running 0 23h
$ kubectl describe pod simple-promtail-rqjln --namespace=loki | grep port prometheus.io/port: http-metrics
$ kubectl port-forward simple-promtail-rqjln 3222:http-metrics -- namespace=loki
Forwarding from 127.0.0.1:3222 -> 3101
Forwarding from [::1]:3222 -> 3101
Danach erhält man über localhost:3222 Zugriff auf die Oberfläche von Promtail:
Integration in Grafana
Wie man sieht, hat Promtail alle Container entdeckt und sammelt für jeden der Container Logdaten ein. Promtail selbst aggregiert die Daten nur und eignet sich nicht für die Analyse der Logfiles. Es ist aber sehr einfach, die Daten zur Analyse in Grafana zu importieren.
Dies geschieht genau wie bei Prometheus über das Einbinden einer Datenquelle, wo wieder die Adresse des Loki-Service angegeben wird:
NGINX Dashboard mit Anzeige von Log-Daten
Im Pfad ./modules/grafana/templates liegt ein weiteres nginx-Dashboard, welches zusätzliche Log-Daten, die über Loki gesammelt werden, darstellt. Wird das Dashboard analog zum vorherigen Dashboard importiert, kann nun eine zusätzliche Datenquelle angegeben werden:
Als Resultat werden nun die Logdaten des Ingress Controllers im Dashboard angezeigt:
Loki sammelt noch viele zusätzliche Daten aus den von Promtail erkannten Datenquellen. Die Komplexität der damit abbildbaren Log-Architektur lässt sich im Rahmen dieses Blogs nur schwer abbilden. Da die Grundlagen jetzt aber gesetzt sind, empfiehlt es sich, hier noch viele Versuche mit dem Log-Browser in Grafana anzustellen.
Zusammenfassung
Im nunmehr letzten Kapitel der Blogreihe haben wir folgende Dinge erreicht:
- Es wurde dem Cluster ein Ingress Container hinzugefügt, mit dessen Hilfe Services innerhalb des Clusters nach außen verfügbar gemacht worden sind. Es wurde gezeigt, wie ein Ingress für einen Dienst konfiguriert wird.
- Prometheus sammelt Metriken über den Zustand des Clusters und speichert sie in einer Datenbank. Zusätzlich können Metriken aus Pods automatisch ausgelesen werden, indem man dem Pod Annotations hinzufügt.
- Grafana kann die Prometheus Metriken in Dashboards darstellen und so den Zustand des Clusters visualisieren.
- Loki sammelt Logs aus dem Ingress Controller ein und zeigt sie im Grafana Dashboard an.
Über die gesamte Blogreihe haben wir nun also mittels Terraform einen vollständigen Kubernetes Cluster aus Cloud Ressourcen aufgebaut, der sowohl Dienste im Netz anbieten kann, als auch den Zugriff auf Metriken und Logdaten seiner Services erlaubt.
Weitere Quellen:
Repos
• https://github.com/michaelgroening/terraform-hcloud-kubernetes – Das Repo, welches das Setup für den Cluster enthält
• https://github.com/michaelgroening/tf_k8s_svc – Die Services für das Deployment des zweiten Teiles des Tutorials
Literatur
Begleitend zu diesem Tutorial sind folgende Quellen zu empfehlen, da sie viele Themen noch umfassender beleuchten können als in einem kurzen Tutorial möglich ist:
Kubernetes:
▪ Kubernetes Up and Running – Sehr gutes Buch, welches das grundlegende Setup von Kubernetes erklärt
▪ https://kubernetes.io/de/docs/home/ – Die Offizielle Dokumentation für Kubernetes
Terraform:
▪ Terraform Up and Running – eine ebenfalls sehr gute Einführung in Terraform
▪ https://www.terraform.io/docs
▪ https://github.com/jrhouston/tfk8s
▪ https://registry.terraform.io/providers/hetznercloud/hcloud/latest/docs
nginx:
▪ https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/ – die Dokumentation für den nginx Ingress-Controller
Grafana:
▪ https://grafana.com/docs/grafana/latest/ – Dokumentation für Grafana
Loki:
▪ https://grafana.com/docs/loki/latest/configuration/ – Dokumentation für Loki
▪ https://grafana.com/docs/loki/latest/clients/promtail/configuration/ – Dokumentation für Promtail