Ein Deployment erstellen

KubernetesBeginner
Jetzt üben

Einführung

Ein Pod führt Container aus, ist jedoch für sich genommen nicht die übliche Methode, um eine Anwendung in Kubernetes zu betreiben. Ein Deployment beschreibt den gewünschten Zustand (Desired State) einer Anwendung und erstellt ein ReplicaSet, welches wiederum die Pods erzeugt und verwaltet.

In diesem Lab erstellen Sie Ihr erstes Deployment, warten auf dessen Verfügbarkeit, untersuchen das Deployment, das ReplicaSet sowie die erstellten Pods und beobachten anschließend, wie das Deployment die Pods nach einer Löschung wiederherstellt. Dies bildet die Grundlage für spätere CKAD-Themen wie Skalierung, Rolling Updates, Rollbacks und die Bereitstellung von Anwendungen.

Einen Namespace für das Deployment vorbereiten

In diesem Schritt bereiten Sie einen sauberen Namespace für die Deployment-Übungen vor und legen diesen als Standard-Namespace für Ihre Befehle fest.

Beginnen Sie im Verzeichnis /home/labex/project. Sie müssen in diesem Lab kein Manifest schreiben, aber die Verwendung desselben Arbeitsbereichs sorgt für Konsistenz im Kurs.

mkdir -p /home/labex/project
cd /home/labex/project

Überprüfen Sie, ob der Kubernetes API-Server erreichbar ist. Falls die VM gerade erst gestartet wurde und dieser Befehl fehlschlägt, warten Sie einige Sekunden und führen Sie ihn erneut aus, bis der Node den Status Ready aufweist.

kubectl get nodes --request-timeout=5s

Die erwartete Ausgabe enthält:

NAME         STATUS   ROLES           AGE   VERSION
labex-v135   Ready    control-plane   ...   v1.35...

Pods benötigen das Cluster-Netzwerk-Plugin, bevor sie den Status Ready erreichen können. Warten Sie auf den Calico-Node-Pod, bevor Sie Anwendungs-Workloads erstellen.

kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s

Erwartete Ausgabe:

pod/calico-node-... condition met

Erstellen Sie einen Namespace namens ckad-prep-deployments:

kubectl create namespace ckad-prep-deployments

Der Befehl sollte die Erstellung bestätigen:

namespace/ckad-prep-deployments created

Legen Sie diesen Namespace als aktuellen Kontext-Namespace fest:

kubectl config set-context --current --namespace=ckad-prep-deployments

Überprüfen Sie den aktuellen Namespace:

kubectl config view --minify --output 'jsonpath={..namespace}'; echo

Erwartete Ausgabe:

ckad-prep-deployments

Das Deployment erstellen

In diesem Schritt erstellen Sie ein Deployment namens web-demo mit zwei Replikaten.

Der Befehl kubectl create deployment weist Kubernetes an, ein Deployment-Objekt zu erstellen. Die Option --image legt das Container-Image in der Pod-Vorlage fest, und --replicas=2 weist das Deployment an, zwei übereinstimmende Pods aktiv zu halten.

kubectl create deployment web-demo --image=registry.k8s.io/pause:3.10.1 --replicas=2

Erwartete Ausgabe:

deployment.apps/web-demo created

Warten Sie, bis der Rollout des Deployments abgeschlossen ist. Bei einem neuen Deployment bedeutet der Rollout-Status, dass Kubernetes das ReplicaSet erstellt hat und die angeforderten Pods verfügbar geworden sind.

kubectl rollout status deployment/web-demo --timeout=90s

Die Ausgabe kann kurze Wartehinweise enthalten, während die Pods verfügbar werden. Sie sollte mit folgendem Text enden:

deployment "web-demo" successfully rolled out

Überprüfen Sie nun die Zusammenfassung des Deployments:

kubectl get deployment web-demo

Die erwartete Ausgabe enthält:

NAME       READY   UP-TO-DATE   AVAILABLE   AGE
web-demo   2/2     2            2           ...

ReplicaSet und Pods untersuchen

In diesem Schritt untersuchen Sie die Objekte, die unterhalb des Deployments erstellt wurden.

Ein Deployment führt Container nicht direkt aus. Es erstellt ein ReplicaSet, und das ReplicaSet erstellt die Pods. Der Selektor des Deployments und die Labels der Pod-Vorlage verbinden diese Objekte miteinander.

