Pod Management
Ziel
In diesem Projekt geht es um die Erstellung von Pods. Sie werden:
- Erstellen von Kopien eines Pods
- Auf- und abwärts skalieren
- ReplicaSets mit Diensten verwenden
- Deployments erstellen und updaten
- Einen Service hinzufügen und die Konnektivität prüfen
Hilfsmittel
- Versuchen Sie, die unten stehenden Aufgaben mit Hilfe der Folien und des Cheatsheets eigenständig zu lösen.
- Sollten Sie dabei Probleme haben, finden Sie bei jeder Aufgabe einen ausklappbaren Block, in dem der Lösungsweg beschrieben wird.
- ReplicaSet wird auch in der offiziellen Kubernetesdokumentation erklärt
- Deployments wird auch in der offiziellen Kubernetesdokumentation erklärt
Aufgabe 1: Identische Pods erstellen
- Lesen Sie die offizielle Dokumentation über ReplicaSets
- Erstellen Sie eine Beschreibung namens
web
inreplicaset.yaml
unter Verwendung desnginx
-Images. - Setzen Sie es mit
kubectl apply
ein. - Fügen Sie ein Label
exercise: scale
zu den Metadaten aller Objekte hinzu, die am Ende bereinigt werden müssen.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Das YAML-File replicaset.yaml
sollte so oder so ähnlich aussehen:
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: webserver
labels:
exercise: scale
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx
ReplicaSets sind ein Wrapper für Pod-Beschreibungen
Beachten Sie, dass der Abschnitt template
identisch mit der Pod-Beschreibung aus der vorherigen Übung ist,
nur ohne die Felder apiVersion
und kind
.
- Verwenden Sie
kubectl
, wie Sie es zuvor gelernt haben, um die vom Replicaset erstellten Ressourcen, d.h. das Replicaset selbst und die Pods, anzuzeigen.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
-
ReplicaSets anzeigen
$ kubectl get replicasets NAME DESIRED CURRENT READY AGE webserver 2 2 2 8s
-
Pods anzeigen
Es laufen zwei Pods, deren Namen sich aus dem Namen des ReplicaSet mit einem zufälligen Suffix ergeben.$ kubectl get pods webserver-f82ng 1/1 Running 0 41s webserver-lsc9f 1/1 Running 0 41s
-
ReplicaSet untersuchen
$ kubectl describe replicaset webserver Name: webserver Namespace: testnamespace Selector: app=web Labels: exercise=scale Annotations: <none> Replicas: 2 current / 2 desired Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template: Labels: app=web Containers: nginx: Image: nginx Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 64s replicaset-controller Created pod: webserver-f82ng Normal SuccessfulCreate 64s replicaset-controller Created pod: webserver-lsc9f
Alle Ressourcen auf einmal anzeigen
Der folgende Befehl kann verwendet werden, um Pods und ReplicaSets auf einmal anzuzeigen:
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/webserver-f82ng 1/1 Running 0 88s
pod/webserver-lsc9f 1/1 Running 0 88s
NAME DESIRED CURRENT READY AGE
replicaset.apps/webserver 2 2 2 88s
Naming conventions
Beachten Sie, dass die Pods mit dem Namen des ReplicaSets und einem zufälligen Suffix benannt werden.
Aufgabe 2: Skalieren
- Ändern Sie die Anzahl der Replikas in
replicaset.yaml
auf 3 und deployen Sie es.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
...
spec:
replicas: 3
....
kubectl apply -f replicaset.yaml
- Die Anzahl der Pods kann auch mit
kubectl scale
geändert werden:Dadurch wird ein weiterer Pod hinzugefügt.kubectl scale --replicas=3 replicaset webserver
Änderungen live beobachten
Führen Sie watch kubectl get all
in einer separaten Konsole aus, um die Änderungen in Echtzeit zu beobachten.
Aufgabe 3: Recovery verlorener Pods
ReplicaSets behält die gewünschte Anzahl von Pods bei, auch wenn Pods entfernt werden oder kaputt gehen.
- Löschen Sie Pods mit
kubectl delete
und beobachten Sie die Wiederherstellung mitwatch kubectl get all
.
Verwenden Sie Labels, um einen Pod auszuwählen und zu entfernen
Der folgende Befehl kann verwendet werden, um die ersten beiden Pods mit Hilfe eines Labels zu entfernen:
kubectl get pod --selector app=web -o name | head -n 2 | xargs kubectl delete
Aufgabe 4: ReplicaSets mit Services nutzen
ReplicaSets sind nur für die Aufrechterhaltung der Skalierung verantwortlich, indem sie identische Pods auf der Grundlage der angegebenen Vorlage erstellen. Das Hinzufügen von DNS und der Lastausgleich erfolgen über Dienste, indem Pods anhand ihrer Labels ausgewählt werden.
- Erstellen und implementieren Sie einen Dienst namens "web" auf der Grundlage des Wissens aus dem vorherigen Kapitel. Wählen Sie die vom ReplicaSet erstellten Pods mit demselben Label aus, das im ReplicaSet verwendet wird.
Hinweis
Nutzen Sie das Label app=web
als Selektor im Service.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Die Beschreibung des Dienstes sollte in etwa so aussehen:
apiVersion: v1
kind: Service
metadata:
name: web
labels:
exercise: scale
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 80
- Überprüfen Sie, ob der Dienst korrekt funktioniert, indem Sie sich mit
kubectl run
undcurl
mit dem Dienst verbinden, wie im vorherigen Kapitel beschrieben.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Die folgenden Befehle können verwendet werden, um eine Verbindung zum Dienst herzustellen und die Antwort zu überprüfen. Wiederholen Sie die Ausführung des curl-Befehls, bis ein anderer Pod die Anfrage bedient
kubectl run -it --image=cmd.cat/bash/curl --rm --command -- bash
$ curl -s -v web 2>&1 |grep Connected
* Connected to web (10.42.134.184) port 80
$ curl -s -v web 2>&1 |grep Connected
* Connected to web (10.42.139.88) port 80
exit
Aufgabe 5: Deployment erstellen
- Erstellen Sie ein Deployment mit dem Namen
web
in der Dateideployment.yaml
, das 2 Pods mit dem Image nginx skaliert und setzen Sie es um. Fügen Sie ein Labelexercise: deployments
zu den Metadaten aller Objekte hinzu, welches zum Aufräumen am Ende erforderlich ist.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Das YAML file deployment.yaml
sollte so oder so ähnlich aussehen:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
labels:
exercise: deployments
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx
kubectl apply -f deployment.yaml
- Vergleichen Sie
deployment.yaml
undreplicaset.yaml
aus der vorherigen Übung.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
$ diff -u deployment.yaml replicaset.yaml
--- deployment.yaml 2024-02-21 09:03:08.903501225 +0100
+++ replicaset.yaml 2024-02-21 09:23:36.668181993 +0100
@@ -1,7 +1,7 @@
apiVersion: apps/v1
-kind: Deployment
+kind: ReplicaSet
metadata:
- name: web
+ name: webserver
spec:
replicas: 2
selector:
- Untersuchen Sie die erstellten Ressourcen mit
kubectl get all
sowiekubectl describe
für die verschiedenen Ressourcentypen.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Verwenden Sie den folgenden Befehl, um Deployments, ReplicaSets und Pods auf einmal anzuzeigen:
$ kubectl get all NAME READY STATUS RESTARTS AGE pod/web-76fd95c67-7cc4x 1/1 Running 0 4s pod/web-76fd95c67-vvh8v 1/1 Running 0 4s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/web 2/2 2 2 4s NAME DESIRED CURRENT READY AGE replicaset.apps/web-76fd95c67 2 2 2 4s
- Untersuchen Sie das Deployment
Sie können hier sehen, dass...
$ kubectl describe deployment web Name: web Namespace: testnamespace CreationTimestamp: Wed, 21 Feb 2024 09:32:23 +0100 Labels: exercise=deployments Annotations: deployment.kubernetes.io/revision: 1 Selector: app=web Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=web Containers: nginx: Image: nginx Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: web-76fd95c67 (2/2 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 3m4s deployment-controller Scaled up replica set web-76fd95c67 to 2
- das Deployment ein neues ReplicaSet
web-76fd95c67
erstellt hat, das 2 Pods hochskaliert - die Standardstrategie für die Aktualisierung von Pods
RollingUpdate
ist, was bedeutet, dass alte Pods eliminiert werden, sobald neue erstellt werden. Sie werden später mehr über Bereitstellungsstrategien erfahren.
Naming conventions
Beachten Sie, wie ReplicaSets mit dem Namen des ReplicaSets und einem zufälligen Suffix benannt werden. Beachten Sie, wie Pods mit dem Namen des ReplicaSets und einem weiteren zufälligen Suffix benannt werden.
Aufgabe 6: Deployment updaten
- Aktualisieren Sie unsere Anwendung, indem Sie das für das Deployment verwendete Image ändern. Fügen Sie dazu einen Tag wie
stable
odermainline
zum Image-Namen hinzu.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Bearbeiten Sie die Datei deployment.yaml
und ersetzen Sie die Zeile image: nginx
durch image: nginx:stable
.
- Öffnen Sie ein anderes Terminal mit "Split Terminal". Verwenden Sie
watch kubectl get all
, um die Änderungen in einem separaten Terminal zu beobachten. Wenden Sie anschließend die Änderung an.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Öffnen Sie ein weiteres Terminal und führen Sie
watch kubectl get all
aus. - Wenden Sie das Deployment an:
kubectl apply -f deployment.yaml
- Beobachten Sie, wie die Änderungen auf Deployments, ReplicaSets und Pods angewendet werden:
Sie können hier sehen, dass...
$ watch kubectl get all NAME READY STATUS RESTARTS AGE pod/web-5c7bdc66d4-fk4fx 1/1 Running 0 5s pod/web-5c7bdc66d4-lf4nw 0/1 ContainerCreating 0 2s pod/web-76fd95c67-vvh8v 1/1 Running 0 4h54m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/web ClusterIP 10.42.71.163 <none> 80/TCP 118s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/web 2/2 2 2 4h54m NAME DESIRED CURRENT READY AGE replicaset.apps/web-5c7bdc66d4 2 2 2 5s replicaset.apps/web-76fd95c67 0 1 1 4h54m
- das existierende ReplicaSet
web-76fd95c67
auf die gewünschte Anzahl von 0 Pods herunter skaliert, - das bestehende ReplicaSet noch einen Pod
web-76fd95c67-vvh8v
hat, der noch läuft - ein neues ReplicaSet
web-5c7bdc66d4
ist fertig zum Hochskalieren - das neue ReplicaSet hat die gewünschte Anzahl von 2 Pods erstellt,
web-5c7bdc66d4-fk4fx
undweb-5c7bdc66d4-lf4nw
- Untersuchen Sie Ihr Deployment.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
$ kubectl describe deployment web
Name: web
Namespace: testnamespace
CreationTimestamp: Wed, 21 Feb 2024 09:32:23 +0100
Labels: exercise=deployments
Annotations: deployment.kubernetes.io/revision: 2
Selector: app=web
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=web
Containers:
nginx:
Image: nginx:stable
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: web-76fd95c67 (0/0 replicas created)
NewReplicaSet: web-5c7bdc66d4 (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 6m31s deployment-controller Scaled up replica set web-5c7bdc66d4 to 1
Normal ScalingReplicaSet 6m28s deployment-controller Scaled down replica set web-76fd95c67 to 1 from 2
Normal ScalingReplicaSet 6m28s deployment-controller Scaled up replica set web-5c7bdc66d4 to 2 from 1
Normal ScalingReplicaSet 6m26s deployment-controller Scaled down replica set web-76fd95c67 to 0 from 1
deployment.kubernetes.io/revision: 2
angegeben
- das Image in der Pod-Vorlage auf nginx:latest
geändert wurde
- das OldReplicaSet web-76fd95c6
wurde von 2 auf 1 Pod und von 1 auf 0 Pods verkleinert
- das NewReplicaSet web-5c7bdc66d4
wurde von 0 auf 1 Pod und von 1 auf 2 Pods vergrößert
Aufgabe 7: Einen Service hinzufügen und Konnektivität testen
- Erstellen Sie einen Service mit dem Namen
web
und wählen Sie die durch das Deployment erstellten Pods mit demselben Label aus, das im Deployment verwendet wurde. Wenden Sie anschließend den Service an.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Erstellen Sie eine Datei
service.yaml
:apiVersion: v1 kind: Service metadata: name: web labels: exercise: deployments spec: selector: app: web ports: - protocol: TCP port: 80 targetPort: 80
- Wenden Sie den Service an:
kubectl apply -f service.yaml
- Überprüfen Sie, dass der Service funktioniert, indem Sie sich mit dem Service verbinden mit
kubectl run
undcurl
wie in früheren Aufgaben.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Nutzen Sie folgenden Befehl, um sich mit dem Service zu verbinden:
kubectl run -it --image=cmd.cat/bash/curl --rm --command -- curl web
Aufgabe 8: History und Rollback
- Lassen Sie sich die interaktive Hilfe von
kubectl
anzeigen, um zu verstehen, wie man die History eines Deployments anzeigen kann.
kubectl subcommand help
Lesen Sie auch die interaktive Hilfe zu den Unterbefehlen kubectl rollout
und kubectl rollout history
.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Zeigen Sie den Verlauf des Deployments mit dem folgenden Befehl an:
$ kubectl rollout history deployment web
deployment.apps/web
REVISION CHANGE-CAUSE
1 <none>
2 <none>
- Wenn die Rollout-History nur eine einzige Revision enthält, wiederholen Sie bitte Aufgabe 6 zum Update des Deployments, um eine neue Revision zu erstellen.
- Lesen Sie die interaktive Hilfe zu
kubectl
, um die letzte Änderung rückgängig zu machen. Führen Sie ein Rollback zur vorherigen Revision des Deployments durch.
kubectl subcommand help
Lesen Sie die interaktive Hilfe des kubectl rollout
Unterbefehls.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Schauen Sie sich Revision 1 an, die
Image: nginx
verwendet$ kubectl rollout history deployment web --revision=1 deployment.apps/web with revision #1 Pod Template: Labels: app=web exercise=deployments pod-template-hash=76fd95c67 Containers: nginx: Image: nginx Port: <none> Host Port: <none> Environment:<none> Mounts: <none> Volumes: <none>
- Schauen Sie sich Revision 2 an, die
Image: nginx:stable
verwendet$ kubectl rollout history deployment web --revision=2 deployment.apps/web with revision #2 Pod Template: Labels: app=web exercise=deployments pod-template-hash=5c7bdc66d4 Containers: nginx: Image: nginx:stable Port: <none> Host Port: <none> Environment:<none> Mounts: <none> Volumes: <none>
- Kehren Sie mit dem folgenden Befehl zur vorherigen Version des Deployments zurück:
kubectl rollout undo deployment web
- Have a look at the list of revisions:
$ kubectl rollout history deployment web deployment.apps/web REVISION CHANGE-CAUSE 2 <none> 3 <none>
- Schauen Sie sich die neue Revision 3 an, die wieder
Image: nginx
verwendet:$ kubectl rollout history deployment web --revision=3 deployment.apps/web with revision #3 Pod Template: Labels: app=web exercise=deployments pod-template-hash=76fd95c67 Containers: nginx: Image: nginx Port: <none> Host Port: <none> Environment:<none> Mounts: <none> Volumes: <none>
Bonus: Test manual scaling
- Ändern Sie die Anzahl der Replicas in
deployment.yaml
und wenden Sie es an. Beobachten Sie die Veränderung live. - Die Anzahl der Pods kann auch mit
kubectl scale
geändert werden.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Mit dem folgenden Befehl können Sie die Anzahl der Replicas skalieren:
kubectl scale --replicas=3 deployment web
- Nutzen Sie in einem separaten Terminal
watch kubectl get all
, um die Veränderung live zu beobachten.
Cleanup
- Löschen Sie alle Objekte, die wir mit
kubectl delete
erstellt haben, indem Sie den Label-Selektor für diese spezielle Übung verwenden. - Beobachten Sie, wie sie mit
watch kubectl get all
verschwinden.
Das ReplicaSet und Deployment wird automatisch alle Pods entfernen, die dem labelSelector entsprechen.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl delete replicasets --selector exercise=scale
kubectl delete services --selector exercise=scale
kubectl delete deployments --selector exercise=deployments
kubectl delete services --selector exercise=deployments