Architektur
Ziel
In diesem Lab lernst du, wie ein Kubernetes-Volume über Rook Ceph provisioniert und in einem Pod verwendet wird. Du verfolgst dabei den Weg von der StorageClass bis zum Ceph-Block-Device und verstehst, wie PVC, PV, CSI und Ceph zusammenarbeiten.
- Rook-, Ceph- und CSI-Komponenten im Cluster identifizieren
- eine PVC mit einer vorhandenen RBD-StorageClass anlegen
- die PVC in einem Pod verwenden
- PVC, PV, StorageClass und Ceph-Pool zusammenführen
- das zugehörige RBD-Image im Ceph-Cluster finden
Hilfsmittel
- Nutze
kubectlund die Rook-Toolbox für die Analyse. - Arbeite im Namespace
rook-ceph, wenn du direkte Ceph-Kommandos ausführst. - Wenn eine PVC zunächst
Pendingist, prüfe zuerst die StorageClass und den Ceph-Pool. - Versuche, die Aufgaben mit Hilfe der Folien und des Cheatsheets eigenständig zu lösen.
Aufgabe 1 – StorageClass und Ceph-Pool identifizieren
Bevor du eine PVC erstellst, musst du verstehen, welche Storage-Angebote der Cluster bereitstellt.
1.1 StorageClasses anzeigen
Lasse dir alle StorageClasses im Cluster anzeigen
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Verwende den Befehl:
kubectl get storageclass
Notiere dir den Namen der StorageClass, die den CSI-Treiber rbd.csi.ceph.com verwendet.
1.2: StorageClass prüfen
Lasse dir die Details der StorageClass als YAML ausgeben
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Verwende den Befehl:
kubectl get storageclass <STORAGECLASS> -o yaml
Suche nach diesen Feldern:
provisioner:
parameters:
pool:
clusterID:
Fragen:
- Welcher CSI-Provisioner wird verwendet?
- Welcher Ceph-Pool ist der Standard-Pool für das Volume?
- Welche
reclaimPolicyhat die StorageClass? - Welcher
volumeBindingModeist konfiguriert?
Aufgabe 2 – Ceph-Status und vorhandene Images prüfen
Als Nächstes prüfst du den Zustand des Ceph-Clusters und die vorhandenen RBD-Images, bevor du eine neue PVC anlegst.
2.1: Rook-Toolbox öffnen
Wechsel in den Namespace rook-ceph
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubeswitch rook-ceph
Öffne eine Shell in der Rook-Toolbox, um Ceph-Kommandos auszuführen
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl exec -it deploy/rook-ceph-tools -- bash
2.2: Ceph-Status und Pools anzeigen
Lasse dir den aktuellen Ceph-Status und die vorhandenen Pools anzeigen
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
ceph status
ceph osd pool ls
2.3: Vorhandene RBD-Images prüfen
Lasse dir die vorhandenen RBD-Images im Standard-Pool anzeigen. Im Moment gibt es noch keine PVC, daher sollte die Liste leer sein.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
rbd ls <POOL>
2.4: Toolbox verlassen
Verlasse die Rook-Toolbox, um wieder in deinem lokalen Terminal zu arbeiten
exit
Aufgabe 3 – PVC erstellen
Lege einen eigenen Namespace für die Übung an:
kubectl create namespace rook-lab
Wechsel in den Namespace:
kubeswitch rook-lab
3.2: PVC definieren
Erstelle eine Datei pvc.yaml mit folgendem Inhalt:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-volume
namespace: rook-lab
spec:
accessModes:
- ReadWriteOnce
storageClassName: <STORAGECLASS>
resources:
requests:
storage: 1Gi
Ersetze <STORAGECLASS> durch die bekannte RBD-StorageClass.
kubectl apply -f pvc.yaml
Überprüfe ihren Zustand:
kubectl get pvc
Falls die PVC noch nicht Bound ist, prüfe den Status mit:
kubectl describe pvc test-volume
3.3: Pod erstellen
Erstelle eine Datei pod.yaml mit folgendem Inhalt:
apiVersion: v1
kind: Pod
metadata:
name: storage-test
namespace: rook-lab
spec:
containers:
- name: test
image: busybox:1.36
command:
- sh
- -c
- sleep infinity
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: test-volume
Starte den Pod:
kubectl apply -f pod.yaml
Prüfe, ob der Pod läuft:
kubectl get pod
3.4: Daten auf das Volume schreiben
kubectl exec storage-test -- \
sh -c 'echo "Hello from Rook and Ceph" > /data/hello.txt'
Lies sie anschließend wieder aus:
kubectl exec storage-test -- cat /data/hello.txt
Aufgabe 4 – PVC, PV und RBD-Image nachvollziehen
Jetzt verfolgst du das Volume von Kubernetes bis in den Ceph-Cluster hinein.
4.1: PV ermitteln
Finde die PersistentVolume, die der PVC zugeordnet ist
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get pvc test-volume
VOLUME.
4.2: PV untersuchen
Lasse dir die Details der PV als YAML ausgeben
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get pv <PV> -o yaml
Achte auf diese Felder:
spec:
csi:
driver:
volumeHandle:
volumeAttributes:
4.3: RBD-Image im Ceph-Pool finden
Verbinde dich erneut mit der Rook-Toolbox und lasse dir die RBD-Images im Pool anzeigen
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
rbd ls <POOL>
Vergleiche die Ausgabe mit dem imageName aus dem PV. Du solltest das neue RBD-Image finden, das der PVC zugeordnet ist.
Untersuche das Image mit rbd info
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
rbd info <POOL>/<IMAGE>
Gib die Metadaten des Images aus, um weitere Details zu sehen
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
rbd image-meta list <POOL>/<IMAGE>
4.4 Rados Objekte im Pool prüfen
Lass dir die Rados-Objekte im Pool anzeigen, um zu sehen, wie das RBD-Image intern gespeichert wird:
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
rados -p <POOL> ls
Filtere die Ausgabe nach dem Namen des RBD-Images, um die zugehörigen Objekte zu finden.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
rados -p <POOL> ls | grep <IMAGE>
4.5 Inhalte des Rados Objects auslesen
Finde das Rados-Objekt, das die Daten enthält:
for obj in $(rados -p replicapool ls | grep '^rbd_data'); do
if rados -p replicapool get "$obj" - 2>/dev/null \
| strings \
| grep -q 'Hello'; then
echo "Gefunden in: $obj"
fi
done
Gib den Inhalt des Objekts aus:
rados -p <POOL> get <OBJECT> - | strings
4.6: OSD finden
Finde für das Rados-Objekt heraus, auf welchem OSD es gespeichert ist:
ceph osd map replicapool <OBJECT>
Hinweis
Die Ausgabe könnte z.B. so aussehen:
rbd_data.22bc374b0ebc.0000000000000020 osdmap e47 pool 'replicapool' (1) object 'rbd_data.22bc374b0ebc.0000000000000020' -> pg 1.1b5d575e (1.1e) -> up ([2,3,1], p2) acting ([2,3,1], p2)
Die Ausgabe kann wie folgt gelesen werden:
- osdmap e47: Für die Berechnung wurde die OSD-Map in Epoch 47 verwendet. Die OSD-Map enthält u. a. den aktuellen Zustand der OSDs und die CRUSH-Topologie.
- pool 'replicapool' (1): Der Pool heißt replicapool und hat intern die Pool-ID 1.
- object 'rbd_data....': Das ist genau das RADOS-Objekt deines RBD-Images.
- pg 1.1b5d575e (1.1e): Ceph hasht den Objektnamen zunächst auf einen internen Placement-Wert und ordnet ihn daraus einer existierenden Placement Group zu. Die für dich interessante PG ist hier 1.1e. 1 ist dabei die Pool-ID.
- up ([2,3,1], p2): Laut aktueller CRUSH-Berechnung soll diese PG auf OSD 2, OSD 3 und OSD 1 liegen. p2 bedeutet: OSD 2 ist Primary.
- acting ([2,3,1], p2): Diese OSDs bedienen die PG aktuell tatsächlich.
4.7: OSD-Node finden
Finde heraus, auf welchem Node die OSD läuft
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
ceph osd find <OSD-ID>
kubectl get pod <OSD-POD-NAME> -n rook-ceph -o wide'
4.8: Persistenz testen
Lösche zuerst nur den Pod:
kubectl delete pod storage-test -n rook-lab
Erstelle ihn erneut:
kubectl apply -f pod.yaml
Lies danach die zuvor geschriebene Datei:
kubectl exec -n rook-lab storage-test -- \
cat /data/hello.txt
Aufräumen
Wenn du fertig bist, kannst du den Namespace löschen, um alle Ressourcen zu entfernen:
kubectl delete namespace rook-lab
Zusätzlich kannst du mit der Rook-Toolbox prüfen, ob das RBD-Image nach dem Löschen der PVC verschwunden ist:
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
rbd ls <POOL>