Kubernetes ist eine der beliebtesten Automatisierungsplattformen für die Bereitstellung, Skalierung und den Betrieb von Anwendungscontainern auf einem Cluster von Hosts oder Knoten.
Dieser Artikel befasst sich mit einem der zentralen Objekte in Kubernetes: dem Deployment. Ziel ist es, sein Verhalten zu verstehen und zu erfahren, wie Sie es erstellen, aktualisieren und löschen können.
Was ist ein Deployment?
Ein Deployment ist eines der Objekte, die zum Starten von Pods verwendet werden. Die bewährten Praktiken von Kubernetes empfehlen die Verwendung von Deployments für zustandslose Anwendungen. Ohne ein Deployment müssten Sie mehrere Pods manuell erstellen, aktualisieren und löschen, was für viele Pods mühsam und nicht praktikabel wäre.
Ein Deployment deklariert ein einzelnes Objekt in YAML, das nicht nur die Pods erstellt, sondern auch sicherstellt, dass sie aktuell sind und laufen. Außerdem können Sie Ihre Anwendungen mit einem Deployment in Kubernetes problemlos automatisch skalieren. Ein Deployment dient also dazu, Versionen Ihrer Anwendungen in Pods zu skalieren, bereitzustellen und zurückzusetzen.
Mit einem Deployment teilen wir Kubernetes auch mit, wie viele Kopien eines Pods wir ausführen möchten, und Kubernetes kümmert sich um den Rest. Der zugehörige Controller erstellt beim Erstellen eines Deployments ein ReplicaSet aus Ihrer Konfiguration. Der Controller, der mit dem ReplicaSet verbunden ist, erstellt eine Reihe von Pods aus der ReplicaSet-Konfiguration.
Die Vorteile der Verwendung eines Deployments anstelle der direkten Erstellung eines ReplicaSets sind:
- Historisierung des Objekts: Bei jeder Änderung des Objekts (durch “Anwenden” oder “Bearbeiten”) wird ein Backup der vorherigen Version erstellt.
- Rollout- und Rollback-Verwaltung: Sie können zu einer Konfiguration in Verbindung mit dem vorherigen Punkt zurückgehen.
Erstellen einer Bereitstellung
Es gibt zwei Methoden, mit denen wir ein Kubernetes-Deployment erstellen können:
Imperative Methode
Die Kubernetes-APIs ermöglichen einen direkteren und zwingenderen Ansatz, ohne dass Konfigurationsdateien oder YAML-formatierte Manifeste erforderlich sind. Bei diesem Ansatz müssen wir nur sagen, was wir tun wollen, und Kubernetes übernimmt die Verantwortung für die Definition dessen, was getan werden muss, um das erwartete Ergebnis zu erzielen.
Um die imperative Methode zu verwenden, verwenden Sie einfach den folgenden Befehl:
kubectl create deployment nginx-deployment --image nginx --port=80
Deklarative Methode
Bei dieser Methode müssen Sie alles deklarieren. Wenn Sie diesen Code verwenden, liest Kubernetes einfach Ihre Definitionen und erstellt das Deployment genau so, wie es präsentiert oder deklariert wurde.
Um die deklarative Bereitstellung zu verwenden, müssen Sie eine YAML-Datei erstellen.
YAML-Datei für die Bereitstellung mit dem Namen new_deployment.yaml
:
apiVersion: apps/v1
art: Bereitstellung
metadaten:
name: nginx-bereitstellung
spec:
#Spezifiziert die Anzahl der Pod-Kopien
replikate: 3
#Wählt den Pod aus, der von der Bereitstellung verwaltet werden soll
selektor:
#Gleicht die definierten Labels ab
matchLabels:
einsatz: Beispiel
vorlage:
metadata:
#Spezifiziert die Etiketten auf dem Pod.
etiketten:
deploy: example
spec:
container:
- name: nginx
bild: nginx:1.20.2
In dieser YAML-Datei finden Sie nach der Definition der Kubernetes-API-Version, des Objekttyps, den Sie erstellen, und des Namens des Deployments den Abschnitt spec. In diesem Abschnitt definieren Sie zunächst den Schlüssel replicas, der die Anzahl der Pod-Instanzen angibt, die das Deployment aktiv halten muss.
Verwenden Sie eine Selektorbezeichnung, um die Pods in der Bereitstellung zu identifizieren. Dazu können Sie das Label deploy verwenden, das angibt, dass alle Pods, die mit diesen Labels übereinstimmen, in der Bereitstellung gruppiert sind.
Danach haben Sie das Vorlagenobjekt, in dem Sie ein Pod-Modell innerhalb Ihrer Bereitstellungsspezifikation haben. Wenn das Deployment Pods erstellt, werden diese anhand dieser Vorlage erstellt. Die Spezifikation eines regulären Pods finden Sie unter dem Schlüssel template.
Mit dieser Bereitstellung werden Nginx-Images mit Labels in Pods bereitgestellt. Außerdem müssen Sie in diesem Punkt vorsichtig sein. Der Pod ist die Skalierbarkeitseinheit in Kubernetes, so dass Sie sich überlegen müssen, welches Muster Sie verwenden möchten, wenn Sie mehrere Container in denselben Pod stellen.
Als nächstes wenden Sie die Yaml-Datei new_deployment.yaml
mit dem folgenden Befehl an:
kubectl apply -f new_deployment.yaml
Nach einigen Sekunden können Sie den Status der Bereitstellung mit folgendem Befehl abrufen:
kubectl get all
Deployment abrufen und aktualisieren
Beachten Sie, dass Sie die Pods erstellt haben, das Deployment und auch ein Replicaset. Ein Deployment erstellt und verwaltet also immer ein Replicaset. Nun können Sie das Deployment mit dem folgenden Befehl beschreiben:
kubectl describe deployment nginx-deployment
Jetzt haben Sie eine vollständige Beschreibung des Einsatzes. Sie zeigt die Strategie auf, mit der die Pods erstellt/neu aufgebaut werden, wenn eine Aktualisierung als RollingUpdate definiert wurde.
Die RollingUpdate-Strategie ermöglicht eine geordnete Migration von einer Version einer Anwendung auf eine neuere Version. Dies ist die Standardstrategie in Kubernetes.
Darüber hinaus gibt es noch die folgenden Strategien:
- Neu erstellen: Beendet die derzeit laufenden Pod-Instanzen und ‘erschafft’ sie mit der neuen Version neu;
- Blau/Grün: Mit dieser Strategie werden zwei separate, aber identische Umgebungen erstellt. In der blauen Umgebung läuft die Anwendung so, wie sie ist, während in der grünen Umgebung die Anwendung so läuft, wie sie in Zukunft sein wird;
- Kanarienvogel: Eine Bereitstellungsstrategie, bei der eine Untergruppe von Benutzern an der schrittweisen Freigabe einer Anwendung oder eines Dienstes beteiligt ist.
Wenn Sie sich für “Rolling-Update” entscheiden, können Sie das Verhalten bezüglich der Anzahl der gewünschten Replikate konfigurieren.
- mit
maxSurge
können Sie angeben (prozentual oder absolut), wie viele Pods zusätzlich zu den derzeit konfigurierten Replikaten erstellt werden können. - mit
maxUnavailable
können Sie angeben (in Prozent oder absolut), wie viele Pods während der Aktualisierung “nicht verfügbar” sein können, abhängig von der Anzahl der konfigurierten Replikate.
Abhängig von Ihrer Anwendung und Ihrem Autoscaler können Sie mit diesen Konfigurationen QoS gewährleisten oder Ihre Bereitstellungen beschleunigen.
Als nächstes müssen Sie die Pods auf 10 skalieren und das Nginx-Image-Tag auf die neueste Version ändern.
kubectl scale deployment nginx-deployment --replicas=10
Beachten Sie, dass 5 Container erstellt werden und von den 10 Pods 5 verfügbar sind.
Nach ein paar Sekunden verwenden Sie den folgenden Befehl:
kubectl get all
Hier können Sie sehen, dass alle Pods erstellt wurden und die Container laufen.
Löschen Ihres Deployments
Um ein Kubernetes-Deployment zu löschen, können Sie die folgenden Befehle verwenden:
kubectl delete deploy nginx-deployment
kubectl delete deployment new_deployment.yaml
Helm: Deployments vereinfachen
Wenn Sie eine komplexe Anwendung bereitstellen möchten, die Dutzende oder sogar Hunderte von Kubernetes-Ressourcen verwendet, ist das Tool kubectl ungeeignet. Deshalb wurde das Tool Helm entwickelt. Helm ist ein Paketmanager für Kubernetes, der auf kubectl aufbaut und die Bereitstellung von Anwendungen vereinfacht.
Im Vokabular von Helm wird eine Anwendung als Release bezeichnet. Sie ist mit einem Chart verbunden, d.h. einer Sammlung von Konfigurationsdateien im YAML-Format, die globale Variablen und Vorlagen zur Beschreibung von Kubernetes-Ressourcen enthalten.
Fazit
Das Deployment ist ein wesentliches Kubernetes-Objekt. Da eine große Macht auch eine große Verantwortung mit sich bringt, müssen Sie bei der Konfiguration vorsichtig sein, sonst riskieren Sie unerwartete Verhaltensweisen. Um die Konfiguration des Deployments zu vertiefen, können Sie die Kubernetes-Dokumentation konsultieren.
Sie können auch einige der besten Kubernetes-Tutorials lesen, um von Grund auf zu lernen und ein Experte zu werden.