Containerorchestrierung mit Kubernetes - Teil 1
11.06.2019
Containerisierung erfordert ab einer gewissen Größenordnung auch Automatisierung im Betrieb - Unterstützung bietet die Container-Orchestrierung. Kubernetes ist der de facto Standard in diesem Bereich, sehr leistungsfähig und reif für den produktiven Einsatz - bringt aber auch eigene Komplexität sowie eine steile Lernkurve mit sich und erfordert Veränderungen in Anwendungsarchitektur und Betrieb.
Herausforderungen der Containerisierung
Im Rahmen der Containerisierung im Zuge der digitalen Transformation werden bestehende Anwendungen modularisiert in Container verpackt und neue Anwendungen agil als cloud-native-Apps oder in Form entkoppelter Microservices erstellt. Das vereinfacht die Arbeit für Betriebsteams, da die Container unabhängig von ihrem Inhalt mit einer standardisierten Schnittstelle verarbeitet werden können. Nur stellt sich unweigerlich die Frage, wie man die wachsende Menge an Containern von der Entwicklung über die Teststages bis Produktion unter Berücksichtigung ihrer Abhängigkeiten zu Netzwerk, Storage, usw. nachvollziehbar und mit vertretbarem Aufwand betreiben soll.
Mit Docker und einem Automatisierungstool wie Ansible alleine stößt man hier schnell an Grenzen, vor allem wenn viele Container auf verschiedene Hosts verteilt sind, Kommunikationsbeziehungen zwischen den Containern hergestellt werden müssen und es um das Management im Betrieb, dynamische Skalierung und unterbrechungsfreie Rollouts geht.
Container-Orchestrierung
Mit Docker wird der Lebenszyklus einzelner Container verwaltet. Orchestrierungswerkzeuge ermöglichen das Management komplexer Multi-Container-Workloads, die verteilt in einem Cluster aus vielen Maschinen betrieben werden.
Container-Orchestratoren sind so etwas wie das "Betriebssystem" eines Rechenzentrums, das für die Abstraktion der einzelnen Server und die einheitliche Bereitstellung von CPU-Rechenkapazität, RAM-Speicher, Plattenspeicher und Netzwerk sorgt. Neben den umfassenden Lösungen wie Kubernetes und Apache Mesosphere DC/OS gibt es weitere Werkzeuge mit unterschiedlichem Funktionsumfang, wie z.B. HashiCorp Nomad und Docker Swarm.
Die Begriffe Orchestrierung und Scheduling werden oft als Synonyme verwendet. Genau genommen bedeutet Orchestrierung in diesem Zusammenhang Koordination verschiedener Aktivitäten im Dienste eines gemeinsames Ziels. Scheduling bezeichnet die planmäßige Zuweisung von Workloads an die verfügbaren Maschinen, die passende Rahmenbedingungen aufweisen. Mit Scheduling ist in diesem Kontext also nicht die Terminplanung im Sinne von z.B. Cron-Jobs gemeint, die zu voreingestellten Zeiten ausgeführt werden. Eine dritte wichtige Aktivität ist die Clusterverwaltung: das Verbinden mehrerer physischer oder virtueller Server zu einem einheitlichen, zuverlässigen und fehlertoleranten Cluster, der nach außen hin als eine Einheit erscheint und die Verwaltung der verfügbaren Ressourcen (Compute, Storage, Network,...).
Cluster
Durch die Abstraktion der Host-Infrastruktur ermöglichen die Orchestrierungswerkzeuge, sich von dem individuellen Management und Rollouts auf einzelne Hosts zu verabschieden und den gesamten Cluster als ein einheitliches Deployment-Ziel zu betrachten.
Eine Konsequenz davon ist, dass sich der Betrieb damit grundsätzlich wandelt, Stichwort "Cattle vs. Pets": von der liebevollen, individuellen Pflege und der Maximierung der Verfügbarkeit einzelner namentlich bekannter Server (Pets, "Haustiere") zur Verwaltung einer Menge an gleichartigen, automatisiert bereitgestellten und einfach zu ersetzender Nodes (Cattle, "Rinderherde").
Diese Denkweise schlägt sich auch in der Anwendungsentwicklung nieder: statt zu versuchen, einzelne Service-Instanzen auf möglichst leistungsfähigen Maschinen immer verfügbar zu halten liegt der Fokus nun darauf, Hochverfügbarkeit und Skalierung durch viele verteilte, idealerweise zustandslose, Service-Instanzen auf abstrakten Compute-Ressourcen zu erreichen.
Bei Bedarf wird horizontal skaliert ("scale out") indem einfach weitere Instanzen des Service gestartet werden, ggf. indem weitere Nodes in den Cluster aufgenommen werden um die erhöhten Compute-Anforderungen bedienen zu können.
Lesen Sie mehr zum Thema "Containerorchestrierung mit Kubernetes" in unserem zweiten Teil.