Was ist Kubernetes?

Die Macher von Kubernetes beschreiben ihr Werk wie folgt: »Kubernetes, auch bekannt als K8s*, ist ein Open-Source-System zur Automatisierung von Deployments, Skalierung und dem Management von containerisierten Anwendungen.« Diese Punkte werden häufig unter dem Begriff der Containerorchestrierung zusammengefasst.

Und die Ziele haben sich seit 2014 nicht verändert, also seit Google Kubernetes veröffentlichte. Die Zahl der Nutzer und Unterstützer hingegen steigt dagegen stetig und wächst weiter. Bereits 2015 wurde die gemeinnützige Organisation Cloud Native Computing Foundation, kurz CNCF, aus der Taufe gehoben und mit der Pflege und dem Ausbau von Kubernetes vertraut.

*Das »k« steht für das K in Kubernetes, die Zahl »8« für die folgenden acht Zeichen und das »s« kennzeichnet den letzten Buchstaben des Wortes (k + 8 Zeichen + s oder K»ubernete«s). K8s ist ein sogenanntes Numeronym.

Was beschreibt die Containerisierung?

Was ist ein Container?

Unter »Containerisierung« versteht man, wie anfangs angedeutet, das Betreiben von Anwendungen in sogenannten Containern.

Zur Illustration von »Anwendungen in Containern« wird gerne das Bild eines Containerschiffs herangezogen. In den 1960er-Jahren wurde der Standardcontainer für den Transport zur See eingeführt. Statt Waren lose auf kleinen, teilweise spezialisierten Schiffen zu befördern, kann ein Containerschiff Duzende, Hunderte oder gar Tausende standardisierte Container aufnehmen.

Wichtig dabei: Keiner der Container benötigt einen eigenen Antrieb oder eine eigene Crew. Und was in einem Container gelagert ist, kann sowohl dem Schiff als auch den anderen Containern egal sein. Zudem können heutzutage dank Standardisierung verschiedenartige Waren mit wenig Aufwand zwischen unterschiedlichen Verkehrsmitteln verladen und darauf transportiert werden.

Container in der IT agieren ähnlich. So ist in der IT ein Container ein Software-basierte Standardpaket, welches neben der Anwendung alle erforderlichen Dateien zur Ausführung einer Aufgabe oder Anwendung (sogenannte Workloads) beinhaltet. Dazu gehören Code, Anwendungs- und Systembibliotheken sowie System-Konfiguration. K8s übernimmt die Orchestrierung der Computer-Workloads, die auf den einzelnen Maschinen eines Clusters (Nodes) ausgeführt werden.

Vorteile Container

  • Container erlauben eine Vereinfachung/Optimierung der internen Prozesse (Entwicklung, Testing)

  • Die Vereinfachung bzw. Optimierung schlagen sich auch beim Deployment und den Operations (Betrieb) nieder

  • Container lassen sich zudem beliebig oft einsetzen (starten, stoppen) sowie replizieren

  • Dank der Container-Flexibilität, ist die Unternehmensinfrastruktur Multi-Cloud-fähig

Wichtig: Die Aussage, dass »Container IT-Kosten reduzieren, da weniger IT-Ressourcen (Cloud-Abrechnung nach Verbrauch) benötigt werden« deckt sich leider nicht immer mit der Projektrealität. Die technologische Flexibilität sowie die damit verbundenen Aufwände haben natürlich ihren Preis; sind aber nicht zwingend negativ – vielmehr projektspezifisch zu bewerten. Es zeigen sich daher natürlich auch positive Auswirkungen.

Blick auf die klassische IT

Um das Containerisieren besser zu verstehen, hilft ein Blick auf die »klassische« IT.

So müssen im klassischen Betrieb für Anwendungen auf physischen Computern oder in virtuellen Maschinen (VMs) auf den jeweiligen Rechnern neben dem nötigen Betriebssystem eine Menge Bibliotheken vorgehalten und gepflegt werden. Die vielen installierten Programme stehen nicht selten in Konflikt mit den meist individuellen Anforderungen an ihre Systemumgebung. Und oft unterscheiden sich die Einstellungen in der Entwicklungsumgebung von denen der Testumgebung und die des Produktivsystems. Hinzu kommen der enorme Aufwand für die Bereitstellung der VMs, der Betrieb der physischen Computer und der begrenzte Rahmen für technologische Upgrades.

Hinweis der Redaktion: Die Bereitstellung von Anwendungen über verschiedene Plattformen, orchestriert via Kubernetes, ist heutzutage also nicht nur eine Herausforderung; die Entwicklung selbst ist auch wesentlich komplexer – obwohl der laufende Betrieb vereinfacht wird.

