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.


