Pod Management 2
Ziel
In diesem Projekt geht es um fortgeschrittene Techniken zur Erstellung von Pods. Sie werden:
- StatefulSets, (Cron-)Jobs und DaemonSets erstellen
 - Unterschiedliche Deployment-Strategien anwenden
 
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, DaemonSets und Jobs 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.3und 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 
nslookupauf den Servicedb-headlessaus 
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.yamlund 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