Kubernetes – auch bekannt als „k8s“ oder „kube“ – ist eine Container-Orchestrierungsplattform für die zeitliche Planung und Automatisierung der Bereitstellung, Verwaltung und Skalierung von containerisierten Anwendungen.
Kubernetes wurde ursprünglich von Ingenieuren bei Google entwickelt, bevor es 2014 als Open Source in Umlauf kam. Es ist ein Nachfahre von „Borg“, einer intern bei Google verwendeten Container- Orchestrierungsplattform . Kubernetes ist Griechisch für „Steuermann“ oder „Pilot“, daher das Ruder im Kubernetes-Logo (Link befindet sich außerhalb von ibm.com).
Heute entwickeln sich Kubernetes und das breitere Container-Ökosystem zu einer Allzweck-Computing-Plattform und einem Ökosystem , das mit virtuellen Maschinen (VMs) als Grundbausteinen moderner Cloud-Infrastrukturen und -Anwendungen konkurriert, wenn nicht sogar übertrifft. Dieses Ökosystem ermöglicht es Unternehmen, einen hochproduktiven Platform-as-a-Service (PaaS) zu liefern, der Antworten auf mehrere infrastrukturbezogene und betriebsbezogene Aufgaben und Fragen rund um cloudnative Entwicklung gibt, sodass Entwicklungsteams ihren Fokus ausschließlich auf Codierung und Innovation legen können.
Das folgende Video bietet eine hervorragende Einführung in die Grundlagen von Kubernetes:
Container sind schlanke, ausführbare Anwendungskomponenten, die den Quellcode der Anwendung mit allen Betriebssystembibliotheken und Abhängigkeiten kombinieren, die für die Ausführung des Codes in jeder beliebigen Umgebung erforderlich sind.
Container nutzen eine Form der Betriebssystemvirtualisierung, die es mehreren Anwendungen ermöglicht, eine einzige Instanz eines Betriebssystems gemeinsam zu nutzen, indem sie Prozesse isolieren und die Menge an CPU, Arbeitsspeicher und Festplattenvolumen steuern, auf die diese Prozesse zugreifen können. Weil sie kleiner, ressourceneffiziente und portabler als virtuelle Maschinen (VMs) sind, haben sich Container zu den de-facto-Recheneinheiten modernercloudnativer Anwendungen entwickelt.
In einer aktuellen IBM Studie (PDF, 1,4 MB) berichteten Anwender über mehrere spezifische technische und geschäftliche Vorteile, die sich aus der Einführung von Containern und verwandten Technologien ergeben.
Man kann Container als die neueste Entwicklungsstufe auf dem Kontinuum der Automatisierung und Abstraktion von IT-Infrastrukturen sehen.
In einer traditionellen Infrastruktur laufen Anwendungen auf einem physischen Server und greifen auf alle Ressourcen zu, derer sie habhaft werden können. Sie haben so die Wahl, mehrere Anwendungen auf einem einzigen Server auszuführen und zu hoffen, dass eine davon nicht auf Kosten der anderen Ressourcen verbraucht, oder einen Server pro Anwendung zu dedizieren, was jedoch Ressourcen verschwendet und nicht skalierbar ist.
Virtuelle Maschinen (VMs) sind Server, die von der eigentlichen Computer-Hardware abstrahiert sind und die Ausführung mehrerer VMs auf einem physischen Server oder einer einzelnen VM, die sich über mehrere physische Server erstreckt, ermöglichen. Jede VM führt eine eigene Betriebssysteminstanz aus, und Sie können jede Anwendung in einer eigenen VM isolieren, wodurch die Wahrscheinlichkeit verringert wird, dass Anwendungen, die auf der gleichen zugrunde liegenden physischen Hardware ausgeführt werden, sich gegenseitig in die Quere kommen. VMs sorgen für eine bessere Ressourcennutzung und sind wesentlich einfacher und kostengünstiger zu skalieren als herkömmliche Infrastrukturen. Und sie sind „entbehrlich“ – wenn Sie die Anwendung nicht mehr benötigen, fahren Sie die VM einfach herunter.
Weitere Informationen zu VMs finden Sie unter „Was sind virtuelle Maschinen?“.
Container heben diese Abstraktion auf eine ganz neue Ebene – sie teilen sich nicht nur die zugrunde liegende virtualisierte Hardware, sondern auch einen zugrunde liegenden virtualisierten Betriebssystemkern. Container bieten die gleiche Isolierung, Skalierbarkeit und Verfügbarkeit wie VMs, aber da sie nicht die Nutzlast ihrer eigenen Betriebssysteminstanz tragen, sind sie schlanker (d.h. nehmen weniger Platz in Anspruch) als VMs. Sie sind ressourceneffizienter, d. h. es können mehr Anwendungen auf weniger Rechnern (virtuell und physisch) mit weniger Betriebssysteminstanzen ausgeführt werden. Container sind leichter über Desktop-, Rechenzentrums- und Cloud-Umgebungen hinweg portierbar. Und sie eignen sich hervorragend für Agile- und DevOps-Entwicklungsverfahren.
Unter„Was sind Container?“ finden Sie eine vollständige Erklärung von Containern und Containerisierung. Zusätzlich bietet der Blogbeitrag „Container und VMs: Was ist der Unterschied?“ eine vollständige Übersicht über die vorhandenen Unterschiede.
Docker ist das beliebteste Tool zum Erstellen und Ausführen von Linux®-Containern. Während Frühformen von Containern bereits vor einigen Jahrzehnten eingeführt wurden (mit Technologien wie FreeBSD Jails und AIX Workload Partitions), wurden Container im Jahr 2013 demokratisiert, als Docker sie mit einer neuen entwickler- und cloudfreundlichen Implementierung der breiten Öffentlichkeit zugänglich machte.
Docker hat seine Ursprünge in einem Open-Source-Projekt, aber heute bezieht sich der Begriff Docker auch auf Docker Inc., das Unternehmen, das Docker entwickelt – ein kommerzielles Container-Toolkit, das auf dem Open-Source-Projekt aufbaut (und diese Verbesserungen dann der Open-Source-Community zur Verfügung stellt).
Docker basiert auf der traditionellen Linux-Container-Technologie (LXC), ermöglicht jedoch eine differenziertere Virtualisierung von Linux-Kernel-Prozessen und bietet zusätzliche Funktionen, die Entwicklern die Erstellung, Bereitstellung, Verwaltung und Sicherung von Containern erleichtern.
Zwar gibt es heute alternative Container-Plattformen (z. B. Open Container Initiative (OCI), CoreOS und Canonical (Ubuntu) LXD), doch ist Docker so weit verbreitet, dass es praktisch ein Synonym für Container ist und manchmal fälschlicherweise als Konkurrent zu ergänzenden Technologien wie Kubernetes angesehen wird (siehe nachfolgendes Video „Kubernetes vs. Docker: Keine Entweder-Oder-Frage“).
Mit der zunehmenden Verbreitung von Containern – heute kann ein Unternehmen Hunderte oder Tausende von ihnen haben – mussten die Betriebsteams die Bereitstellung von Containern, den Netzwerkbetriebsowie Skalierbarkeit und Verfügbarkeit planen und automatisieren. Und so entstand der Markt für Container-Orchestrierung.
Während andere Container-Orchestrierungsoptionen – vor allem Docker Swarm und Apache Mesos – schon früh eine gewisse Popularität erlangten, wurde Kubernetes schnell das am weitesten verbreitete Projekt (tatsächlich war es zu einem bestimmten Zeitpunkt das am schnellsten wachsende Projekt in der Geschichte der Open-Source-Software).
Entwickler haben sich für Kubernetes entschieden (und entscheiden sich auch heute weiterhin für Kubernetes), da es eine große Bandbreite an Funktionen bietet, in ein umfangreiches und wachsendes Ökosystem von Open-Source-Tools integriert ist, von verschiedenen Cloud-Service-Anbietern unterstützt wird und portabel ist. Alle führenden Public- Cloud-Anbieter – einschließlich Amazon Web Services (AWS), Google Cloud, IBM Cloud und Microsoft Azure – bieten vollständig verwaltete Kubernetes- Dienste an.
Kubernetes plant und automatisiert Aufgaben im Zusammenhang mit Containern während des gesamten Lebenszyklus der Anwendung, einschließlich:
Wenn Sie bis hierher gelesen haben, wissen Sie bereits, dass Kubernetes zwar eine Alternative zu Docker Swarm ist, aber (entgegen einem hartnäckigen und weitverbreiteten Missverständnis) keine Alternative oder Konkurrenz zu Docker selbst.
Wenn Sie sich bewusst für Docker entschieden haben und umfangreiche Docker-basierte Container-Implementierungen erstellen, ist die Kubernetes-Orchestrierung ein logischer nächster Schritt für die Verwaltung dieser Workloads.
Um mehr zu erfahren, sehen Sie sich das Video „Kubernetes vs. Docker: Keine Entweder-Oder-Frage“ an:
Zu den Hauptkomponenten der Kubernetes-Architektur gehören:
Cluster sind die Bausteine der Kubernetes-Architektur. Die Cluster bestehen aus Knoten, die jeweils einen einzelnen Rechenhost repräsentieren (d. h. eine virtuelle oder physische Maschine).
Jedes Cluster besteht aus einem Master-Knoten, der als Kontrollplan für den Cluster dient, und mehreren Worker-Knoten, die containerisierte Anwendungen bereitstellen, ausführen und verwalten. Der Master-Knoten führt einen Scheduler-Service aus, der auf der Grundlage der von den Entwicklern festgelegten Bereitstellungsanforderungen und der verfügbaren Rechnerkapazität automatisch festlegt, wann und wo die Container bereitgestellt werden. Jeder Worker-Knoten enthält das Tool, das zur Verwaltung der Container verwendet wird – z. B. Docker – und einen Software-Agenten, der als Kubeletbezeichnet wird und der Aufträge vom Master-Knoten empfängt und ausführt.
Entwickler verwalten Cluster-Operationen mit kubectl, einer Befehlszeilenschnittstelle (CLI), die direkt mit der Kubernetes-API kommuniziert.
Einen tieferen Einblick in Kubernetes-Cluster erhalten Sie in: „Kubernetes-Cluster: Architektur für die schnelle, kontrollierte Bereitstellung von Cloud-Anwendungen“.
Pods sind Gruppen von Containern, welche sich die gleichen Rechenressourcen und dasselbe Netzwerk teilen. Sie sind außerdem die Grundeinheit der Skalierbarkeit in Kubernetes: Wenn ein Container in einem Pod mehr Datenverkehr erhält, als er bewältigen kann, repliziert Kubernetes den Pod auf andere Knoten im Cluster. Aus diesem Grund ist es eine gute Idee, Pods kompakt zu halten, so dass sie nur Container enthalten, die sich Ressourcen teilen müssen.
Die Bereitstellung steuert die Erstellung und den Status der containerisierten Anwendung und hält sie am Laufen. Sie legt fest, wie viele Repliken eines Pods auf dem Cluster ausgeführt werden sollen. Wenn ein Pod ausfällt, erstellt die Implementierung einen neuen.
Weitere Informationen zu Kubernetes-Bereitstellungen können Sie in „Kubernetes-Bereitstellungen: Schnelleinstieg“ sehen:
Kubernetes kann Pods bereitstellen und skalieren, aber ist nicht in der Lage, das Routing zwischen ihnen zu verwalten oder zu automatisieren. Es bietet außerdem keine Tools zur Überwachung, Sicherung oder Fehlerbehebung dieser Verbindungen. Mit zunehmender Anzahl von Containern in einem Cluster steigt die Anzahl der möglichen Verbindungspfade zwischen ihnen exponentiell an (z. B. haben zwei Container zwei potenzielle Verbindungen, aber 10 Pods haben 90) – ein potenzieller Konfigurations- und Verwaltungsalptraum!
Genau hier kommt Istio ins Spiel, eine Open-Source-Mesh-Schicht für Kubernetes-Cluster. Istio fügt zu jedem Kubernetes-Cluster einen – für den Programmierer und den Administrator im Wesentlichen unsichtbaren – Sidecar-Container hinzu, der die Interaktionen zwischen den anderen Containern konfiguriert, überwacht und verwaltet.
Mit Istio legen Sie eine einzige Richtlinie fest, die Verbindungen zwischen Containern konfiguriert und müssen so nicht jede Verbindung einzeln konfigurieren. Dies erleichtert das Debuggen von Verbindungen zwischen Containern.
Istio bietet außerdem ein Dashboard, mit dem DevOps-Teams und Administratoren Latenz, Time-in-Service-Fehler und andere Merkmale der Verbindungen zwischen Containern überwachen können. Darüber hinaus bietet Istio Sicherheitsfunktionen – insbesondere ein Identitätsmanagement, das verhindert, dass unbefugte Benutzer einen Service-Aufruf zwischen Containern via Spoofing fälschen – sowie Authentifizierungs-, Autorisierungs- und Auditing-Funktionen (AAA), die Sicherheitsexperten zur Überwachung des Clusters nutzen können.
Knative (ausgesprochen „kay-native“) ist eine Open-Source-Plattform, die auf Kubernetes aufsetzt und zwei wichtige Arten von Vorteilen für die cloudnative Entwicklung bietet:
Serverless Computing (serverloses Computing) ist eine relativ neue Art der Bereitstellung von Code, die native Cloud-Anwendungen effizienter und kostengünstiger macht. Anstatt eine laufende Code-Instanz zu bereitzustellen, die dann sozusagen im Leerlauf auf Anfragen wartet, stellt Serverless Computing den Code je nach Bedarf bereit, skaliert ihn nachfragegerecht hoch oder herunter – und beendet die Ausführung, wenn er nicht gebraucht wird. Serverless verhindert die Verschwendung von Rechenkapazität und Energie und senkt die Kosten, da Sie nur für die Ausführung des Codes zahlen, wenn er tatsächlich ausgeführt wird.
Knative ermöglicht es Entwicklern, einen Container einmal zu erstellen und ihn dann als Software-Service oder als serverlose Funktion auszuführen. Für den Entwickler ist dies unsichtbar: Knative kümmert sich im Hintergrund um die Details, und der Entwickler kann sich ganz auf den Code konzentrieren.
Für Entwickler erfordert die Containerisierung von Code viele sich wiederholende Schritte, und die Orchestrierung von Containern erfordert ein hohes Maß an Konfiguration und Skripterstellung (z. B. Generieren von Konfigurationsdateien, Installieren von Abhängigkeiten, Verwalten von Logging und Tracing und Schreiben von Skripten für die kontinuierliche Integration/kontinuierliche Bereitstellung (CI/CD)).
Knative erleichtert diese Aufgaben durch die Automatisierung von drei Komponenten:
Build: Die Build-Komponente von Knative wandelt Quellcode automatisch in einen cloudnativen Container oder eine Funktion um. Konkret wird dabei der Code aus dem Repository extrahiert, die erforderlichen Abhängigkeiten werden installiert, das Container-Image wird erstellt und in einer Container-Registry anderen Entwicklern zugänglich gemacht. Die Entwickler müssen den Speicherort dieser Komponenten angeben, damit Knative sie finden kann, aber sobald dies geschehen ist, automatisiert Knative den Build.
Serve: Die Serve-Komponente führt Container als skalierbare Services aus; sie kann auf Tausende von Container-Instanzen hochskalieren oder auf null herunterskalieren (Skalierung auf null genannt). Darüber hinaus verfügt Serve über zwei sehr nützliche Funktionen: Konfiguration, die jedes Mal, wenn Sie den Container in die Produktion überführen, Versionen eines Containers (sogenannte Snapshots) speichert und es Ihnen ermöglicht, diese Versionen gleichzeitig laufen zu lassen; und Service-Routing, das es Ihnen ermöglicht, unterschiedliche Mengen an Datenverkehr zu diesen Versionen zu leiten. Sie können diese Funktionen zusammen verwenden, um einen Container-Rollout schrittweise einzuleiten oder um einen Canary-Test einer containerisierten Anwendung durchzuführen, bevor sie in die globale Produktion überführt wird.
Event: Event ermöglicht es bestimmten Ereignissen, containerbasierte Services oder Funktionen auszulösen. Dies ist besonders wichtig für die serverlosen Fähigkeiten von Knative; es braucht etwas, das dem System sagt, wann es eine Funktion bereitstellen muss. Event ermöglicht es Teams, Interesse an Ereignistypen zu äußern, und stellt dann automatisch eine Verbindung mit dem Ereignisproduzenten her. Dann leitet es die Ereignisse an den Container weiter, sodass diese Verbindungen nicht mehr programmiert werden müssen.
Kubernetes ist eines der am schnellsten wachsenden Projekte in der Geschichte von Open-Source-Software, und das Wachstum nimmt weiter Tempo auf. Die Akzeptanz unter den Entwicklern und den Unternehmen, bei denen sie beschäftigt sind, nimmt weiter zu. Hierzu einige bemerkenswerte Zahlen:
Wenn Sie bereit sind, mit Kubernetes zu arbeiten oder Ihre Fähigkeiten im Umgang mit Kubernetes und den Tools des Kubernetes-Ökosystems ausbauen möchten, probieren Sie eines dieser Lernprogramme aus:
Mit Red Hat OpenShift on IBM Cloud haben OpenShift-Entwickler eine schnelle und sichere Möglichkeit zur Containerisierung und Bereitstellung von Unternehmens-Workloads in Kubernetes-Clustern.
Stellen Sie Apps konsistent über On-Premises-, Edge-Computing- und Public-Cloud-Umgebungen beliebiger Cloud-Provider bereit und führen Sie sie unter Verwendung einer Gruppe gängiger Cloud-Services einschließlich Toolchains, Datenbanken und KI aus.
Als vollständig verwaltete serverlose Plattform können Sie mit IBM Cloud Code Engine Ihren Container, Anwendungscode oder Batch-Job auf einer vollständig verwalteten Container-Laufzeitumgebung ausführen.