Softwareentwicklung

Kubernetes in der Cloud

: Die Zukunft skalierbarer Software liegt in der Cloud. Wie Softwareprojekte dort von Kubernetes profitieren können, beschreibt dieser kurze Durchstich durch die wichtigsten Funktionen der Plattform.

Die Cloud harmoniert hervorragend mit Container-Technologien. Insbesondere die Open-Source-Technologien Docker und Kubernetes erweisen sich als gutes Team bei Betrieb, automatisierter Auslieferung, Verwaltung und Skalierung von Software-Landschaften aller Art in der Cloud.

Kubernetes übernimmt dabei die Orchestrierung, während Docker als CRI (Container Runtime Interface) für den Betrieb der Applikation zuständig ist. Dabei bilden sie ein Team, das die Einfachheit einer Platform as a Service (PaaS) mit der Flexibilität einer Infrastructure as a Service (IaaS) kombiniert.

Die Architektur von Kubernetes kurz erklärt

Kubernetes ist griechisch und bedeutet Steuermann. Ziel der Plattform ist es, Container-Anwendungen automatisiert und effizient in der Cloud bereitzustellen, zu verwalten und weiterzuentwickeln. Und zwar ganz im Sinne von CD/CI im laufenden Betrieb, ohne Downtime, ohne Latenzen. Applikationen und Projekte profitieren von Kubernetes insofern, als es Aufwände, Wartezeiten und Bürokratie substanziell reduziert. Mit Kubernetes lassen sich


  • Ressourcen schnell, unbürokratisch und dynamisch auf- und abschalten,
  • die Datenlast gleichmäßig auf die verfügbaren Ressourcen verteilen,
  • Störungen im Betrieb schnell erkennen und ohne Downtime beheben.

Die im Folgenden kurz vorgestellten Komponenten eines Kubernetes-Clusters sind dabei essenzielle Features der Orchestrierungsplattform.

 

Kubernetes Control Plane

Das Kubernetes Control Plane ist das Cockpit des Kubernetes-Clusters. Als Leitstand erkennt es Cluster-Ereignisse und reagiert darauf. Dazu nutzt es die folgenden Komponenten, die prinzipiell auf jedem Rechner ausgeführt werden können:


  • API Server: Schnittstelle zur Interaktion mit dem Kubernetes-Cluster, alleinige Verbindung zum Etcd-Speicher

  • Etcd: Konsistenter und hochverfügbarer Key-Value-Speicher für alle Clusterdaten.

  • Kube Controller Manager: Vereint in sich alle vom Cluster benötigten Regelkreise (z.B. Replication Controller, Node Contoller etc.)

  • Scheduler: Übernimmt die Ressourcenplanung unter Berücksichtigung aller hardware- oder softwareseitigen Richtlinien, der Datenlokalität, Workload-Interferenzen und Deadlines.

 

Kubernetes Nodes

Die Kubernetes Nodes sind für die Durchführung der einzelnen Container Workloads zuständig. Je mehr Applikationen das Cluster beheimaten soll, desto mehr Kubernetes Nodes werden gebraucht. Ein Kubernetes Node enthält jeweils


  • Workloads: Je nach Anwendungszweck sind das Deployments, StatefullSets, DaemonSets oder Jobs. Sie ihrerseits enthalten Pods.

  • Pods: sind das natürliche Habitat der Container und regeln die Versorgung mit Ressourcen wie Speicherplatz, CPU oder RAM.

  • Services: regeln die Bündelung und Erreichbarkeit von Workload. Je nach Anforderung gibt es Services vom Typ Load Balancer, Cluster IP oder Node Port.

  • Kubelet: fragt den API Server des Control Plane nach Aufgaben und dient der generellen Verwaltung des Nodes.

  • Kube Proxy: steuert die Firewall-Regeln des Nodes und überwacht/managt damit kubernetes-seitig die Kommunikation der Workloads.

 

DevOps mit Kubernetes in der Cloud

Das Erstellen eines Workloads läuft grob skizziert so ab:

  • Am Anfang wird ein Docker Image gebaut, welches die Applikationssoftware enthält.
  • Das Docker Image wird in eine Container Registry geladen, die vom Cluster aus erreichbar ist.
  • Im Kubernetes Cluster wird ein Workload definiert, der die Docker Images anzieht.

All das ist mit ein paar wenigen Befehlen erledigt und legt den Grundstein für eine container-basierte, cloud-native Anwendung. Ob Azure, AWS oder GCP: Kubernetes funktioniert bei allen Cloudanbietern ähnlich gut. Unterschiede existieren einzig in den Möglichkeiten zur Administration, Automatisierung und den Bereitstellungszeiten der Cloud Hardware.

Vorteile für DevOps und Softwarebetreiber

Die Vorteile dieser Architektur sind für DevOps-Ingenieure und Softwarebetreiber im Wesentlichen die gleichen:


  • Synchronität: Ressourcen können synchron zur Datenlast schnell und automatisch angepasst werden.

  • Transparenz: Es besteht jederzeit volle Übersicht über die komplette Anwendung.

  • Skalierbarkeit: Die Weiterentwicklung der Software und das Aufschalten neuer Features erfolgt ohne Downtime gemäß CD/CI.

  • Flexibilität: Die Anwendung ist leicht an eine sich ändernde Daten- oder Marktsituation anpassbar.

  • Resilienz: Tritt auf einem Pod ein Fehler auf, springt automatisch ein anderer Pod ein – für maximale Resilienz des Systems

Vorteile für unsere Kunden

Das hier skizzierte Vorgehen stellt nur einen groben Durchstich dar. Vor einem Cloud-Go-live werden die geschilderten Prozesse von uns voll automatisiert. Dabei regeln wir die Beschaffenheit eines Kubernetes Clusters zumeist über „Infrasturcture as Code“, welcher ebenfalls per Pipeline ausgerollt wird.

Zusätzlich sichern wir die Pipeline, also die Auslieferung unserer Applikationssoftware, mit Codeanalysen sowie automatischen Last- und Sicherheitstests ab. Unsere Kunden können die jeweiligen Entwicklungsstände auf dezidierten Testumgebungen live mitverfolgen, wenn sie das wünschen. Die Testsysteme existieren nur zur Entwicklungszeit eines Features und verbrauchen auf diese Weise nie unnötig Ressourcen.

Kubernetes bietet ein so sichereres Fundament für den Software-Betrieb in der Cloud, dass auch nur ein einzelnes Cluster als Komplettsystem zum Einsatz kommen kann. Die Cloud ermöglicht es uns ferner, das Kubernetes Cluster ohne manuelle Interaktion dynamisch an den jeweiligen Ressourcenbedarf anzupassen.

So können wir mit signifikant geringeren Kosten ein System erstellen und betreiben, das alle Anforderungen einer zeitgemäßen Software erfüllt und auf künftige Anforderungen dynamisch reagieren kann.

Interesse geweckt? Hier ein etwas älterer Blogbeitrag zum Thema: Kubernetes. Plattform für Plattformen

Alexander Nikolai Gomes