# Kubernetes

Kubernetes (auch als K8s bezeichnet, deutsche Aussprache: [ˌkuːbɐˈneːtəs]) ist ein von Google entwickeltes Open-Source-System zur Verwaltung von Container-Anwendungen. In diesem Umfeld wird die Verwaltung der technischen Container-Infrastruktur auch als Orchestrierung bezeichnet. Es kann sowohl fremdgehostet von verschiedenen Anbietern für Cloud Computing gebucht, als auch selbst lokal auf eigener/fremder Hardware betrieben werden.

## Geschichte

Google hat bereits nach der Jahrtausendwende einen großen Fokus auf Container gesetzt, sodass nahezu alle eigenen Dienste darin betrieben wurden. Dies führte aufgrund der Größe zu verschiedenen Problemen, weswegen das Unternehmen „Borg“ entwickelte: Ein System zur Verwaltung von Clustern. Borg verwaltete hunderttausende Aufgaben von tausenden Anwendungen, die verteilt auf zehntausenden Servern liefen. Zu den Hauptaufgaben gehört das Planen, (Neu-)Starten und Überwachen der Google-Dienste mit Fokus auf Skalierung und Hochverfügbarkeit. Die Komplexität von Ressourcenverwaltung und Fehlerbehandlung sollten von den Entwicklern abstrahiert werden, damit diese sich auf die Anwendung konzentrieren können. Zwar gab es Alternativen, diese waren aus Sicht von Google jedoch nicht widerstandsfähig genug und es fehlten Funktionen.
Kubernetes (von altgriechisch κυβερνήτης kybernētēs „Steuermann“) wurde ursprünglich von Joe Beda, Brendan Burns und Craig McLuckie entwickelt. Kurze Zeit später stießen weitere Google-Entwickler wie Brian Grant und Tim Hockin hinzu. 2014 stellte Google Kubernetes als Open-Source-Projekt der Öffentlichkeit vor. Es handelt sich um eine Neuentwicklung von Borg, welches zu diesem Zeitpunkt bereits mehr als ein Jahrzehnt alt war. Man wollte die besten Ideen aus Borg in Kubernetes integrieren und darüber hinaus einige Probleme lösen, die in den Jahren zuvor mit Borg identifiziert wurden. Viele der von Google bereitgestellten Kubernetes-Entwickler waren zuvor an Borg beteiligt. Im Gegensatz zu Kubernetes war Borg ein internes System, welches nicht frei verfügbar war. Da sich Google bei Kubernetes für eine öffentliche Entwicklung als quelloffene Software entschieden hat, kann jeder den Nachfolger nutzen oder sogar daran mitarbeiten.
Version 1.0 wurde am 21. Juli 2015 veröffentlicht. Dabei wurde auch die Gründung der Cloud Native Computing Foundation unter dem Dach der Linux Foundation angekündigt und Kubernetes wurde von Google an diese gespendet.

## Architektur

Eine Kubernetes-Installation besteht aus dem Zusammenspiel mehrerer Hostrechner zu einem Cluster. Es gibt zwei Kategorien von hosts:

### Control Plane

    kümmert sich um Verwaltungsaufgaben im Cluster und führt keine Anwendungscontainer aus. Die Control Plane bietet eine API zur Konfiguration an, verwaltet alle spezifischen Konfigurationen in einer etcd-Instanz und wendet diese automatisch auf alle Anwendungen, sowie den Cluster selbst an. Es ist möglich, mehrere Instanzen der Control Plane gleichzeitig zu betreiben, um Hochverfügbarkeit zu erreichen.

### Worker Nodes

    dienen dazu, die eigentliche Arbeitslast der Anwendung abzuarbeiten. Die notwendige Anzahl und Leistung dieser „Worker Node Server“ ermittelt sich anhand der Ressourcenanforderung der Container. Je ressourcenintensiver die Container sind, desto mehr oder performantere Worker Nodes werden benötigt. Sie haben keine Verwaltungsaufgaben.
Kubernetes erzeugt ein Netzwerk, so dass die im Cluster verteilten Anwendungen untereinander kommunizieren können.

### Funktionen

Kubernetes bietet eine Reihe von Möglichkeiten die Orchestrierung von komplexen Container-basierten Anwendungen zu unterstützen.
* Kubernetes fasst einen oder mehrere Container zu einem pod zusammen. Pods laufen zusammen auf einem node und werden im Cluster Netzwerk mit einer IP-Adresse, im Subnetz des jeweiligen Workernodes, angesprochen. Laufende pods werden anhand definierter Faktoren überwacht und bei einem Ausfall neu gestartet.
* Mehrere dieser pods werden als service mit einem network proxy, meist iptables, mit einer vom Workernode unabhängigen IP-Adresse zusammengefasst. So ist jeder Dienst immer unter dieser einen IP-Adresse erreichbar, auch wenn die dazugehörigen pods auf einem anderen Workernode neu gestartet werden.
** Um eine Hochverfügbarkeit auch im Störungsfall aufrechtzuerhalten, können pods redundant auf mehreren Hosts betrieben werden. Dazu gibt es in Kubernetes Objekte, wie ReplicaSets und Deployments oder StatefulSets.
** So kann eine sinnvolle Lastverteilung der eingehenden Anfragelast auf die einzelnen pods erfolgen. Bei hohem Anfragevolumen können zusätzliche pods gestartet werden.
** services können entweder mit einem Nodeport direkt oder durch einen ingress per http bzw. https nach außen exponiert werden. Dazu muss ein Ingress Controller, z. B. ein Nginx installiert sein.
* configmaps und secrets können als Konfigurationsdateien und Passworte (z. B. für Datenbanken) in jeden Container in einem Pod gemounted werden.
* Des Weiteren ermöglicht es Kubernetes, persistente Datenspeicher an die pods zu mounten (z. B. Storage Area Network).

## Einsatz

Container sind eine natürliche Weiterentwicklung virtueller Maschinen zur effizienten Nutzung verfügbarer Hardware-Ressourcen. Da ein Container in vielen Fällen lediglich einen kleinen Teil einer größeren Anwendung enthält (Microservices), braucht es oftmals viele Container, um eine große Anwendung vollständig bereitzustellen.
Im Betrieb von Container-Anwendungen spielen Verwaltungsaufgaben wie die Bereitstellung, die Anfragelast-bezogene automatische Skalierung sowie das Monitoring der zum Betrieb notwendigen Anwendungscontainer und ihrer Infrastruktur eine wichtige Rolle. Kubernetes dient als Werkzeug zur Unterstützung dieser Orchestrierungsaufgaben.
Eingesetzt wird Kubernetes dabei bereits in kleinen und einfachen Containerumgebungen bis hin zu komplexen und verteilten Anwendungsfällen großer Technologieanbieter und ihrer containerbasierten Cloud-Produkte. Einige Beispiele sind hier: Microsofts Azure, IBM Cloud, Red Hat OpenShift, Amazons EKS, Googles Kubernetes Engine und Oracles OCI.