{"id":31533,"date":"2026-07-16T09:37:31","date_gmt":"2026-07-16T07:37:31","guid":{"rendered":"https:\/\/www.sysbus.eu\/?p=31533"},"modified":"2026-07-15T15:43:07","modified_gmt":"2026-07-15T13:43:07","slug":"kubernetes-und-helm-charts","status":"publish","type":"post","link":"https:\/\/www.sysbus.eu\/?p=31533","title":{"rendered":"Kubernetes und helm charts"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Autor: Dr. G\u00f6tz G\u00fcttich, Senior Security Consultant bei Twinsoft<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Beitrag befassen wir uns mit der Funktionsweise von \u201ehelm\u201c und den dazuge\u00f6rigen \u201echarts\u201c. helm ist eine Paketverwaltung f\u00fcr Kubernetes und \u00fcbernimmt im Betrieb \u00e4hnliche Aufgaben wie apt und dnf unter Linux oder pip f\u00fcr Python. Die charts sind die dazugeh\u00f6rigen Pakete. helm reduziert die Komplexit\u00e4t von Kubernetes-Umgebungen, erm\u00f6glicht standardisierte Deployments und vereinfacht Updates beziehungsweise Rollbacks.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"409\" src=\"https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/Dashboard-1-1024x409.png\" alt=\"\" class=\"wp-image-31635\" srcset=\"https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/Dashboard-1-1024x409.png 1024w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/Dashboard-1-300x120.png 300w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/Dashboard-1-768x307.png 768w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/Dashboard-1-1536x613.png 1536w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/Dashboard-1-1320x527.png 1320w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/Dashboard-1.png 1909w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Die Live-Logs im Kubernetes-Dashboard  &#8211; Screenshot: Dr. G\u00f6tz G\u00fcttich<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Da wird \u00fcber keinen Test-Kubernetes-Cluster verf\u00fcgen, richten wir uns zun\u00e4chst eine Testumgebung mit Hilfe von Minikube ein. Minikube erm\u00f6glicht es, einen lokalen Kubernetes-Cluster auf dem eigenen Endpoint zu betreiben. Das Tool eignet sich hervorragend f\u00fcr Schulungen, Tests und Entwicklungsarbeiten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach der Installation von Minikube werden wir zun\u00e4chst einmal einen nginx-Webserver mit helm in Kubernetes als Pod zum Laufen bringen, Ingress und DNS so konfigurieren, dass man auf diesen Webserver zugreifen kann, die \u00dcberwachungsfunktionen des Systems nutzen, um den Ressourcenverbrauch zu analysieren und eine WordPress-Installation mit einer Datenbank mit Hilfe von helm vornehmen. Danach skalieren wir die Zahl der Pods automatisch nach Last mit Hilfe des Kubernetes Autoscalers und erzeugen ein eigenes helm chart.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"417\" src=\"https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/pods-1024x417.png\" alt=\"\" class=\"wp-image-31636\" srcset=\"https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/pods-1024x417.png 1024w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/pods-300x122.png 300w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/pods-768x312.png 768w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/pods-1536x625.png 1536w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/pods-1320x537.png 1320w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/pods.png 1895w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Die \u00dcbersicht \u00fcber die Pods und die CPU- und Speicherauslastung im Kubernetes-Dashboard  &#8211; Screenshot: Dr. G\u00f6tz G\u00fcttich<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Noch kurz zum Verst\u00e4ndnis: Pods sind logische Hosts, auf ihnen laufen einer oder mehrere Container, sie haben eine externe IP-Adresse, sie sind \u00fcber Namen und Namespace identifizierbar und sie teilen Storage-Ressourcen. Die interne Kommunikation findet via IPC (Inter Process Communication) statt. Pods sind kurzlebig und werden \u00fcber Controller gehandhabt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Minikube installieren<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Als Testsystem kommt ein Ubuntu 26.04 zum Einsatz. Dieses sollte mindestens 2 CPUs und 4 GByte RAM mitbringen. Eine der Grundvoraussetzungen f\u00fcr den Betrieb von Minikube ist eine vorhandene Docker -Umgebung zum Betreiben von Kubernetes. Deswegen bringen wir erstmal das installierte Linux auf den aktuellen Stand und installieren danach curl, Minikube und Docker.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>sudo apt install curl<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>curl -LO <\/em><a href=\"https:\/\/storage.googleapis.com\/minikube\/releases\/latest\/minikube-linux-amd64\"><em>https:\/\/storage.googleapis.com\/minikube\/releases\/latest\/minikube-linux-amd64<\/em><\/a><em><\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>sudo install minikube-linux-amd64 \/usr\/local\/bin\/minikube<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>sudo snap install kubectl \u2013-classic<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>sudo apt install docker.io<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>sudo systemctl enable \u2013now docker<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>sudo apt install docker-compose<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>sudo usermod -aG docker $USER &amp;&amp; newgrp docker<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt k\u00f6nnen wir Minikube starten:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube start \u2013-driver=docker<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nachdem Minikubes Startvorgang abgeschlossen wurde, l\u00e4sst sich der Status des Clusters abfragen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube status<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Ausgabe sollte so aussehen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>type: Control Plane<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>host: Running<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubelet: Running<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>apiserver: Running<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubeconfig: Configured<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit dem Befehl:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl get nodes<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bringen wir in Erfahrung, dass unser Node \u201eReady\u201c ist. Jetzt kann es daran gehen, helm zu installieren, ein Repo hinzuzuf\u00fcgen und letzteres auf den aktuellen Stand zu bringen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>sudo snap install helm &#8211;classic<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>helm repo add bitnami <\/em><a href=\"https:\/\/charts.bitnami.com\/bitnami\"><em>https:\/\/charts.bitnami.com\/bitnami<\/em><\/a><em><\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>helm repo update<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt kann es daran gehen, ein chart im Minikube-Cluster zu installieren. F\u00fcr diesen Test nehmen wir \u201enginx\u201c:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>helm install my-release bitnami\/nginx<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Status der Pods l\u00e4sst sich immer mit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl get pods<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00fcberpr\u00fcfen. Hier sollte jetzt etwas wie das Folgende erscheinen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; READY&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STATUS&nbsp;&nbsp;&nbsp; RESTARTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AGE<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>my-release-594c4c58bf-vdhnm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1\/1&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Running&nbsp;&nbsp; 1 (13d ago)&nbsp;&nbsp; 13d<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Weitere wichtige Befehle:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>helm list<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">zeigt alle installierten Apps und<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>helm search repo nginx<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">zeigt die in den Repositories verf\u00fcgbaren Versionen der Apps.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>helm status my-release<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pr\u00e4sentiert die Dokumentation des chart-Erstellers und<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>helm get values my-release<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">zeigt die beim Installieren gesetzten Einstellungen. Entfernen l\u00e4sst ich das chart \u00fcber<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>helm uninstall my-release<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Das Aktualisieren der Software<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um Minikube und Kubernetes im laufenden Betrieb zu aktualisieren sind diverse Schritte erforderlich. Zun\u00e4chst einmal ist Minikube selbst auf den aktuellen Stand zu bringen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>curl -LO https:\/\/storage.googleapis.com\/minikube\/releases\/latest\/minikube-latest.x86_64.rpm<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>sudo install minikube-linux-amd64 \/usr\/local\/bin\/minikube<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die einfachste Option, Kubernetes zu aktualisieren ist eine Neuerstellung des Clusters:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube delete<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube start \u2013-driver=docker \u2013-kubernetes-version=latest<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">kubectl und helm werden \u00fcber snap aktualisiert:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>sudo snap refresh helm<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>sudo snap refresh kubectl<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Weitere wichtige Befehle f\u00fcr Minikube sind<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube pause<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das friert den Cluster ein. Wieder in Betrieb nehmen l\u00e4sst er sich mit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube unpause<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ausschalten l\u00e4sst sich das System mit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube stop<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>helm in der Praxis<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nachdem wir jetzt alles installiert und auf den aktuellen Stand gebracht haben, k\u00f6nnen wir einen neuen Cluster erzeugen und mit der eigentlichen Arbeit beginnen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube delete<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube start \u2013-driver=docker<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt installieren wir erst einmal ein neues nginx-pod. Wir nennen es \u201emy-nginx\u201c und setzen den Service-Typ auf \u201eLoadBalancer\u201c. Letzteres muss angegeben werden, damit die Webseite sp\u00e4ter \u00fcber das Netz erreichbar ist:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>helm install my-nginx bitnami\/nginx &#8211;set service.type=LoadBalancer<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes l\u00e4dt jetzt das Image und startet den Container. Der aktuelle Status l\u00e4sst sich wieder mit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl get pods<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00fcberpr\u00fcfen. Sobald unter \u201cSTATUS\u201d Running steht, ist nginx bereit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um nun auf den Webserver zuzugreifen, kann entweder ein Tunnel oder ein weitergeleiteter Port zum Einsatz kommen. F\u00fcr den Tunnel m\u00fcsste der Befehl<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube tunnel<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">in einem zus\u00e4tzlichen Terminalfenster ausgef\u00fchrt werden. Das Port-Forwarding wird \u00fcber<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl port-forward svc\/my-nginx 8080:80<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">aktiviert. Danach ist der Server \u00fcber die URL <a href=\"http:\/\/localhost:8080\">http:\/\/localhost:8080<\/a> erreichbar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Einer der gro\u00dfen Vorteile von helm ist, dass sich Anwendungen \u00e4ndern lassen, ohne sie zu l\u00f6schen. Wenn wir beispielsweise die Anzahl der Instanzen von nginx erh\u00f6hen m\u00f6chten, um Hochverf\u00fcgbarkeit zu simulieren, reicht ein<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>helm upgrade my-nginx bitnami\/nginx &#8211;set replicaCount=3<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt kann man mit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl get pods<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ansehen, wie das System zwei weitere Instanzen hochf\u00e4hrt. L\u00f6scht man Instanzen w\u00e4hrend des Betriebs durch<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl delete pod {Instanzname}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">so startet das System gleich wieder neue, um die Zahl der definierten Instanzen wieder zu erreichen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Den Ressourcenverbrauch analysieren<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um herauszufinden, wieviel CPU und RAM der nginx verbraucht, m\u00fcssen wir das metrics-server-Addon aktivieren:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube addons enable metrics-server<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt zeigt<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl top pods<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">den Ressourcenverbrauch an.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ingress und DNS konfigurieren<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Momentan greifen wir per localhost auf den Web-Server zu. Sinnvoller ist es, den nginx \u00fcber die Dom\u00e4ne <a href=\"http:\/\/mein-nginx.local\">http:\/\/mein-nginx.local<\/a> erreichbar zu machen. Dazu installieren wir einen Ingress-Controller, der als zentraler Einstiegspunkt den Traffic annimmt, konfigurieren eine Ingress-Ressource und passen die hosts-Datei so an, dass der Browser die Dom\u00e4ne findet. Letzteres lie\u00dfe sich auch \u00fcber eine DNS-Konfiguration realisieren, da das Anpassen von DNS-Servern aber nicht der Fokus dieses Playbooks ist, w\u00e4hlen wir die hosts-Datei. Los geht es mit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube addons enable ingress<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt pr\u00fcfen wir, ob der Controller-Pod hochgefahren ist:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl get pods -n ingress-nginx<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sobald der Controller-Pod auf \u201erunning\u201c steht, k\u00f6nnen wir die Ingress-Ressource erstellen. Dazu verwenden wir eine yaml-Datei, in der steht \u201eAlles was mit dem Hostnamen \u201amein-nginx.local\u2018 ankommt, soll auf Port 80 des Service \u201amy-nginx\u2018 weitergeleitet werden. Wir nennen die Datei \u201eingress.yaml\u201c und sie sieht folgenderma\u00dfen aus:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>apiVersion: networking.k8s.io\/v1<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kind: Ingress<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>metadata:<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; name: nginx-ingress<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; annotations:<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp; nginx.ingress.kubernetes.io\/rewrite-target: \/<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>spec:<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; rules:<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; &#8211; host: mein-nginx.local<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp; http:<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paths:<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; path: \/<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pathType: Prefix<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; backend:<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; service:<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name: my-nginx<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port:<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number: 80<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anwenden l\u00e4sst sich die Datei nun mit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl apply -f ingress.yaml<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt finden wir die IP-Adresse des Minikube-Knotens heraus:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube ip<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diese wird nun in die \/etc\/hosts-Datei eingetragen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>{IP-Adresse}&nbsp;&nbsp;&nbsp; mein-nginx.local<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt l\u00e4sst sich der Webserver \u00fcber die URL <a href=\"http:\/\/mein-nginx.local\">http:\/\/mein-nginx.local<\/a> im Browser \u00f6ffnen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn wir einen zweiten Dienst \u00fcber die gleiche IP-Adresse anbieten wollen, m\u00fcssen wir nun lediglich diesen zweiten Dienst (eine andere Webseite oder ein anderer Server wie Apache) in Kubernetes starten, in der ingress.yaml eine zweite Regel hinzuf\u00fcgen, beispielsweise f\u00fcr die URL \u201emeine-app.local\u201c und die URL der zweiten App mit der gleichen Minikube-IP-Adresse in die hosts-Datei eintragen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Dashboard und Monitoring<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um die Monitoring-Funktionen zu aktivieren, m\u00fcssen (falls nicht schon geschehen) folgende addons aktiviert werden:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube addons enable dashboard<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>minikube addons enable metrics-server<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann \u00f6ffnet Minikube eine Kubernetes-Dashboard-Seite, die die vorhandenen Workloads\/Pods, Services und ConfigMaps anzeigt. Klickt der Anwender auf einen Pod-Eintrag, lassen sich die Live-Logs \u00fcber das kleine Linien-Symbol oben anzeigen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Unter Services sollten jetzt der nginx-Dienst und der Ingress-Controller erscheinen. Die ConfigMaps erm\u00f6glichen es, die Konfigurationsdaten von Container-Images zu trennen, also beispielsweise unter nginx eine andere Index.html anzuzeigen als die Default-Webseite. W\u00e4hrend ConfigMaps unkritische Daten enthalten, existieren f\u00fcr sensible Daten die so genannten Secrets, die \u00e4hnlich funktionieren aber auf sichere Art und Weise Passw\u00f6rter, Tokens und Keys bereitstellen k\u00f6nnen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Dashboard zeigt uns an, dass es praktisch keine Last auf dem nginx-Server gibt. Jetzt werden wir Last erzeugen, um das Echtzeit-Monitoring unter die Lupe zu nehmen. Dazu nutzen wir den Befehl \u201eab\u201c (Apache Benchmark). Dieser l\u00e4sst sich folgenderma\u00dfen installieren:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>sudo apt install apache2-utils<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nun k\u00f6nnen wir 50.000 Anfragen mit 100 gleichzeitigen Verbindungen schicken:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>ab -n 50000 -c 100 <\/em><a href=\"http:\/\/mein-nginx.local\/\"><em>http:\/\/mein-nginx.local\/<\/em><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt steigt die CPU-Auslastung des nginx-Pods sprunghaft an, was im Dashboard klar zu sehen ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Installation von WordPress mit Datenbank als zweite Instanz parallel zu nginx<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zun\u00e4chst installieren wir WordPress mit MariaDB und einem eigenen Namen sowie einer Ingress-Anbindung. Au\u00dferdem setzen wir ein Passwort, damit wir uns einloggen k\u00f6nnen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>helm install mein-blog bitnami\/wordpress \\<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; <\/em><em>&#8211;set wordpressUsername=admin \\<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; &#8211;set wordpressPassword=geheim \\<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; &#8211;set mariadb.auth.rootPassword=geheim-db \\<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; &#8211;set service.type=ClusterIP \\<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; &#8211;set ingress.enabled=true \\<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; &#8211;set ingress.hostname=mein-blog.local \\<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; &#8211;set ingress.annotations.&#8220;kubernetes\\.io\/ingress\\.class&#8220;=nginx<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn wir jetzt mit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl get pods<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">nachsehen, so beobachten wir, wie das WordPress-Pod und das MariaDB-Pod erstellt werden. Dazu kommen zwei Persistent Volumes, eines f\u00fcr die Datenbank und eines f\u00fcr WordPress. Letztere verhindern, dass Blog-Posts verloren gehen, wenn die Maschine neu startet. Im n\u00e4chsten Schritt tragen wie die URL \u201emein-blog.local\u201c mit der Minikube-IP in die hosts-Datei ein. Dazu schreiben wir sie einfach in die gleiche Zeile hinter die nginx-Domain.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im Dashboard kann man nun unter \u201ePods\u201c die Interaktionen zwischen WordPress und MariaDB sehen und unter Persistent Volume Claims (PVC) findet sich der reservierte Speicherbereich. Das Blog selbst l\u00e4sst sich \u00fcber <a href=\"http:\/\/mein-blog.local\">http:\/\/mein-blog.local<\/a> aufrufen und nutzen. Wird ein Blogpost erstellt und das Pod gel\u00f6scht, so startet Kubernetes sofort ein neues Pod und die Daten des Blogposts gehen nicht verloren. Auf diese Weise lassen sich mehrere Anwendungen sauber getrennt und hochverf\u00fcgbar auf einer Hardware ausf\u00fchren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Das Autoscaling<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenden wir uns jetzt dem Autoscaling zu. Wir m\u00f6chten dabei erreichen, dass standardm\u00e4\u00dfig in unserem Cluster 2 nginx-Pods laufen. Steigt die Last, so sollen weitere Pods (bis maximal 5) hinzukommen. Sinkt die Last wieder, so sollen die zus\u00e4tzlichen Pods automatisch abgebaut werden. Dazu verwenden wir den Horizontal Pod Autoscaler (HPA) von Kubernetes. Diese beh\u00e4lt die CPU- und Speicherlast im Blick und schaltet dynamisch Instanzen dazu oder weg.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Damit Kubernetes erkennen kann, wann ein Pod ausgelastet ist, m\u00fcssen wir festlegen, wieviel CPU es verbrauchen darf. Deswegen aktualisieren wir die nginx-Instanz mit helm und geben ihr neue Limits mit. Gleichzeitig setzen wir die Zahl der standardm\u00e4\u00dfig aktiven Instanzen auf 2:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>helm upgrade my-nginx bitnami\/nginx \\<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; &#8211;reuse-values \\<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; &#8211;set replicaCount=2 \\<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; &#8211;set resources.requests.cpu=100m \\<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; &#8211;set resources.limits.cpu=200m<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">100m steht hier f\u00fcr 100 Millicores, also 10 % eines CPU-Kerns. Jetzt folgt die Regel, die besagt \u201eWenn die Pods im Schnitt mehr als 50 % ihrer angeforderten CPU verbrauchen, skaliere hoch bis auf maximal 5\u201c:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl autoscale deployment my-nginx &#8211;cpu-percent=50 &#8211;min=2 &#8211;max=5<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl get hpa<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">l\u00e4sst sich der Status \u00fcberwachen. Es dauert etwa 1 bis 2 Minuten, bis der Server die Daten zuverl\u00e4ssig liefert. Jetzt starten wir den Lasttest in einem zweiten Terminal:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>ab -n 500000 -c 100 <\/em><a href=\"http:\/\/mein-nginx.local\/\"><em>http:\/\/mein-nginx.local\/<\/em><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt k\u00f6nnen wir im ersten Terminal mit Hilfe von<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl get hpa<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">sehen, dass der Prozentwert \u00fcber 50 % steigt (unter TARGETS). Kurz darauf zeigt<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl get pods<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">an, dass Kubernetes neue Pods erstellt. Gleichzeitig kann man im Dashboard sehen, wie die Kurve nach oben geht. Nach dem Stoppen des ab-Befehls f\u00e4llt die Last und die zus\u00e4tzlichen Pods werden 5 Minuten sp\u00e4ter wieder gel\u00f6scht. Diese Wartezeit verhindert ein st\u00e4ndiges Hoch- und Runterfahren bei kurzen Lastspitzen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sichern und Wiederherstellen von Pod- und Deployment-Konfigurationen<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hat man ein Pod zur Zufriedenheit konfiguriert und alles l\u00e4uft wie gew\u00fcnscht, besteht \u00fcbrigens die M\u00f6glichkeit, die Konfiguration des laufenden Pods mit dem Befehl<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl get pod {Name des Pods} -o yaml &gt; datei.yaml<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">in einer yaml-Datei zu sichern. Wird das Pod gel\u00f6scht, so l\u00e4sst es sich sp\u00e4ter problemlos mit dem Befehl<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl apply -f datei.yaml<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">wiederherstellen. Soll das ganze Deployment, das die Pods steuert, gesichert werden, so l\u00e4sst sich das mit dem Befehl<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl get deployment {Name} -o yaml &gt; datei.yaml<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">realisieren.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"410\" src=\"https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/Workloads-1024x410.png\" alt=\"\" class=\"wp-image-31637\" srcset=\"https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/Workloads-1024x410.png 1024w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/Workloads-300x120.png 300w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/Workloads-768x307.png 768w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/Workloads-1536x615.png 1536w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/Workloads-1320x528.png 1320w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2026\/07\/Workloads.png 1904w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Der Status der Workloads im Kubernetes-Dashboard  &#8211; Screenshot: Dr. G\u00f6tz G\u00fcttich<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Eigene helm charts erstellen<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Schluss wollen wir noch demonstrieren, wie sich eigene helm charts erzeugen lassen. Dazu installieren wir den Klassiker \u201eNethack\u201c in unserem Cluster, f\u00fcr den in den Repositories kein chart vorhanden ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Als Basis verwenden wir das Docker-Image \u201ejwodder\/nethack\u201c. Der Befehl<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>helm create nethack-chart<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">erstellt eine Grundstruktur f\u00fcr das neue chart. Im n\u00e4chsten Schritt \u00f6ffnen wir die Datei \u201enethack-chart\/values.yaml\u201c und passen das Image an. Der Bereich \u201eimage\u201c der yaml-Datei muss folgenderma\u00dfen aussehen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>image:<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; <\/em><em>repository: jwodder\/nethack<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; pullPolicy: IfNotPresent<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp; tag: &#8222;latest&#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt m\u00fcssen wir daf\u00fcr sorgen, dass Kubernetes wei\u00df, dass das Pod einen interaktiven Terminal-Stream \u00f6ffnen muss, da sonst niemand mit dem Spiel interagieren kann. Das geht \u00fcber \u201etty: true\u201c und \u201estdin: true\u201c. Wir \u00f6ffnen die Datei \u201enethack-chart\/templates\/deployment.yaml\u201c und f\u00fcgen unter dem Abschnitt \u201econtainers:\u201c auf der gleichen Ebene wie \u201eimage:\u201c hinzu:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>containers:<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; name: {{ .Chart.Name }}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image: &#8222;{{ .Values.image.repository }}:{{ .Values.image.tag }}&#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stdin: true&nbsp; # Entspricht -i<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tty: true&nbsp;&nbsp;&nbsp; # Entspricht -t<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Au\u00dferdem ergibt es auch Sinn, die Abschnitte \u201elivenessProbe\u201c und \u201ereadinessProbe\u201c in der deployment.yaml auszukommentieren, sonst startet Kubernetes das Pod st\u00e4ndig neu, da es nicht auf HTTP-Anfragen reagiert (Nethack ist ja kein Webserver). Jetzt l\u00e4sst sich das chart installieren:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>helm install my-nethack .\/nethack-chart<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um sich mit dem Spiel zu verbinden, m\u00fcssen wir erst den Namen des Nethack-Pods herausfinden. Das geht mit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl get pods<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Danach wird die Verbindung mit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>kubectl attach -it {Name des Pods}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">hergestellt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Autor: Dr. G\u00f6tz G\u00fcttich, Senior Security Consultant bei Twinsoft<\/p>\n<p>In diesem Beitrag befassen wir uns mit der Funktionsweise von \u201ehelm\u201c und den dazuge\u00f6rigen \u201echarts\u201c. helm ist eine Paketverwaltung f\u00fcr Kubernetes und \u00fcbernimmt im Betrieb \u00e4hnliche Aufgaben wie apt und dnf unter Linux oder pip f\u00fcr Python. Die charts sind die dazugeh\u00f6rigen Pakete. helm reduziert die Komplexit\u00e4t von Kubernetes-Umgebungen, erm\u00f6glicht standardisierte Deployments und vereinfacht Updates beziehungsweise Rollbacks.<\/p>\n","protected":false},"author":81,"featured_media":31636,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[1],"tags":[],"class_list":["post-31533","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=\/wp\/v2\/posts\/31533","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=\/wp\/v2\/users\/81"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=31533"}],"version-history":[{"count":2,"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=\/wp\/v2\/posts\/31533\/revisions"}],"predecessor-version":[{"id":31638,"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=\/wp\/v2\/posts\/31533\/revisions\/31638"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=\/wp\/v2\/media\/31636"}],"wp:attachment":[{"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=31533"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=31533"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=31533"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}