Was ist Kubernetes?

Eine DevOps-Plattform für ein einfaches Deployment und Management verteilter Systeme

Max Rehkopf Max Rehkopf

Kubernetes ist eine Open-Source-Plattform, die Container-Laufzeitsysteme in einem Cluster vernetzter Hardwareressourcen orchestriert. Sie wurde ursprünglich von Google für den skalierbaren Betrieb von Milliarden von Containern pro Woche entwickelt. Google entwickelte dazu im Laufe der Jahre drei verschiedene Container-Managementsysteme und Kubernetes ist dabei das neueste Open-Source-System.

Das Wort Kubernetes stammt aus dem Griechischen und bedeutet Steuermann oder Pilot. Kubernetes ist inzwischen Marktführer und Branchenstandard bei den Orchestrierungstools für das Deployment von Containern und verteilten Anwendungen. Kubernetes ist eine Weiterentwicklung früherer Tools und Systeme, die miteinander kombiniert wurden, um verteilte Systeme zu orchestrieren.

Die DevOps-Evolution begann mit der Verwaltung physischer Rechner in Server-Racks. Diese physischen Rechner existieren noch, sie sind jedoch eher unpraktisch. Virtuelle Maschinen und virtuelle Hardware waren die nächste Abstraktionsebene, die mithilfe von Hypervisoren auf den physischen Rechnern ausgeführt werden. Für die Entwickler war es weiterhin sehr aufwendig, die Infrastruktur und virtuelle Maschinen der gesamten Infrastruktur zu verwalten. Container wurden entwickelt, um es Entwicklern zu ermöglichen, sich mehr auf die Entwicklung allgemeiner Anwendungen und weniger auf die Infrastruktur zu konzentrieren. Anschließend wurde Kubernetes zur Unterstützung der Automatisierung und Verwaltung von Containern in der gesamten Cloud-Infrastruktur eingeführt.

Kubernetes hilft Entwicklern beim Schreiben von Anwendungen, die in einem Cluster ausgeführt werden, da es für die Orchestrierung von Container-Laufzeitsystemen in einem Cluster vernetzter Hardwareressourcen verwendet wird. Wie Google anmerkt, besteht das "Hauptziel des Designs von Kubernets darin, die Bereitstellung und Verwaltung komplexer verteilter Systeme zu vereinfachen und gleichzeitig von der verbesserten Auslastung zu profitieren, die Container ermöglichen".

Kubernetes wird manchmal als K8s oder Kube bezeichnet und wird jetzt von der Cloud Native Computing Foundation gepflegt.

Wofür wird Kubernetes angewendet?

Kubernetes wird grundsätzlich zum Deployment und Management eines Clusters containerisierter Anwendungen genutzt und kann zur Einrichtung einer eigenen CaaS-Plattformverwendet werden. Es hilft bei der Verwaltung von Microservice-Anwendungsarchitekturen und ist heute für den Aufbau robuster moderner DevOps-CI/CD-Pipelines zu einem kritischen Tool geworden.

Um die Beziehung zwischen Kubernetes und Containern besser zu begreifen, ist es wichtig, Container zu verstehen. Kubernetes bündelt eine Reihe von Containern. Ein Container-Set könnte zum Beispiel ein App-Server, ein Redis-Cache oder eine SQL-Datenbank sein. Docker-Container sind ein Prozess pro Container. Kubernetes fasst diese Container in einer Gruppe zusammen, die es auf demselben Computer verwaltet, um den Netzwerk-Overhead zu reduzieren und die Ressourcennutzungseffizienz zu erhöhen.

Kubernetes stellt die in deiner Konfiguration festgelegten, zugrunde liegenden Hardwareressourcen bereit und verwaltet sie. Es vermehrt dann die Anwendungs-Container und verteilt sie auf die Hardwareressourcen. Dies ermöglicht es Kubernetes, Container auf verschiedenen Rechnern oder auf demselben Rechner zu orchestrieren.

Kubernetes hilft auch bei der Optimierung der Anwendungsentwicklung für die Cloud. Die meisten modernen, nicht trivialen Anwendungen bestehen aus verschiedenen Business Case-Zuständigkeiten wie Kontoverwaltung, Zahlungen und Inhalten. Diese separaten Zuständigkeiten eignen sich gut für eine Microservice-Architektur. Wenn Kubernetes bereits zu Beginn der Entwicklung eines neuen Projekts verwendet wird, erzielen das Design und die Implementierung von Microservices oft einen hohen ROI. Wenn das Projekt wächst, wird es von den von Kubernetes angebotenen Funktionen für automatische Skalierung, Überwachung und ein einfaches Deployment profitieren.

