Zum Inhalt

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:

  1. Das Alpine-Image wurde aus der Container-Registrierung heruntergeladen
  2. Ein Pod wurde mit kubectl run erstellt und der Name my-first-pod wurde dem Pod zugewiesen
  3. Ein Container wurde in dem Pod mit dem Alpine-Image gestartet (--image=alpine)
  4. Eine Shell wurde gestartet (weil dies das Standardverhalten von Alpine-Image-Containern ist)
  5. Eine Terminal-Sitzung wird für den Container zugewiesen (-it)
  6. Das Beenden des Terminals beendet den Shell-Prozess und den Container
  7. 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 und version=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"
...
Dann 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 Label app=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
Die IP-Adresse hat sich geändert.

  • 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>