Zum Inhalt

Volumes

Ziel

In diesem Projekt geht es um Volumes und Mount-Punkte. Sie werden:

  • ein Pod mit einem emptyDir Volume erstellen
  • ein Pod mit einem Persistent Volume erstellen
  • ein Persistent Volume Claim mit einem CSI-Plugin 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.

Aufgabe 1: emptyDir Volumes

  • Erstellen Sie eine Datei emptydir.yaml, die einen Pod mit dem Namen volume-emptydir beschreibt.
  • Die Pod-Spezifikation sollte ein Volume des Typs emptyDir mit dem Namen cache enthalten.
  • Mounten Sie das Volume in der Container-Spezifikation unter dem Pfad /cache.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
---
apiVersion: v1
kind: Pod
metadata:
  name: volume-emptydir
spec:
  volumes:
  - name: cache
    emptyDir: {}
  containers:
  - name: web
    image: nginx
    volumeMounts:
    - mountPath: /cache
      name: cache
  • Wenden Sie den Pod mit kubectl apply an.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f emptydir.yaml
  • Schauen Sie sich den Pod mit kubectl describe an.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl describe pod volume-emptydir
Name:             volume-emptydir
(...)
Containers:
  web:
    (...)
    Mounts:
      /cache from cache (rw)
(...)
Volumes:
  cache:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>
  • Überprüfen Sie die Mounts innerhalb des Pod-Containers indem Sie df im Pod ausführen.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl exec -it volume-emptydir -- df --exclude-type=tmpfs
Filesystem     1K-blocks    Used Available Use% Mounted on
overlay        619139212 8908236 584839800   2% /
/dev/sda1      619139212 8908236 584839800   2% /cache

Aufgabe 2: PersistentVolume und PersistentVolumeClaim

Aufgabe 2.1: PersistentVolume erstellen

  • Erstellen Sie eine PersistentVolume YAML-Datei pv.yaml und definieren Sie ein PersistentVolume, das einen hostPath-Volumen-Typ verwendet und eine Kapazität von 5Gi angibt.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
apiVersion: v1
kind: PersistentVolume
metadata:
  name: dummy-pv
  labels:
    storage: dummy
spec:
  capacity:
    storage: 5Gi
  storageClassName: ""
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /data/pv/dummy
    type: DirectoryOrCreate
  • Deployen Sie das PersistentVolume mit kubectl apply.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f pv.yaml
  • Überprüfen Sie, ob das PersistentVolume erfolgreich erstellt wurde
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)

kubectl get pv
kubectl describe pv dummy-pv

Aufgabe 2.2: PersistentVolumeClaim definieren

  • Erstellen Sie eine PersistentVolumeClaim YAML-Datei pvc.yaml und definieren Sie einen PersistentVolumeClaim mit einer Kapazität von 5Gi.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dummy-pvc
spec:
  volumeName: dummy-pv
  storageClassName: ""
  accessModes:
  - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 5Gi
  • Deployen Sie den PersistentVolumeClaim
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f pvc.yaml
  • Überprüfen Sie, ob der PersistentVolumeClaim erfolgreich erstellt wurde
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)

kubectl get pvc
kubectl describe pvc dummy-pvc

Aufgabe 2.3: Pod mit PersistentVolumeClaim erstellen

  • Erstellen Sie eine Pod YAML-Datei storage-demo.yaml und definieren Sie einen Pod:

    • der den dummy-pvc PersistentVolumeClaim verwendet und
    • ein Volume "data" an das Verzeichnis /usr/share/nginx/html mountet.
    • Verwenden Sie dieses Beispiel als Ausgangspunkt:
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: storage-demo
      labels:
        exercise: storage
    spec:
      containers:
      - name: nginx
        image: nginx
    
  • Wenden Sie das Pod-Manifest an

Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
apiVersion: v1
kind: Pod
metadata:
  name: storage-demo
  labels:
    exercise: storage
spec:
  volumes:
    - name: pvc-volume
      persistentVolumeClaim:
        claimName: dummy-pvc
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: pvc-volume
kubectl apply -f storage-demo.yaml
  • Führen Sie kubectl describe aus, um die Ereignisse des Pods zu überprüfen und zu sehen, ob das Volume erfolgreich gemountet wurde
  • Führen Sie kubectl exec aus, um eine Datei in das gemountete Volume zu schreiben
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl exec -it storage-demo -- /bin/sh -c 'echo "Hello from Kubernetes" > /usr/share/nginx/html/index.html'
  • Löschen Sie den Pod und erstellen Sie einen neuen Pod mit demselben PersistentVolumeClaim
  • Führen Sie kubectl exec aus, um den Inhalt des gemounteten Volumes zu überprüfen
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl exec -it storage-demo -- /bin/sh -c 'cat /usr/share/nginx/html/index.html'
  • Löschen Sie den Pod und den PersistentVolumeClaim

Aufgabe 3: PersistentVolumeClaim mit CSI Plugin

In der vorherigen Aufgabe haben wir ein PV und PVC händisch angelegt. Über CSI-Plugins und StorageClasses können PVs auch automatisch erzeugt werden.

Aufgabe 3.1: PersistentVolumeClaim erstellen

  • Lassen Sie sich alle PersistentVolumes und PersistentVolumeClaims anzeigen
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get pv,pvc
  • Lassen Sie sich alle verfügbaren StorageClasses anzeigen
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get stor<TAB>
kubectl get storageclasses.storage.k8s.io
  • Erstellen Sie ein PVC, das die StorageClass hcloud-volumes verwendet. Die StorageClass sollte der Default sein und muss deshalb nicht explizit angegeben werden
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: hetzner-pvc
spec:
  accessModes:
  - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 5Gi
kubectl apply -f <pvc.yml>
  • Lassen Sie sich Details zum erstellten PVC anzeigen
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl describe persistentvolumeclaims hetzner-pvc
Name:          hetzner-pvc
Namespace:     default
StorageClass:  hcloud-volumes
Status:        Pending
Volume:
Labels:        <none>
Annotations:   <none>
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
VolumeMode:    Filesystem
Used By:       <none>
Events:
  Type    Reason                Age               From                         Message
  ----    ------                ----              ----                         -------
  Normal  WaitForFirstConsumer  3s (x4 over 46s)  persistentvolume-controller  waiting for first consumer to be created before binding

Der PVC ist erstellt. Das dazugehörige PersistentVolume wird aber erst erstellt, sobald das PVC verwendet wird.

Aufgabe 3.2: PersistentVolumeClaim verwenden

  • Starten Sie einen Pod, der das PVC verwendet
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
apiVersion: v1
kind: Pod
metadata:
  name: hetzner-storage-demo
  labels:
    exercise: storage
spec:
  volumes:
    - name: pvc-volume
      persistentVolumeClaim:
        claimName: hetzner-pvc
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: pvc-volume
  • Lassen Sie sich alle PersistentVolumes und PersistentVolumeClaims anzeigen
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get pv,pvc
  • Sie sollten das erstellte PersistentVolume sehen.

Cleanup

  • Löschen Sie alle Objekte, die Sie erstellt haben.
  • Beobachten Sie, wie sie mit watch kubectl get all verschwinden.