Zum Inhalt

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 kubectl und die Rook-Toolbox für die Analyse.
  • Arbeite im Namespace rook-ceph, wenn du direkte Ceph-Kommandos ausführst.
  • Wenn eine PVC zunächst Pending ist, 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 reclaimPolicy hat die StorageClass?
  • Welcher volumeBindingMode ist 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
Der Name der zugehörigen PV steht in der Spalte 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>
alternativ kannst du auch den Node direkt über die Kubernetes-API ermitteln:

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>