Kubernetes kann verwendet werden, um ressourcenintensive Rechenvorgänge zu planen. Einige Projekte erfordern möglicherweise intensive Workloads, die Rechenressourcen für einen längeren Zeitraum beanspruchen. Stell dir ein Projekt vor, das eine komplexe Simulation wie Proteinfaltung, genetische Analyse oder 3D-Grafik-Rendering durchführt. Diese Arten von Projekten verfügen häufig über einen fest zugeordneten Cluster von Rechenressourcen, um die Simulation asynchron auszuführen. Kubernetes ist ein ideales Tool für die Verwaltung dieser Cluster.

Die effiziente Bereitstellung von Ressourcen in einem Cluster kann eine schwierige Aufgabe sein. Wie viel CPU- und Speicher-Container benötigt werden, kann mit der Nutzung schwanken. Kubernetes verfügt sowohl über horizontale als auch über vertikale automatische Skalierungsmechanismen. Es gibt zwei Arten der horizontalen Skalierung. Kubernetes kann weitere Pods auf einem Knoten hinzufügen und entfernen oder dem Cluster neue Rechner hinzufügen und entfernen. Die vertikale Skalierung erhöht oder verringert jedoch die lokalen Rechenressourcen, die ein Container verwendet. Kubernetes hat eine integrierte Überwachung und eine Reihe von konfigurierbaren Regeln, die überprüft werden, um festzustellen, ob hoch- oder herunterskaliert werden soll.

Kubernetes kann in Verbindung mit einigen modernen DevOps-Pipeline-Tools verwendet werden, um eine CI/CD-Pipeline zu erstellen, da es Anwendungs-Deployments und -Updates steuert und automatisiert. Diese Deployment-Automatisierung in Verbindung mit einer robusten automatisierten Testsuite umfasst eine vollständige CI/CD-Pipeline.

Wer sollte Kubernetes benutzen?

Kubernetes eignet sich hervorragend für moderne Hochleistungs-Softwareprojekte. Wenn ein bestehendes Projekt auf Kubernetes umgestellt wird, ist dies jedoch kostspielig und zeitaufwendig. Deshalb ist es oft sinnvoller, dieses System für Projekte einzusetzen, die sich noch in der Anfangsphase befinden. Trotzdem könnte der ROI aus der Migration eines älteren, etablierten Systems zu Kubernetes die Kosten wettmachen. Um dies zu entscheiden, müssen die geschäftlichen Kosten sorgfältig geprüft werden.

Kubernetes vs. Docker

Docker ist eine Container-Laufzeit, während Kubernetes eine Plattform zum Ausführen und Verwalten von Containern aus vielen Container-Laufzeiten ist. Docker ist eine von vielen Container-Laufzeiten, die Kubernetes unterstützt. Man kann sich Kubernetes im Prinzip als Betriebssystem und Docker-Container als Apps vorstellen, die auf dem Betriebssystem installiert werden.

Auch für sich allein ist Docker sehr vorteilhaft für die moderne Anwendungsentwicklung. Es löst das klassische Problem von "funktioniert auf meinem Rechner", aber nirgendwo sonst. Docker ist alleine durchaus in der Lage, das Deployment einiger Container zu bewältigen. Wenn ein System wächst und viele miteinander vernetzte Container hinzugefügt werden müssen, kann Docker jedoch zunehmend in Schwierigkeiten geraten, bei denen Kubernetes Abhilfe schaffen kann.

Grundlagen von Kubernetes

Kubernetes besteht aus vielen Komponenten und hierzu müssen gewisse Konzepte verstanden werden. Eine Gesamtinstallation von Kubernetes wird als Cluster bezeichnet. Alle Kubernetes-Cluster haben eine Haupt-Instanz, die für die Verwaltung des Clusters verantwortlich ist und einen Daemon-Prozess umfasst, der alle Aktivitäten im Cluster koordiniert, wie Deployments, automatische Skalierung und Zustandsüberwachung.

Ein Diagramm, das zeigt, wie Kubernetes funktioniert, und die Master-Instanz, einen Knoten, Kubelet und Pod abbildet.

Der Cluster besteht aus Knoten. Ein Knoten ist eine Rechnereinheit wie eine VM oder physische Hardware, die als Arbeitsinstanz im Kubernetes-Cluster fungiert. Alle Knoten enthalten ein Kubelet, einen Client-Prozess, der über den Haupt-Prozess mit der Kubernetes-API kommuniziert. Knoten enthalten auch ein Container-Laufzeitsystem wie Docker.

