Erste Schritte
Ziel
In diesem Projekt geht es um die grundlegende Funktionalität von Kubernetes. Sie werden:
- Pods starten und stoppen
- Pods labeln
- Pods mit einem Service erreichbar machen
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.
Aufgabe 1: Bei VSCode anmelden
- Die Schulungsmaschinen sind unter
code-{ZAHL}.labs.corewire.de
zu erreichen. Ersetzen Sie{ZAHL}
mit der Ihnen zugewiesenen Zahl. - Beispiel für die Zahl 5:
code-5.labs.corewire.de
. - Beispiel für die Zahl 11:
code-11.labs.corewire.de
. - Geben Sie danach das Ihnen zugewiesene Passwort ein.
-
Sie haben nun Zugriff auf die Schulungsmaschine.
-
Überprüfen Sie, dass Sie Zugriff auf ein Cluster haben. Der Output sollte in etwa folgendermaßen aussehen:
kubectl version
Client Version: v1.29.3
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.28.8
Aufgabe 2: Pods starten
- Öffnen Sie einen interaktiven Pod
kubectl run -it --image=alpine --rm my-first-pod
# An interactive shell starts, which you could investigate:
$ cat /etc/alpine-release
# 3.19.1
$ exit
# Session ended, resume using 'kubectl attach my-first-pod -c my-first-pod -i -t' command when the pod is running
# pod "my-first-pod" deleted
Folgende Dinge sind geschehen:
- Das Alpine-Image wurde aus der Container-Registrierung heruntergeladen
- Ein Pod wurde mit
kubectl run
erstellt und der Namemy-first-pod
wurde dem Pod zugewiesen - Ein Container wurde in dem Pod mit dem Alpine-Image gestartet (
--image=alpine
) - Eine Shell wurde gestartet (weil dies das Standardverhalten von Alpine-Image-Containern ist)
- Eine Terminal-Sitzung wird für den Container zugewiesen (
-it
) - Das Beenden des Terminals beendet den Shell-Prozess und den Container
- Der Pod wird sofort entfernt, sobald der Containerprozess beendet ist (
--rm
)
Beachten Sie, dass kubectl attach my-first-pod -c my-first-pod -i -t
hier nicht funktioniert, da der Pod sofort entfernt wurde.
Aufgabe 3: YAML File
Ein Pod (und andere Kubernetes-Ressourcen) können in YAML-Dateien beschrieben werden. Der allgemeine Aufbau einer solchen YAML-Datei ist wie folgt:
apiVersion: v1
kind: Pod
metadata:
name: my-pod-name
spec:
containers:
- name: my-container-name
image: my-container-image
- Erstellen Sie eine YAML-Datei
my-simple-pod.yaml
, um Ihr Pod-Manifest zu beschreiben. Der Pod sollte ein nginx-Container-Image verwenden.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
- Starten Sie den Pod
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f my-simple-pod.yaml
- Lassen Sie sich alle Pods ausgeben
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get pods
- Schauen Sie sich die Logs des Pods an
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl logs nginx
Aufgabe 4: Label
- Geben Sie Ihrem Pod das Label
app=webserver
undversion=1
und starten Sie neu
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Label hinzufügen:
...
metadata:
name: nginx
labels:
app: webserver
version: "1"
...
kubectl apply -f pod.yaml
- Filtern Sie in allen Pods nach dem Label app=webserver
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get pod -l app=webserver
# Oder
kubectl get pod -l 'app in (webserver)'
# Oder
kubectl get pods --selector app=webserver
- Überschreiben Sie das Label
version
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl label pod <name> version=2 --overwrite
- Lassen Sie sich alle Label ausgeben
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl label pod <name> --list
- Fügen Sie Annotationen hinzu
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
...
metadata:
name: nginx
labels:
app: webserver
version: 1
annotations:
name: My first webserver
...
- Lassen Sie sich die Annotationen ausgeben
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl describe pod <name>
Aufgabe 5: Gemischte Übung
- Definieren Sie einen weiteren Pod, der einen Apache Webserver (Image=httpd) startet
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
apiVersion: v1
kind: Pod
metadata:
name: httpd
spec:
containers:
- name: httpd
image: httpd
- Fügen Sie Label und Annotationen nach Belieben hinzu, mindestens aber das Label
app=webserver
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
...
metadata:
name: apache
labels:
app: webserver
version: 1
annotations:
name: My second Webserver
description: apache webserver
...
- Starten Sie Ihren Apache-Pod
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f <name>.yaml
- Lassen Sie sich alle Pods ausgeben
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get pods
- Löschen Sie den Apache-Pod wieder
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl delete pod <name>
Aufgabe 6: Service
- Definieren Sie eine
service.yaml
-Datei so, dass der Service Pods mit dem Labelapp=webserver
auf Port 80 erreichbar macht. Starten Sie den Service.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
---
apiVersion: v1
kind: Service
metadata:
name: web
labels:
exercise: services
spec:
selector:
app: webserver
ports:
- protocol: TCP
port: 80
targetPort: 80
Dann kubectl apply -f service.yaml
- Inspizieren Sie den Service. Achten Sie insbesondere auf die IP-Adressen.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl describe service web
- Löschen Sie den nginx Pod und starten Sie ihn neu. Betrachten Sie wieder die IP-Adressen.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl delete pod nginx
kubectl apply -f nginx.yaml
kubectl describe service web
- Verbinden Sie sich mit
curl
zu dem Service:
kubectl run -it --image=cmd.cat/bash/curl --rm -- bash
curl <service-name>
Aufgabe 7: Load balancing testen
Wenn mehrere Pods vom Dienst ausgewählt werden, werden die Anfragen auf die Pods verteilt.
- Stellen Sie einen zweiten Pod mit Apache bereit, damit er ebenfalls vom Service ausgewählt wird.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
apiVersion: v1
kind: Pod
metadata:
name: apache
labels:
app: webserver
spec:
containers:
- name: apache
image: httpd
kubectl apply -f <name>.yaml
- Überprüfen Sie die IP-Adressen der Pods:
kubectl get pods -o=wide
- Überprüfen Sie die IP-Adressen im Service:
kubectl describe service web
Beide Pods wurden zugewiesen, wie durch "Endpunkte" angezeigt.
- Testen Sie die Verbindung zum Dienst und überprüfen Sie den Servernamen in der Antwort. Wiederholen Sie den Befehl
curl
mehrmals, um zu sehen, ob der eine oder andere Pod antwortet.
kubectl run -it --image=cmd.cat/bash/curl --rm --command -- bash
curl web
Cleanup
Bereinigen Sie Ihren Cluster, indem Sie alle Pods und den Service löschen.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl delete pod <pod-name>
- Um alle laufenden Pods zu erhalten nutzen Sie
kubectl get pods
- Um den Service zu löschen nutzen Sie:
kubectl delete service <service-name>