Container und ihre Anwendungen

Ein Container ist natürlich nicht, wie oben angedeutet (Logistik-Beispiel), etwas direkt greifbares. Es handelt sich um eine Virtualisierungstechnik bei der eine Anwendung isoliert von allen anderen Containern und dem darunter liegenden Betriebssystem läuft. Im Gegensatz zur klassischen virtuellen Maschine beinhaltet ein Container also kein eigenes Betriebssystem. Die »containerisierte« Applikation nimmt zunächst nur sich und seine eigenen Bibliotheken wahr. Hinzu kommt, was der »Host« freigibt – beispielsweise ein Netzwerk oder an die einzelnen Maschinen angeschlossene Hardware. Beispiel: GPUs in der Cloud.

Für die »Container Engine«, die die Ausführung der einzelnen Container steuert, wird zwar weiterhin eine Maschine, ein Betriebssystem mit Kernel und Bibliotheken benötigt, diese sind für die Container allerdings nicht sichtbar und weitestgehend uninteressant. Vorteil: Während für klassische Anwendungen Maschinen fast maßgeschneidert bereitgestellt werden, nutzen Container die Container Engine zur Abstraktion von Anwendung, Hardware sowie Umgebung. Einige wenige, leistungsstarke Maschinen können so eine Vielzahl von heterogenen Anwendungen verwalten. Außerdem ist die Skalierung einfacher, da nur generische Nodes statt spezielle Maschinen zum Einsatz kommen.

Kubernetes – der Steuermann

Eingangs (siehe »Was ist ein Container«) wurde das Beispiel mit dem Containerschiff genannt. Würde ein solch riesiges Schiff nun planlos beladen und führungslos über die Weltmeere fahren, wäre eine Katastrophe wahrscheinlich programmiert. Bezogen auf die IT steuert der Steuermann Kubernetes das »IT-Containerschiff« und die meist dazugehörige Flotte; auch Cluster genannt.

Anhand eines den App-Containern beiliegenden Manifests (siehe Konzept Record of Intent) wird dafür gesorgt, dass Kopien einer Anwendung verteilt über die Nodes eines Cluster bereitgestellt werden. Stürzt ein Container vom »IT-Schiff«, wird sofort eine Kopie erstellt – sprich, ein Ersatzcontainer startet automatisch und übernimmt die ihm zuvor zugeteilte Last.

Kubernetes – der Maschinenraum / die K8s-Komponenten

Kubernetes selbst ist eine überschaubare Plattform, die aus mehreren Komponenten besteht und überwiegend in der Sprache »Go« geschriebenen ist.

Das Herz von K8s ist das sogenannte »Control Plane«. Es besteht aus mehreren Anwendungen, die jeweils spezifische Rollen übernehmen und in der Regel selbst über mehrere Nodes verteilt sind.

  • etcd – ein verteilter, robuster und hochverfügbarer Key-Value Store, der alle für K8s relevanten Daten (Konfiguration, Diensterkennung, Zeitplanung) vorhält.

  • kube-scheduler – eine Anwendung, die neu erzeugte Pods (d.h. Ansammlungen von zusammengehörigen Containern) identifiziert und sie einer freien Maschine zur Ausführung zuweist.

  • kube-controller-manager – führt Controller-Prozesse aus, die verschiedene Verwaltungsaufgaben übernehmen. Er publiziert diverse Events und verarbeitet sie selbst um etwa auf Zustandsveränderungen zu reagierten; zum Beispiel die Erkennung und Verwaltung von neuen oder herunterfahrenden Nodes. Zudem verwaltet der »Kube-Controller-Manager« die Zugriffsrechten für die K8s-API (API=Schnittstelle).

  • cloud-controller-manager – verwaltet (sofern vorhanden) eine umgebende Cloud, um beispielsweise die Konfiguration von angebundenen Netzwerken und Load Balancer aktuell zu halten. Aber auch die Überwachung des Lebenszyklus einzelner Nodes in der Cloud gehört zu den Aufgaben.

Hinweis der Redaktion: API - Application Programming Interface: Ein Code-basierter Part einer Software, der beispielsweise anderen Programmen zur Anbindung ans System zur Verfügung gestellt wird. Mit einer API ist es möglich, Datenübertragungen (Maschine-zu-Maschine-Kommunikation) zwischen zwei Systemen oder Applikationen automatisiert durchführen zu lassen.

Worker Nodes

