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 gezogen
- 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 einer YAML-Datei 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=nginx
- Ü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 startet
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
apiVersion: v1
kind: Pod
metadata:
name: apache
spec:
containers:
- name: apache
image: apache
- Fügen Sie Label und Annotationen hinzu
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-Knoten wieder
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl delete pod <name>
Aufgabe 6: DNS
- Definieren Sie eine service.yaml-Datei so, dass der Service Pod mit dem Label app=web erreichbar macht
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
---
apiVersion: v1
kind: Service
metadata:
name: web
labels:
exercise: services
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 80
Ihr nginx-Pod sieht folgendermaßen aus:
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: web
exercise: services
spec:
containers:
- name: nginx
image: nginx
ports:
- name: web
containerPort: 80
- Inspizieren Sie den Service. Achten Sie insbesondere auf die IP-Adresse.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl describe service web
- Löschen Sie den Pod und starten Sie ihn neu. Betrachten Sie wieder die IP-Adresse.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl delete pod nginx
kubectl apply -f nginx.yaml
kubectl describe service web
-
Gehen Sie interaktiv in den Service. Lassen Sie sich mit curl den Inhalt Ihres Webserver-Pods anzeigen
kubectl run -it --image=cmd.cat/bash/curl --rm --command -- bash
curl -s <service-name>
-
Löschen Sie den Service
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl delete service <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 Dienst ausgewählt wird.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
apiVersion: v1
kind: Pod
metadata:
name: apache
labels:
app: web
spec:
containers:
- name: apache
image: httpd:2.4
ports:
- name: web
containerPort: 80
kubectl apply -f <name>.yaml
-
Überprüfen Sie die IP-Adressen der Pods:
$ kubectl get pods -o=jsonpath='{.items[*].status.podIP}' 10.42.147.192 10.42.146.227
-
Überprüfen Sie die IP-Adressen im Service:
Beide Pods wurden zugewiesen, wie durch "Endpunkte" angezeigt: 10.42.146.227:80,10.42.147.192:80`.$ kubectl describe service web # (...) Endpoints: 10.42.146.227:80,10.42.147.192:80 # (...)
-
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.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl run -it --image=cmd.cat/bash/curl --rm --command -- curl -v web 2>&1 | grep "< Server"
Cleanup
Bereinigen Sie Ihren Cluster, indem Sie alle Pods löschen.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl delete pod <pod-name>
kubectl get pods