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 gezogen
  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 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 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=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
Die IP-Adresse hat sich geändert.

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

    $ kubectl describe service web
    # (...)
    Endpoints:         10.42.146.227:80,10.42.147.192:80
    # (...)
    
    Beide Pods wurden zugewiesen, wie durch "Endpunkte" angezeigt: 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>
Um alle laufenden Pods zu erhalten nutzen Sie kubectl get pods