Das Control Plane ist ohne seine »Worker Nodes« nutzlos. Auf ihnen laufen Anwendungen, die das Wirken des Control Plane erst ermöglichen. Neben diesen Anwendungen führen Sie auch die eigentlichen Workloads für den User aus. Für das Orchestrieren werden sie dabei von den folgenden Komponenten unterstützt:

  • Container Engine – die Docker Engine hat sich in den letzten Jahren als Laufzeitumgebung für Container etabliert. Sie ermöglicht es den containerisierten Anwendungen, Infrastruktur-unabhängig ausgeführt zu werden. Sie stellt Tools bereit, beispielsweise für die Bündelung aller Anwendungsabhängigkeiten in einem Container.

  • kubelet – stellt sicher, dass die in den Manifesten (siehe Konzept Record of Intent) angeforderten Container gestartet und korrekt konfiguriert sind. Gleichzeitig sorgt der Kubelet-Service dafür, dass das konstant so bleibt. Die »kubelets« auf den Nodes überwachen den Zustand der Pods, gleichen ihn mit den Manifesten ab und versuchen Unterschiede auszugleichen oder Ausfälle zu kompensieren. Der Service ermöglicht auch die Cluster-Kommunikation untereinander.

  • kube-proxy – ein Netzwerkproxy, der es K8s erlaubt Anfragen von außen an die bereitgestellten Endpoints dynamisch an einen passenden Container weiterzuleiten. Der Service ist auch für die Kommunikation zwischen den Diensten innerhalb des Clusters zuständig.

Hinweis der Redaktion zu »Container Engine«: Es gibt auch andere Werkzeuge, zum Beispiel containerd, CRI-O und Mirantis Container Runtime. Die meisten dieser Engines haben ihren Ursprung in der Linux-Welt. In der Regel werden Kubernetes Cluster daher auf Linux-Umgebungen aufgebaut. Mit aktuelleren Versionen von Windows Server ist aber auch der Betrieb und die Verwaltung von Windows Containern durch Kubernetes möglich.

Konzept Record of Intent

Mit sogenannten Ressourcen (siehe Ressourcen in Kubernetes) definieren verantwortliche Entwickler:innen die wichtigsten Komponenten, um eine Anwendung in K8s bereitzustellen. Unumgänglich sind dabei die erwähnten Manifeste in Form von wohlstrukturierten Textdateien. Sie bilden den gewünschten Zustand für eine Anwendung, den sogenannten »record of intent« ab.

Ressourcen in Kubernetes

Um nun einen Anwendungscontainer hochverfügbar und hochskalierbar in Kubernetes zu betreiben, wird eines dieser Manifeste benötigt. Darin werden zusammenhängende Container in erwähnten Pods organisiert und ergänzende Ressourcen definiert, um für Kubernetes zu beschreiben, wie Pods und ihre Abhängigkeiten bereitgestellt und mit ihnen umgegangen werden soll. Natürlich sind die Ressourcen vielfältig; die grundlegendsten stehen im Folgenden beschrieben.

Deployment – das Deployment beschreibt, wie eine Anwendung im Cluster und wie die einzelnen Instanzen als Pods verteilt werden sollen. Außerdem definiert das Deployment Anforderungen an den Lebenszyklus eines Pods oder Anwendung. Um beispielsweise den Ressourcen-Planer sinnvoll einsetzen bzw. skalieren zu können, beschreibt man unter anderem die geschätzten CPU- und RAM-Ressourcen.

Secrets und ConfigMaps Secrets und ConfigMaps kommen zum Einsatz, um Konfigurationen einzelner Container-Instanzen vom eigentlichen Image zu trennen. Sensible und wichtige Konfigurationen sowie Passwörter werden direkt in die entsprechenden Container injiziert.

Services – zusätzlich können Services definiert werden, um Pods hinter einem Endpunkt zu gruppieren. So können Pods über eine interne Namensauflösung einfach über die vorher definierten Ports angesprochen werden. Das ermöglicht eine sehr einfache Kommunikation zwischen verschiedenen Services.

Ingress – über das Objekt Ingress und dem dazugehörigen Ingress-Controller ist es erlaubt, externe Anfragen an bestimmte Adressen und Pfade auf die dazugehörigen Services zu mappen. Dadurch kann K8s diese Anfragen an die zuständigen Pods zur Beantwortung weiterleiten.

Zusammenspiel der Ressourcen

Die oben beschriebenen Manifeste werden über die zuvor erwähnte API an das Control Plane übermittelt, welches von nun an dafür sorgt, dass die angeforderten Ressourcen bereitgestellt werden und dauerhaft erreichbar sind.

