Einführung in Kubernetes Deployments
Kubernetes hat sich als eine der führenden Plattformen für die Automatisierung etabliert, wenn es um das Ausrollen, Skalieren und Betreiben von Containeranwendungen innerhalb eines Clusters von Hosts oder Knoten geht. Dieser Artikel konzentriert sich auf ein Kernkonzept von Kubernetes: das Deployment. Wir werden dessen Funktionsweise ergründen und zeigen, wie Deployments erstellt, aktualisiert und entfernt werden.
Was genau ist ein Kubernetes Deployment?
Ein Deployment ist ein Objekt in Kubernetes, das dazu dient, Pods zu starten. Es wird empfohlen, Deployments für zustandslose Applikationen zu verwenden. Ohne Deployments wäre die manuelle Erstellung, Aktualisierung und das Löschen von Pods eine umständliche und kaum praktikable Aufgabe, besonders bei einer großen Anzahl von Pods.
Ein Deployment wird als einzelnes Objekt in YAML deklariert und sorgt nicht nur für die Erstellung von Pods, sondern stellt auch sicher, dass diese stets auf dem aktuellen Stand sind und ordnungsgemäß laufen. Mit einem Deployment in Kubernetes können Sie Ihre Anwendungen auch problemlos automatisch skalieren. Es ermöglicht Ihnen somit, Versionen Ihrer Anwendungen in Pods zu skalieren, auszurollen und bei Bedarf zurückzusetzen.
Ein Deployment teilt Kubernetes zudem mit, wie viele Instanzen eines Pods gewünscht sind, und Kubernetes übernimmt die restliche Arbeit. Bei der Erstellung eines Deployments erzeugt der zugehörige Controller aus Ihrer Konfiguration ein ReplicaSet. Der dem ReplicaSet zugeordnete Controller erstellt dann basierend auf der ReplicaSet-Konfiguration die entsprechenden Pods.
Die Vorzüge eines Deployments gegenüber der direkten Erstellung eines ReplicaSets sind:
- Versionshistorie: Jede Veränderung am Deployment (durch „Anwenden“ oder „Bearbeiten“) generiert eine Sicherung der vorherigen Version.
- Rollout- und Rollback-Management: Dank der Versionshistorie können Sie problemlos zu früheren Konfigurationen zurückkehren.
Deployment erstellen
Es gibt zwei Ansätze, um ein Kubernetes Deployment zu erstellen:
Der imperative Ansatz
Die Kubernetes APIs ermöglichen einen direkten, zwingenden Ansatz, der ohne YAML-Konfigurationsdateien oder Manifeste auskommt. Hier geben Sie direkt an, was Sie erreichen wollen, und Kubernetes übernimmt die Definition der notwendigen Schritte, um das gewünschte Ergebnis zu erzielen.
Um die imperative Methode zu nutzen, verwenden Sie den folgenden Befehl:
kubectl create deployment nginx-deployment --image nginx --port=80
Der deklarative Ansatz
Bei dieser Methode deklarieren Sie alles detailliert. Kubernetes liest Ihre Definitionen und setzt sie genau so um, wie Sie es festgelegt haben.
Für den deklarativen Ansatz müssen Sie eine YAML-Datei erstellen.
Beispiel einer YAML-Datei für ein Deployment mit dem Namen `new_deployment.yaml`:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
# Anzahl der Pod-Kopien
replicas: 3
# Auswahl der Pods, die vom Deployment verwaltet werden
selector:
# Entsprechende Labels
matchLabels:
deploy: example
template:
metadata:
# Labels für den Pod
labels:
deploy: example
spec:
containers:
- name: nginx
image: nginx:1.20.2
In dieser YAML-Datei definieren Sie nach der Kubernetes API-Version, dem Objekttyp und dem Namen des Deployments den `spec`-Abschnitt. Hier legen Sie zunächst den `replicas`-Schlüssel fest, der die Anzahl der Pod-Instanzen angibt, die vom Deployment aktiv gehalten werden sollen.
Nutzen Sie eine Selektor-Bezeichnung, um die Pods innerhalb des Deployments zu identifizieren. Dazu können Sie das `deploy`-Label verwenden, welches angibt, dass alle Pods mit diesen Labels zum Deployment gehören.
Danach folgt das `template`-Objekt, das als Vorlage für die Pods im Deployment dient. Wenn das Deployment Pods erzeugt, verwendet es diese Vorlage. Die Spezifikation eines gewöhnlichen Pods befindet sich unter dem `template`-Schlüssel.
In diesem Beispiel werden Nginx-Images mit Labels auf Pods bereitgestellt. Es ist wichtig zu bedenken, dass der Pod die kleinste Einheit zur Skalierung in Kubernetes ist. Sie sollten sich daher gut überlegen, welches Muster Sie anwenden möchten, wenn Sie mehrere Container in denselben Pod setzen.
Wenden Sie die YAML-Datei `new_deployment.yaml` mit folgendem Befehl an:
kubectl apply -f new_deployment.yaml
Nach kurzer Zeit können Sie den Status des Deployments mit diesem Befehl abrufen:
kubectl get all
Deployment abfragen und aktualisieren
Sie werden feststellen, dass sowohl die Pods als auch das Deployment und ein ReplicaSet erstellt wurden. Ein Deployment erzeugt und verwaltet also immer ein ReplicaSet. Um eine detaillierte Beschreibung des Deployments zu erhalten, verwenden Sie folgenden Befehl:
kubectl describe deployment nginx-deployment
Sie erhalten nun eine detaillierte Beschreibung des Deployments. Besonders hervorzuheben ist die `RollingUpdate`-Strategie, die verwendet wird, um die Pods bei einem Update zu aktualisieren. Dies ist die Standardstrategie in Kubernetes.
Die `RollingUpdate`-Strategie ermöglicht eine nahtlose Migration von einer Anwendungsversion zu einer neueren. Zusätzlich gibt es noch folgende Strategien:
- Recreate: Beendet die aktuellen Pod-Instanzen und erstellt sie mit der neuen Version neu.
- Blau/Grün: Erstellt zwei separate, identische Umgebungen. Die blaue Umgebung ist die aktuelle Version, während die grüne Umgebung die zukünftige Version der Anwendung beinhaltet.
- Canary: Hier wird eine Teilmenge der Benutzer an der inkrementellen Einführung einer neuen Anwendung oder eines Services beteiligt.
Wenn Sie sich für `RollingUpdate` entscheiden, können Sie das Verhalten mithilfe der Anzahl der gewünschten Replikate konfigurieren:
- `maxSurge` erlaubt die Definition (in Prozent oder absolut), wie viele Pods zusätzlich zur aktuellen Anzahl der Replikate erstellt werden können.
- `maxUnavailable` legt (in Prozent oder absolut) fest, wie viele Pods während eines Updates nicht verfügbar sein dürfen, abhängig von der Anzahl der konfigurierten Replikate.
Abhängig von Ihrer Anwendung und Ihrem Autoscaler können Sie mit diesen Einstellungen Ihre Servicequalität (QoS) sicherstellen oder Ihre Deployments beschleunigen.
Im nächsten Schritt werden die Pods auf 10 skaliert und das Nginx-Image-Tag auf das neueste geändert:
kubectl scale deployment nginx-deployment --replicas=10
Sie werden feststellen, dass 5 Container erstellt und 5 von 10 Pods verfügbar sind.
Nach einigen Sekunden verwenden Sie folgenden Befehl:
kubectl get all
Nun sehen Sie, dass alle Pods erstellt wurden und die Container laufen.
Deployment löschen
Um ein Kubernetes Deployment zu löschen, können Sie folgende Befehle verwenden:
kubectl delete deploy nginx-deployment
kubectl delete -f new_deployment.yaml
Helm: Vereinfachung von Deployments
Wenn Sie eine komplexe Anwendung bereitstellen möchten, die Dutzende oder Hunderte von Kubernetes-Ressourcen verwendet, wird das Tool `kubectl` schnell unhandlich. Hier kommt das Tool `Helm` ins Spiel. Helm ist ein Paketmanager für Kubernetes, der auf `kubectl` aufbaut und die Anwendungsbereitstellung vereinfacht.
Im Helm-Kontext wird eine Anwendung als Release bezeichnet. Sie ist mit einem Chart verbunden, einer Sammlung von Konfigurationsdateien im YAML-Format, die globale Variablen und Vorlagen enthalten, um Kubernetes-Ressourcen zu beschreiben.
Fazit
Das Deployment ist ein wichtiges Kubernetes-Objekt. Angesichts der damit verbundenen Möglichkeiten ist Vorsicht bei der Konfiguration geboten, um unerwartetes Verhalten zu vermeiden. Weitere Informationen zu den Deployment-Einstellungen finden Sie in der Kubernetes-Dokumentation.
Es lohnt sich auch, einige der besten Kubernetes-Tutorials zu erkunden, um von Grund auf zu lernen und ein Experte zu werden. Weitere Kubernetes Tutorials