Jeder Knoten enthält ein Kubelet. Das Kubelet ist der primäre Prozess, der für die Verwaltung des Knotens und die Kommunikation mit dem Haupt-Prozess verantwortlich ist. Das Kubelet verarbeitet auch einen PodSpec, der den Lebenszyklus und die Wartung von Containern in den von ihm zugewiesenen Pods definiert.

Knoten enthalten Pods, die die kleinste Einheit von Kubernetes sind. Ein Pod ist eine Abstraktion über einen Container. Ein Pod enthält normalerweise viele Container pro Anwendung. Es gibt auch einen versteckten Container in jedem Pod, der als "Pause"-Container bekannt ist und den Netzwerk-Namespace enthält, den andere Container im Pod verwenden, um mit localhost zu kommunizieren.

Services sind statische Zeiger zu Pods. Da Pods kurzlebig sind, verfügen sie über dynamische IPs, die neu zugewiesen werden können, wenn der Pod neu gestartet oder neu erstellt wird. Dies kann unpraktisch sein, wenn versucht wird, sich über eine IP-Adresse mit einem Pod zu vernetzen. Services helfen, indem sie garantieren, dass ein Pod eine statische IP-Adresse hat.

ReplicationController ist ein Mechanismus, der sicherstellt, dass eine bestimmte Anzahl von Pods gleichzeitig ausgeführt wird. Der ReplicationController ist ein Schlüsselelement der automatischen Skalierung von Kubernetes. Wenn es zu viele Pods gibt, wird der ReplicationController sie aussortieren, und wenn es zu wenige gibt, erstellt der ReplicationController neue Pods. ReplicaSets sind die Nachfolger von ReplicationController. Sie haben im Grunde dieselbe Funktion, verfügen jedoch über Dienstprogramme, die es einfacher machen, auf eine Reihe von Pods abzuzielen.

Kubectl ist die Befehlszeilenschnittstelle zur Ausführung von Befehlen für einen Kubernetes-Cluster. Kubectl hat eine umfangreiche Liste verfügbarer Befehle und Optionen zur Verwaltung von Kubernetes.

Kubernetes kann sowohl auf physischer als auch auf virtueller Hardware bereitgestellt werden. MiniKube ist eine leichtgewichtige Version von Kubernetes, die für die Entwicklung verwendet wird und eine VM auf deinem lokalen Computer erstellt, die einen einfachen Cluster mit nur einem Knoten bereitstellt.

Wie funktioniert Kubernetes?

Kubernetes arbeitet mit einer dreiphasigen Schleife aus Kontrollmechanismen. Die drei Phasen einer Kubernetes-Schleife sind wie folgt:

Beobachten
Während der Beobachtungsphase aggregiert Kubernetes eine Momentaufnahme des aktuellen Status des Clusters. Die Kubelets sammeln Statusinformationen über ihre jeweiligen Knoten und geben diesen Zustand an den Haupt-Prozess zurück, wodurch dieser eine ganzheitliche Sicht auf den aktuellen Status des Clusters erhält.

Unterschiede prüfen
Der Status-Snapshot aus der Beobachtungsphase wird dann mit den erwarteten statischen Clusterparametern verglichen, die in der Kubernetes-Konfiguration angegeben sind. Etwaige Diskrepanzen zwischen dem aktuellen Status und dem erwarteten Clusterstatus werden identifiziert, um entsprechende Maßnahmen einzuleiten.

Handeln
Der Haupt-Prozess gibt nun Befehle aus, um den Cluster wieder in den erwarteten Zustand zu bringen. Dies kann das Entfernen oder Erstellen von Pods, horizontale oder vertikale Skalierung über Knoten hinweg und vieles mehr bedeuten.

Die oben aufgeführten drei Phasen beschreiben die allgemeine Kubernetes-Schleife. Ein Kubernetes-Cluster kann jedoch tatsächlich viele verschiedene Schleifen haben. Diese Schleifen werden von Controllern ausgeführt. Der ReplicationController folgt den Phasen der Schleife. Während der Aktionsphase ist der RC allein verantwortlich für das Aussortieren oder Erstellen neuer Pods, die vom ReplicaSet verwaltet werden.

Zusammenfassung

Da Kubernetes ein Open-Source-System ist, kann es sowohl in lokalen als auch in Hybrid-Cloud- oder Public-Cloud-Infrastrukturen eingesetzt werden. Somit lassen sich Workloads mühelos dorthin verschieben, wo du sie benötigst. Kubernetes kann mit modernen Pipeline-Tools wie JenkinsX kombiniert werden, um hochgradig agile und schlanke CI/CD-Systeme zu erstellen, und sollte von allen modernen, leistungsstarken DevOps-Teams genutzt werden.