Untersuchen Sie zunächst das Selektor-Label und das Vorlagen-Label des Deployments. JSONPath gibt nur die ausgewählten Felder aus, was die Ausgabe übersichtlich hält.

kubectl get deployment web-demo -o 'jsonpath={.spec.selector.matchLabels.app}{" "}{.spec.template.metadata.labels.app}{"\n"}'

Erwartete Ausgabe:

web-demo web-demo

Der erste Wert ist das Selektor-Label des Deployments. Der zweite Wert ist das Label, das auf den Pods aus der Vorlage platziert wurde. Da sie übereinstimmen, kann das Deployment diese Pods verwalten.

Listen Sie das vom Deployment erstellte ReplicaSet auf:

kubectl get replicasets -l app=web-demo

Die erwartete Ausgabe enthält:

NAME                  DESIRED   CURRENT   READY   AGE
web-demo-...          2         2         2       ...

Listen Sie nun die Pods auf, die durch dasselbe Label ausgewählt werden:

kubectl get pods -l app=web-demo --show-labels

Die erwartete Ausgabe enthält zwei laufende Pods:

NAME                        READY   STATUS    RESTARTS   AGE   LABELS
web-demo-...                1/1     Running   0          ...   app=web-demo,pod-template-hash=...
web-demo-...                1/1     Running   0          ...   app=web-demo,pod-template-hash=...

Zeigen Sie abschließend den Besitzer-Typ (Owner Kind) für jeden Pod an. Jeder Pod gehört zu einem ReplicaSet, nicht direkt zum Deployment.

kubectl get pods -l app=web-demo -o 'custom-columns=NAME:.metadata.name,OWNER:.metadata.ownerReferences[0].kind,PHASE:.status.phase'

Erwartete Ausgabe:

NAME                        OWNER        PHASE
web-demo-...                ReplicaSet   Running
web-demo-...                ReplicaSet   Running

Wiederherstellung des gewünschten Zustands beobachten

In diesem Schritt löschen Sie die aktuellen Pods und beobachten, wie das Deployment den gewünschten Zustand wiederherstellt.

Dies ist der entscheidende Unterschied zwischen einem einzelnen Pod und einem Deployment. Wenn Sie eigenständige Pods löschen, sind sie weg. Wenn Sie Pods löschen, die von einem Deployment verwaltet werden, bemerkt das Deployment, dass der tatsächliche Zustand nicht mehr mit dem gewünschten Zustand übereinstimmt, und erstellt Ersatz-Pods.

Löschen Sie die Pods, die durch app=web-demo ausgewählt werden. Die Option --wait=false kehrt sofort nach dem Senden der Löschanforderung zurück, sodass Sie die Wiederherstellung beobachten können, ohne darauf zu warten, dass jeder alte Pod zuerst verschwindet.

kubectl delete pods -l app=web-demo --wait=false

Die erwartete Ausgabe enthält:

pod "web-demo-..." deleted from ckad-prep-deployments namespace
pod "web-demo-..." deleted from ckad-prep-deployments namespace

Warten Sie, bis das Deployment wieder verfügbar ist:

kubectl wait --for=condition=Available deployment/web-demo --timeout=90s

Erwartete Ausgabe:

deployment.apps/web-demo condition met

Listen Sie die Pods erneut auf:

kubectl get pods -l app=web-demo

Die erwartete Ausgabe enthält zwei laufende Pods. Die Namen können abweichen, da das ReplicaSet Ersatz-Pods erstellt hat.

NAME                        READY   STATUS    RESTARTS   AGE
web-demo-...                1/1     Running   0          ...
web-demo-...                1/1     Running   0          ...

Überprüfen Sie die Zusammenfassung des Deployments ein weiteres Mal:

kubectl get deployment web-demo

Die erwartete Ausgabe enthält:

NAME       READY   UP-TO-DATE   AVAILABLE   AGE
web-demo   2/2     2            2           ...

Zusammenfassung

Sie haben ein Deployment erstellt, auf dessen Rollout gewartet, dessen Selektor- und Pod-Vorlagen-Labels untersucht, das erstellte ReplicaSet sowie die Pods gefunden und die Wiederherstellung des gewünschten Zustands nach dem Löschen der Pods beobachtet. Diese Konzepte bereiten Sie auf die nächsten Deployment-Labs vor, in denen Sie Replikat-Anzahlen ändern, Anwendungen aktualisieren und das Rollout-Verhalten verwalten werden.