Was ist Kubernetes?
Die Open-Source-Lösung Kubernetes dient zur automatisierten Distribution, Skalierung und Verwaltung von Container-Anwendungen. Kubernetes ist heute fast Standard, wenn es um Container-Orchestrierung geht. Zur Anwendung kommt Kubernetes, wenn viele einzelne Microservices verwaltet werden müssen. Einzelne Anwendungen werden oft parallel gestartet, verwaltet und neu strukturiert – manchmal mehrmals täglich. Um Zeit, Kosten und Aufwand zu sparen, übernimmt Kubernetes diese Organisation und Orchestrierung.
Kubernetes ist zuständig für die komplette Bereitstellung von Anwendungen. Diese werden innerhalb von Servern platziert, und zwar so, dass eine optimale Auslastung gewährleistet ist. Mithilfe des Open-Source-Systems nehmen Administrationsarbeiten deutlich ab, denn Kubernetes kümmert sich um die Kommunikation zwischen den Anwendungen und sagt ihnen, wie sie einander finden können.
Der Aufbau von Kubernetes
Um zu verstehen, wie Kubernetes die Steuerung übernimmt, zeigen wir als Erstes den Aufbau von Kubernetes auf. Kubernetes besteht aus zwei Ebenen:
Kubernetes Master: ist die Steuerebene und kümmert sich um die Verwaltung und Steuerung des gesamten Systems.
Arbeitsknoten: führen die bereitgestellten Anwendungen aus und bestehen aus definierten Bereichen.
Kubernetes Master
- Der API-Server: ist für die Kommunikation innerhalb des Kubernetes Clusters zuständig.
- Der Scheduler: weist den bereitstellbaren Komponenten von Anwendungen entsprechende Arbeitsknoten zu.
- Der Controller-Manager: kontrolliert die Replikation von Komponenten, prüft Arbeitsknoten und handhabt Knotenausfälle.
- Die etcd Datenbank: hier wird die gesamte Clusterkonfiguration persistent festgehalten.
Arbeitsknoten
- Container runtime: führt die Docker oder rkt Container aus.
- Kubelet: steuert die Container auf den Arbeitsknoten und kommuniziert mit dem Master.
- Kubernetes-Dienstproxy (Kube-Proxy): ist für Proxy- und Lastenausgleichsfunktionen (Loadbalancing) im Datenverkehr zwischen den Anwendungskomponenten zuständig.
Der Grundstein von Kubernetes bilden die sogenannten Pods.
Ein Pod besteht aus einem oder mehreren Containern, welche jeweils zusammen auf einem Node ausgeführt werden. So wird sichergestellt, dass Container, welche voneinander abhängig sind, als Einheit auf demselben Node ausgeführt werden.
Da sich Container in einem Pod einen Netzwerk-Namespace teilen, können diese direkt via Loopback-Interface miteinander kommunizieren. Im Gegensatz dazu kommunizieren Pods über ihre IP-Adresse miteinander. Pods können mit einem Host oder einer virtuellen Maschine verglichen werden. Die Aufteilung von Pods kann, voneinander unabhängig, für die Skalierung und Aktualisierung der einzelnen Komponente genutzt werden.
Kommunikation von Komponenten
Steuerkomponente
Die Steuerkomponente aus dem Kubernetes Master kommunizieren indirekt über den API-Server miteinander. Der API-Server kommuniziert als einziger direkt mit etcd. Somit lesen und schreiben alle anderen Komponenten über den API-Server in den etcd. Da etcd vor allen Komponenten verborgen ist, vereinfacht es das eventuelle Ersetzen. Diese Kommunikation bietet den Vorteil eines stabilen und optimistischen Sperrsystems und einer stabileren Validierung.
Auch die Komponenten der Steuerebene müssen über API-Server laufen, nur so ist eine konsistente Aktualisierung des Clusterstatus möglich. Der Clusterstatus kann über die CRUD-Schnittstelle (Create, Read, Update, Delete) abgefragt und bearbeitet werden. Die CRUD-Schnittstelle wird über REST-API zur Verfügung gestellt.
Der API-Server ist für die Gültigkeit der geschriebenen Dateien im Speicher zuständig und stellt sicher, dass Änderungen nur von autorisierten Clients durchgeführt werden können.
Die Aufgabe des Schedulers besteht darin, passende Knoten für neu erstellte Pods zu finden und sie zuzuweisen. Dazu gehört auch die Poddefinition (bestehend aus Status, Metadaten und Beschreibung der Podinhalte) über den API-Server. Der Beobachtungsmechanismus des API-Servers hilft ihm dabei. Um den passenden Knoten für den Pod zu finden, filtert der Scheduler die Knotenliste nach Priorität und Wahl. Ziel ist eine gleichmässige Auslastung der Nodes.
Um die Kontrolle über das gesamte System zu behalten, gibt es die Controller im Controller-Manager. Sie passen den Ist-Zustand des Systems an den Soll-Zustand an. Wie der Soll-Zustand genau aussieht, ist in den bereitgestellten Ressourcen des API-Servers festgelegt. Für jede Aufgabe gibt es verschiedene Controller, die innerhalb von Controller-Manager-Prozessen festgelegt sind.
Zum Beispiel: Replikationsmanager für die Replikationskontrolle, Deploymentcontroller, SatefulSet Controller u.v.m. Die Kommunikation läuft dabei indirekt über API-Server miteinander. Um Änderungen an Ressourcen nicht zu verpassen, überwachten sie den API-Server. Benötigte Operationen (Erstellen, Änderung oder Löschen eines Objekts) werden durch die Controller ausgeführt und den neuen Status in die Ressourcen eingetragen.
Komponente Arbeitsknoten
Der Scheduler ist für die Planung der angegebenen Containergruppen auf den Arbeitsknoten zuständig und orientiert sich dazu am Ressourcenbedarf der Containergruppen.
Das Kubelet hat diverse Aufgaben:
- Es teilt die Containerlaufzeit auf, um die nötigen Containerimages herunterzuladen und auszuführen.
- Es ist verantwortlich für alle laufenden Prozesse im Arbeitsknoten.
- Es registriert den Knoten, auf dem rs ausgeführt wird (Erstellen einer Knotenressource im API-Server).
- Der API-Server wird überwacht (betreffend Pods), um notwendige Container zu starten. Zum Beispiel: Der Docker wird auf Basis eines Images angewiesen, einen Container zu starten.
- Überwacht alle laufenden Container und meldet den Status oder Ressourcenverbrauch an den API-Server.
In der Beschreibung der Pods wird festgehalten, welche Containerimages eine Anwendung enthalten, wie die verschiedenen Komponenten miteinander in Beziehung stehen und ob Anwendungen auf demselben Knoten ausgeführt werden sollen. Diese Beschreibung wird vom Entwickler geschrieben.
Die Kube-Proxys (Dienst-Proxys) sind für die Verbindung zwischen Clients und Diensten zuständig, damit die IP und der Port des Dienstes bei einem Pod landet, der den Dienst unterstützt. Falls mehrere Ports zur Verfügung stehen, wird ein Loadbalancing (Lastenausgleich) vorgenommen.
Die Vorteile
Kubernetes nutzt Container, um Umgebungen für verschiedene Anwendungen vorzubereiten. So werden die Administrationsarbeit sowie die Bereitstellung von Diensten vereinfacht und Entwickler müssen sich nicht mehr darum kümmern, auf welchem Server welche Anwendung läuft. Voraussetzung dafür ist, dass die Server die benötigten Ressourcen zur Verfügung stellen.
Als Grundlage nimmt Kubernetes immer die Beschreibung der Ressourcenanforderungen des Entwicklers. Danach kümmert sich Kubernetes darum, auf welchen Arbeitsknoten welche Anwendung laufen soll. Bei Bedarf kann er so Anwendungen aufräumen und woanders platzieren. Diese Methode ist viel effizienter, als wenn Entwickler dies von Hand erledigen würden, da er immer die optimale Kombination finden und so eine gute Auslastung garantieren kann.
Ein weiterer wichtiger Punkt ist die Zustandsprüfung der Arbeitsknoten. Denn je grösser die Infrastruktur, desto höher die Wahrscheinlichkeit eines Ausfalls eines Knotens. In diesem Fall verschiebt Kubernetes die Anwendungen auf andere Knoten.
Als Letztes bietet die automatische Skalierbarkeit von Pods den Vorteil, Redundanzen von Pods zu vermeiden. Denn Kubernetes ist in der Lage, einen Pod vertikal zu skalieren.
Kubernetes in unserem virtual Datacenter
Wir stellen Kubernetes in unserem virtual Datacenter kostenlos zur Verfügung. Nebst den gewohnten Vorteilen unseres vDCs wie intuitive Bedienung, minutengenaue Abrechnung deiner Ressourcen und höchsten Sicherheitsstandards in unserem Datacenter DATAROCK, musst du dich dank Kubernetes nicht um die Orchestrierung kümmern. So kannst du dich ganz auf die Anwendungsentwicklung konzentrieren.
Dieser Blog entstand in Zusammenarbeit mit gridscale.