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 Namenvolume-emptydir
beschreibt. - Die Pod-Spezifikation sollte ein Volume des Typs
emptyDir
mit dem Namencache
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 einenhostPath
-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
- der den
-
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.