Ist nun beispielsweise eine Erhöhung der Anzahl an gleichzeitig laufender Pods gewünscht oder wird eine Konfigurationsanpassung notwendig, passen zuständige Entwickler:innen das jeweilige Manifest an und übermitteln die Textdatei erneut. Der gewünschte Zielzustand wird aktualisiert. Die Umsetzung übernimmt Kubernetes.

K8s – der Werkzeugkasten

Die oben beschriebene textbasierte Konfiguration in Form der erwähnten Manifeste lädt dazu ein, die definierten Objekte in Versionskontrollsystemen wie »git« zu lagern und dadurch eine Änderungshistorie zu erhalten. Das erleichtert die Änderungsverfolgung und Rollbacks.

Für die Bearbeitung von Textdateien benötigt man in der Regel keine speziellen Werkzeuge, was Anpassungen vereinfacht und sogar im Browser erlaubt. Die Verwendung von wohlstrukturierten Textdokumenten lässt wiederum einen gewissen Grad an automatisierter Validierung von Änderungen vor dem Einspielen zu. Das vermeidet unter anderem auch Fehler im Cluster selbst.

Außerdem erlauben textbasierte Formate mit Templates zu arbeiten, wie es zum Beispiel der Kubernetes Paketmanager Helm (Englisch für Ruder und Steuer) tut.

Das von Kubernetes als offizielles Werkzeug beworbene Kustomize wählt einen anderen Weg und ermutigt Entwickler:innen bestehende Manifeste mit Transformatoren und Generatoren zu erweitern und zu verändern. So ist es möglich, um beispielsweise umgebungsspezifische Anpassungen auf ein allgemeingültiges Basis-Manifest anzuwenden.

Letztlich erzeugen alle Werkzeuge nur strukturierten Text, der wiederum automatisiert verarbeitet oder direkt an K8s übermittelt wird. Folgerichtig ist es denkbar, mittels einer Visualisierung eine vereinfachte Darstellung dieser Werkzeuge zu realisieren. Die Möglichkeiten sind mannigfaltig.

Kubernetes – die Automatisierung

Eines von vielen Werkzeugen um die Lücke zwischen den abgelegten Manifesten und K8s zu schließen ist Flux.

Durch eine Reihe von Controllern, die selbst im K8s-Cluster laufen, wird eine externe Quelle für Konfiguration überwacht. Üblicherweise ist dies ein git Repository. Änderungen an diesem Ort werden von Flux erkannt und direkt auf den Cluster angewendet. Dabei können auch Werkzeuge wie die oben genannten Helm und Kustomize eingebunden werden, um dann den abgelegten Code vor der Einspeisung zu Transformieren.

Flux ist aber auch in der Lage andere Veränderungen zu erkennen. Wird beispielsweise ein neues Container-Image veröffentlicht, kann Flux dies wahrnehmen und die entsprechende Konfiguration in einem git repository anpassen. Das wiederum führt dazu, dass der angepasste Code auf den K8s-Cluster ausgerollt wird.

Diese Ereignisse wird Flux dazu veranlassen, Events zu emittieren. Diese Events sowie die von K8s selbst verbreiteten Nachrichten können wiederum von anderen Werkzeugen aufgegriffen werden, um Automatisierungen wie beispielsweise Tests auszulösen.

Vorteil der Automatisierung: Mit einer gut ausgearbeiteten Strategie und sauber konfigurierten Werkzeugen lassen sich fast alle Schritte im Lebenszyklus einer containerisierten Anwendung automatisieren. Durch eine deklarative Herangehensweise und die hohe Flexibilität von Kubernetes werden Entwicklungsteams weiter entlastet und der Aufwand für das Etablieren einer stabilen CI/CD reduziert. Das auf hohe Widerstandsfähigkeit und Skalierbarkeit ausgelegte Konzept erlaubt es kleine sowie große Workloads effizient und robust zu betreiben.

Kontakt für Ihre digitale ​Lösung mit Unic

Termin buchen

Sie möchten Ihre digitalen Aufgaben mit uns besprechen? Gerne tauschen wir uns mit Ihnen aus: Jörg Nölke und Gerrit Taaks (von links nach rechts).​

Gerrit Taaks

Wir sind da für Sie!

Termin buchen

Sie möchten Ihr nächstes Projekt mit uns besprechen? Gerne tauschen wir uns mit Ihnen aus: Melanie Klühe, Stefanie Berger, Stephan Handschin und Philippe Surber (im Uhrzeigersinn).

Melanie Kluhe
Stefanie Berger
Philippe Surber
Stephan Handschin