Zum Inhalt

Pod Management 2

Ziel

In diesem Projekt geht es um fortgeschrittene Techniken zur Erstellung von Pods. Sie werden:

  • StatefulSets erstellen
  • DaemonSets erstellen

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.
  • StatefulSets und DaemonSets werden auch in der offiziellen Kubernetes-Dokumentation erklärt.

Aufgabe 1: StatefulSet

Aufgabe 1.1: StatefulSets skalieren

Erstellen Sie eine Datei statefulset-scaling.yaml mit dem folgenden Inhalt:

---
apiVersion: v1
kind: Service
metadata:
  name: db-headless
  labels:
    app: blog
    component: db
spec:
  ports:
  - port: 3306
    name: mysql
  clusterIP: None
  selector:
    app: blog
    component: db
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: db
  labels:
    app: blog
    component: db
spec:
  serviceName: db
  replicas: 1
  minReadySeconds: 10
  selector:
    matchLabels:
      app: blog
      component: db
  template:
    metadata:
      labels:
        app: blog
        component: db
    spec:
      containers:
      - name: mysql
        image: mysql:5
        env:
        - name: MYSQL_RANDOM_ROOT_PASSWORD
          value: "yes"
        - name: MYSQL_DATABASE
          value: wordpress
        - name: MYSQL_USER
          value: wordpress
        - name: MYSQL_PASSWORD
          value: "notthesecret"
        ports:
        - name: mysql
          containerPort: 3306
  • Deployen Sie das StatefulSet
  • Überprüfen Sie, ob das StatefulSet erfolgreich erstellt wurde
  • Lassen Sie sich das StatefulSet und den Pod anzeigen mit
kubectl get all
  • Lassen Sie dieses Terminal offen und beobachten Sie es bei den weiteren Schritten
watch kubectl get all
  • Skalieren Sie das StatefulSet auf 4 Pods
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl scale statefulset db --replicas=4
  • Löschen Sie einen oder mehrere Pods und beobachten Sie, wie Kubernetes die Pods wiederherstellt
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl delete pod db-3
kubectl delete pod db-1
  • Skalieren Sie das StatefulSet auf 2 Pods
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl scale statefulset db --replicas=2

Aufgabe 1.2: StatefulSets updaten

  • Skalieren Sie das StatefulSet aus der vorherigen Aufgabe wieder auf 4 Pods indem Sie die yaml-Datei bearbeiten und das Update durchführen
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f statefulset-scaling.yaml
  • Ändern Sie das Image des Containers auf mysql:8.3 und führen Sie ein Update des StatefulSets durch
  • Beachten Sie dabei, dass das Update der Pods sequentiell erfolgt

Aufgabe 1.3: DNS in StatefulSets

  • Starten Sie einen interaktiven Busybox-Pod
  • Führen Sie nslookup auf den Service db-headless aus
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)

kubectl run -it --rm busybox --image=busybox --restart=Never -- sh
nslookup db-headless

  • Sie sollten eine Ausgabe ähnlich der folgenden erhalten:
Name:   db-headless.default.svc.cluster.local
Address: 10.42.129.48
Name:   db-headless.default.svc.cluster.local
Address: 10.42.129.219
Name:   db-headless.default.svc.cluster.local
Address: 10.42.128.250
Name:   db-headless.default.svc.cluster.local
Address: 10.42.129.126

Aufgabe 2: DaemonSets

  • DaemonSets sind eine spezielle Art von Controller, die Pods auf jedem Node im Cluster starten

Aufgabe 2.1: Scheduling von DaemonSets

  • Ein typisches Anwendungsbeispiel für DaemonSets ist das Starten eines Monitoring-Agents auf jedem Node im Cluster
  • Erstellen Sie eine Datei daemonset.yaml und fügen Sie das DaemonSet-Manifest hinzu:
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  labels:
    app: monitoring
    component: node-exporter
    exercise: daemonsets
spec:
  selector:
    matchLabels:
      app: monitoring
      component: node-exporter
  template:
    metadata:
      labels:
        app: monitoring
        component: node-exporter
    spec:
      containers:
      - name: node-exporter
        image: prom/node-exporter
        ports:
        - containerPort: 9100
  • Deployen Sie das DaemonSet
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f daemonset.yaml
  • Überprüfen Sie, ob das DaemonSet erfolgreich erstellt wurde
  • Lassen Sie sich das DaemonSet und die Pods anzeigen mit kubectl get all -o wide

Durch das Flag -o wide erhalten Sie zusätzliche Informationen zu den Pods, wie z.B. den Node, auf dem sie laufen. Damit können Sie überprüfen, ob das DaemonSet auf jedem Node im Cluster Pods erstellt hat.

  • Löschen Sie das DaemonSet
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl delete daemonset node-exporter

Cleanup

  • Löschen Sie alle erstellten Ressourcen