Читать книгу Kubernetes - Kelsey Hightower - Страница 22
2Container erstellen und ausführen
ОглавлениеKubernetes ist eine Plattform zum Erstellen, Deployen und Managen verteilter Applikationen. Diese Applikationen gibt es in vielen Größen und Formen, aber letztendlich bestehen sie alle aus einer oder mehreren Programmen, die auf bestimmten Maschinen laufen. Diese Programme erwarten Eingaben, bearbeiten Daten und geben dann die Ergebnisse zurück. Bevor wir uns überhaupt Gedanken über den Aufbau eines verteilten Systems machen können, müssen wir uns zunächst überlegen, wie wir die Anwendungs-Container-Images bauen, die diese Programme enthalten und aus denen unser verteiltes System bestehen wird.
Anwendungsprogramme setzen sich meist aus einer Sprach-Laufzeitumgebung (Runtime), gemeinsam genutzten Bibliotheken und Ihrem Quellcode zusammen. In vielen Fällen greift Ihre Anwendung auf externe Bibliotheken wie libc oder libssl zurück. Diese externen Bibliotheken werden meist als gemeinsam genutzte Komponenten mit dem Betriebssystem ausgeliefert, das Sie auf einer bestimmten Maschine installiert haben.
Es führt zu Problemen, wenn eine Anwendung auf dem Laptop eines Programmierers entwickelt wurde und von einer gemeinsam genutzten Bibliothek abhängt, die beim Rollout auf dem Produktiv-OS nicht vorhanden ist. Selbst wenn Entwicklungs- und Produktiv-Umgebungen die genau gleiche Version des Betriebssystems nutzen, können Probleme entstehen, wenn Entwickler vergessen, Asset-Dateien mit in ein Paket aufzunehmen, das sie in die Produktiv-Umgebung deployen.
Für das klassische Ausführen mehrerer Anwendungen auf einer einzelnen Maschine ist es unerlässlich, dass all diese Programme die gleichen Versionen der gemeinsam genutzten Bibliotheken verwenden. Werden die verschiedenen Anwendungen von unterschiedlichen Teams oder Organisationen entwickelt, führen diese gemeinsamen Abhängigkeiten zu zusätzlicher, unnötiger Komplexität und Abhängigkeiten zwischen den Teams.
Ein Programm kann nur dann erfolgreich ausgeführt werden, wenn es zuverlässig auf die Maschine deployt wurde, auf der es laufen soll. Allzu häufig gehört zum Stand der Technik beim Deployen der Einsatz von imperativen Skripten, was ganz unvermeidlich zu seltsamen und unverständlichen Fehlerfällen führt. Das macht das Ausrollen einer neuen Version eines verteilten Systems (oder von Teilen davon) zu einer arbeitsaufwendigen und schwierigen Aufgabe.
In Kapitel 1 haben wir uns für den Wert immutabler Images und Infrastruktur eingesetzt. Es zeigt sich, dass genau diese Immutabilität den Wert der Container-Images ausmacht. Wie Sie sehen werden, lassen sich damit ganz einfach alle Probleme des eben beschriebenen Abhängigkeits-Managements und der Kapselung lösen.
Bei der Arbeit mit Anwendungen ist es häufig hilfreich, sie so zu einem Paket zusammenzufassen, dass sie sich leicht mit anderen einsetzen lassen. Docker, die Standard-Container-Runtime-Engine, macht es leicht, ein Executable zu verpacken und sie in eine Remote-Registry zu schieben, aus der sie später von anderen geholt werden kann. Aktuell stehen Container-Registries in allen großen öffentlichen Clouds zur Verfügung und die Services zum Bauen von Images in der Cloud gibt es dort auch sehr oft. Sie können zudem Ihre eigene Registry als Open Source oder kommerzielles System betreiben. Diese Registries erleichtern es den Anwendern, private Images zu managen und zu deployen, während die Image-Builder Services eine leichte Integration mit Continuous Delivery Systems ermöglichen.
In diesem Kapitel werden wir mit einer einfachen Beispiel-Anwendung arbeiten, die wir für dieses Buch gebaut haben, um diesen Ablauf zu demonstrieren. Sie finden sie auf GitHub unter https://github.com/kubernetes-up-and-running/kuard.
Container-Images bündeln ein Programm und seine Abhängigkeiten unter einem Root-Dateisystem zu einem einzelnen Artefakt. Das verbreitetste Image-Format ist das Docker-Image-Format, das von der Open Container Initiative im OCI-Image-Format standardisiert wurde. Kubernetes unterstützt sowohl Docker- wie auch OCI-kompatible Images via Docker und anderen Runtimes. Docker-Images enthalten zusätzliche Metadaten, die von einer Container-Runtime genutzt werden, um abhängig vom Inhalt des Container-Images eine Anwendungs-Instanz zu starten.
In diesem Kapitel werden die folgenden Themen behandelt:
Wie eine Anwendung mithilfe des Docker-Image-Formats verpackt wird.
Wie eine Anwendung mit der Docker-Container-Runtime gestartet wird.