Kubernetes - eine Einführung

Einführung

Kubernetes ist ein open-source System zum automatisierten deployen, skalieren und managen (also orchestrieren) von containerisierten Anwendungen. Kubernetes stellt eine Reihe von verschiedenen API-Objekten zur Verfügung, um den gewünschten Zustand des Clusters zu realisieren, den man umsetzen möchte. Diese API-Objekte beschreiben z.B. welche Anwendungen oder andere Workloads ausgeführt, welche Container-Images verwendet, welche Netzwerk- und Festplattenresourcen zur Verfügung gestellt werden sollen und wie viele Repliken es geben soll und vieles mehr. Um einen bestimmten Zustand des Clusters zu realisieren, werden diese API-Objekte einfach über das CLI-Tool kubectl oder direkt über das API erstellt.

kubectl

Kubectl ist ein CLI (Command line interface), welches direkt auf die Rest-API von Kubernetes geht. Es gibt folgende API-Objekte:
  • Pod
  • Service
  • Volume
  • Namespace
  • ReplicaSet
  • Deployment
  • StatefulSet
  • DaemonSet
  • Job
  • CronJob
  • Ingress
  • Secret usw.
Die vollständige Liste bekommt man mit kubectl api-resources. Zum Erhalten dieses Cluster-Zustands stellt Kubernetes eine Sammlung von Prozessen (Komponenten) zur Verfügung, die Kubernetes Kontroll Ebene (Kubernetes Control Plane). Diese Prozesse sorgen automatisch dafür, dass Container gestartet oder neugestartet werden, dass Repliken einer bestimmten Anwendung immer dem gewünschten Zustand haben, dass Anwendungen skaliert werden können und vieles mehr. Sie werden in 2 Kategorien unterteilt, in die Master Komponenten und in die Node Komponenten, zusätzlich gibt es noch Addons. Die Master Komponenten können auf jedem Node im Cluster laufen, üblicherweise werden alle Master Komponenten auf einem Node ausgeführt – welches dann der Master Node ist, die anderen sind die Worker Nodes, auf denen die Anwendungen oder andere Workloads laufen. Es gibt folgende Komponenten:

Master Komponenten

kube-apiserver

Der Kubernetes API-Server validiert und konfiguriert Daten für die API-Objekte, die Pods, Dienste, Replikationscontroller und so weiter. Der API-Server stellt das Kubernetes REST-API zur Verfügung und dient allen anderen Komponenten als Frontend, um den aktuellen Zustand des Clusters zu lesen und zu schreiben. Zu beachten ist, dass der API-Server nur ein Gateway ist und die Cluster-Daten in dem Key-Value-Store etcd persistiert werden. Es kann auch ein anderer Key-Value-Store verwendet werden, standardmäßig ist es aber etcd. Die Lese- und Schreibvorgänge für den Cluster-Status sind API-Requests, die über den API-Server laufen.

etcd

Der etcd, ist ein konsistenter und hochverfügbarer Key-Value-Store in dem alle Cluster Daten gespeichert werden. Zu beachten ist, dass es ein Backup Konzept für die Daten gibt.

kube-scheduler

Der Kubernetes kube-scheduler entscheidet für Pods, denen noch kein spezifischer Node zugewiesen wurde, nach bestimmten Kriterien, auf welchem Node diese ausgeführt werden sollen. Um diese Entscheidung treffen zu können, werden unter anderem folgende Kriterien zu Hilfe genommen:
  • individuelle und kollektive Ressourcenanforderungen
  • Anforderungen an die Servicequalität
  • Hardware/Software/Policy-Beschränkungen
  • Datenlokalität
  • bevorzugte oder verbotene Zugehörigkeiten
  • Termine
  • u.s.w.

kube-controller-manager (KCM)

Der Kubernetes kube-controller-manager stellt vier Controller zur Verfügung. Diese Controller überwachen regelmäßig den aktuellen Status des Clusters und sorgen dafür, dass der gewünschte Status (konfigurierte Status) immer erhalten bleibt. Die Informationen über den aktuellen/gewünschten Status erhalten die Controller über den API-Server. Um die Komplexität zu verringern, sind alle 4 Controller in einem Binary enthalten und als ein daemon-Prozess gestartet. In diesem Binary sind sie aber logisch voneinander getrennt. Folgende Controller werden derzeit implementiert:
  • replication controller
  • endpoints controller
  • namespace controller
  • serviceaccounts controller

cloud-controller-manager (CCM)

Der Kubernetes cloud-controller-manager ist im KCM enthalten und abstrahiert die Cloud-Provider Funktionalitäten aller Controller, so dass providerspezifische Implementierungen in den Kubernetes Core integriert werden können. Dies wird durch eine Plugin Funktionialität realisiert und kann beim Starten des kube-controller-managers durch ein Flag bzw. eine Konfiguration eingestellt werden. (--cloud-provider external oder --cloud-provider openstack) Folgende cloud controller werden derzeit implementiert:
  • Node controller
  • Route controller
  • Service controller
  • PersistentVolumeLabels controller

Node Komponenten

kubelet

Das Kubelet ist der primäre Node-Agent, der auf jedem Node im Kubernetes Cluster läuft. Der Agent stellt sicher, dass die Container in jedem Pod laufen und gesund sind. Die PodSpec (YML oder JSON Datei) definiert die genauen Eigenschaften des Containers. Wichtig: Der Kubelet verwaltet keine Container, die nicht mit Kubernetes gestartet worden sind! Es gibt vier Möglichkeiten, um ein Container Manifest dem Kubelet zur Verfügung zu stellen:
  • API Server
  • Datei Als Parameter wird ein Pfad/Datei angegeben. Dateien, die im Pfad liegen, werden per default alle 20 sec. nach Änderungen überwacht. Die Zeit ist per Flag konfigurierbar.
  • HTTP-Endpunkt Als Parameter wird ein HTTP-Endpunkt angegeben. Dieser Endpunkt wird per default all 20 sec. nach Änderungen überwacht. Die Zeit ist per Flag konfigurierbar.
  • HTTP-Server Das Kubelet auch ein einfaches REST-API, um ihm ein neues Manifest zu schicken.

kube-proxy

Der Kubernetes kube-proxy ist ein Netzwerk Proxy, der auf jedem Node im Kubernetes Cluster läuft. Dieser Proxy kann einfache TCP- und UDP-Streamweiterleitung oder Round-Robin-TCP- und UDP-Weiterleitung über eine Reihe von Backends durchführen. Der Benutzer muss einen Service mit Hilfe des API-Servers anlegen, um den Proxy zu konfigurieren.

container runtime

Die container runtime ist die Software, um Container auszuführen. Derzeit werden folgende container runtimes unterstützt: Docker, rkt (“rocket”), runc und alle OCI (Open Container Initiative) runtime-spec Implementierungen.

Addons

Addons sind pods und services, die Cluster Features zur Verfügung stellen. zum Beispiel
  • container resource monitoring
  • SDN
  • Ingress Controller
  • DNS
  • Web UI
  • cluster-level logging
  Von Sandra Gerberding, Senior DevOps Engineer bei Cloudibility UG