Heb je een applicatie die vanaf meerdere Kubernetes-pods tegelijk dezelfde bestanden moet lezen en schrijven, dan heb je gedeelde file storage nodig. Met Ceph en Rook maak je in Kubernetes een redundant filesystem aan op basis van CephFS.
In deze handleiding installeer je Rook, maak je een basis Ceph-cluster aan, en configureer je daarna CephFS als gedeelde ReadWriteMany-storage voor twee pods. De voorbeelden gaan uit van een cluster met drie PVC's en transip-fast-storage.
- Voor een redundant CephFS-volume heb je minimaal drie nodes of drie PVC's nodig.
- De CephCluster-configuratie hieronder gebruikt “transip-fast-storage”. Gebruik je een andere StorageClass zoals transip-big-storage, vervang die dan op alle plekken in het manifest.
Installeer Rook
Stap 1
Download een Rook-release (zie Github voor de laatste versie) en ga naar de voorbeeldbestanden:
git clone --single-branch --branch v1.19.6 https://github.com/rook/rook.git
cd rook/deploy/examplesVolgens de officiële Rook-quickstart gebruik je bij voorkeur bestanden uit een getagde release in plaats van de `master`-branch, zodat je manifests aansluiten op een concrete Rook-versie.
Stap 2
Installeer de Rook-operator en de benodigde CRD's (Custom Resource Definitions):
kubectl create -f crds.yaml -f common.yaml -f csi-operator.yaml -f operator.yamlHiermee maak je onder andere de namespace rook-ceph, de Ceph-CRD's en de operator aan die het storage-cluster beheert.
Stap 3
Controleer of de operator actief is:
kubectl -n rook-ceph get podsGa pas verder zodra de rook-ceph-operator in “Running”-status staat. Zonder operator kan Kubernetes geen CephCluster-object verwerken.
Stap 4
Maak een PVC-gebaseerd Ceph-cluster aan. Dit past goed bij een cloud-omgeving met dynamische volumes, zoals een cluster met een PVC op basis van fast storage:
nano cluster-on-pvc.yamlPlaats de volgende configuratie in het bestand:
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
name: rook-ceph
namespace: rook-ceph
spec:
cephVersion:
image: quay.io/ceph/ceph:v19.2.3
dataDirHostPath: /var/lib/rook
mon:
count: 3
allowMultiplePerNode: false
volumeClaimTemplate:
spec:
storageClassName: transip-fast-storage
resources:
requests:
storage: 10Gi
storage:
storageClassDeviceSets:
- name: set1
count: 3
portable: false
encrypted: false
volumeClaimTemplates:
- metadata:
name: data
spec:
resources:
requests:
storage: 10Gi
storageClassName: transip-fast-storage
volumeMode: Block
accessModes:
- ReadWriteOnce
onlyApplyOSDPlacement: falseSla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Gebruik je liever big storage? Vervang dan transip-fast-storage door transip-big-storage.
Stap 5
Maak het Ceph-cluster aan:
kubectl apply -f cluster-on-pvc.yamlDit is een PVC-based cluster zoals Rook dat aanbeveelt voor dynamische cloud-omgevingen. De monitoren gebruiken PVC's in filesystem-mode en de OSD's krijgen block-mode volumes via dezelfde StorageClass.
Stap 6
Wacht tot de monitor-, manager- en OSD-pods actief zijn:
kubectl -n rook-ceph get pods
kubectl -n rook-ceph get cephcluster rook-cephGa verder zodra de monitoren in quorum zijn, een manager actief is en je minimaal drie OSD's ziet die “up” en “in” zijn. Als de status niet gezond wordt, controleer dan eerst je StorageClass en nodecapaciteit.
Het CephFilesystem aanmaken
Stap 1
Maak een manifestbestand aan voor het Ceph-filesystem:
nano filesystem.yamlPlaats de volgende configuratie in het bestand:
apiVersion: ceph.rook.io/v1
kind: CephFilesystem
metadata:
name: sharedfs
namespace: rook-ceph
spec:
metadataPool:
replicated:
size: 3
dataPools:
- name: replicated
replicated:
size: 3
preserveFilesystemOnDelete: true
metadataServer:
activeCount: 1
activeStandby: trueSla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Stap 2
Maak het filesystem nu daadwerkelijk aan:
kubectl apply -f filesystem.yamlHiermee maak je een metadata-pool en een data-pool aan met replicatie over drie OSD's. “activeStandby: true” houdt daarnaast een tweede MDS-pod standby voor failover.
Stap 3
Controleer of de MDS-pods gestart zijn:
kubectl -n rook-ceph get pods -l app=rook-ceph-mdsJe verwacht hier twee pods te zien voor “sharedfs”: één actieve MDS en één standby. Pas daarna heeft je filesystem een bruikbare shared file service.
Maak een StorageClass voor CephFS
Stap 1
Maak een StorageClass aan die het nieuwe filesystem gebruikt:
nano storageclass.yamlPlaats de volgende configuratie in het bestand:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-cephfs-sharedfs
provisioner: rook-ceph.cephfs.csi.ceph.com
parameters:
clusterID: rook-ceph
fsName: sharedfs
pool: sharedfs-replicated
csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
csi.storage.k8s.io/controller-expand-secret-name: rook-csi-cephfs-provisioner
csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
csi.storage.k8s.io/controller-publish-secret-name: rook-csi-cephfs-provisioner
csi.storage.k8s.io/controller-publish-secret-namespace: rook-ceph
csi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-node
csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: ImmediateSla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Stap 2
Maak de StorageClass aan:
kubectl apply -f storageclass.yamlHet veld “pool: sharedfs-replicated” verwijst naar de data-pool van het CephFilesystem. Gebruik je een andere naam voor het filesystem, pas dit veld dan ook aan.
Maak een gedeelde persistent volume claim aan
Je bent vrij de bestandsnamen, metadata name en namespace aan te passen naar een naam naar keuze. Let wel dat je deze dan consistent aanpast in alle verdere stappen.
Stap 1
Maak een manifest aan met een namespace, een persistent volume claim en twee pods die hetzelfde volume mounten:
nano cephfs-test.yamlPlaats de volgende configuratie in het bestand:
apiVersion: v1
kind: Namespace
metadata:
name: cephfs-test
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: shared-data
namespace: cephfs-test
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: rook-cephfs-sharedfs
---
apiVersion: v1
kind: Pod
metadata:
name: writer
namespace: cephfs-test
spec:
restartPolicy: Never
containers:
- name: busybox
image: busybox:1.36
command: ["/bin/sh", "-c"]
args:
- |
echo "writer-start $(date -u +%FT%TZ)" > /data/hello.txt
sync
sleep 3600
volumeMounts:
- name: shared
mountPath: /data
volumes:
- name: shared
persistentVolumeClaim:
claimName: shared-data
---
apiVersion: v1
kind: Pod
metadata:
name: reader
namespace: cephfs-test
spec:
restartPolicy: Never
containers:
- name: busybox
image: busybox:1.36
command: ["/bin/sh", "-c"]
args:
- "sleep 3600"
volumeMounts:
- name: shared
mountPath: /data
volumes:
- name: shared
persistentVolumeClaim:
claimName: shared-dataSla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Stap 2
Maak de namespace, PVC en pods aan:
kubectl apply -f cephfs-test.yamlDeze configuratie gebruikt “ReadWriteMany”, zodat meerdere pods gelijktijdig hetzelfde volume kunnen gebruiken.
Stap 3
Controleer of de PVC gebonden is en de pods gestart zijn:
kubectl -n cephfs-test get pvc,podsDe PVC hoort “Bound” te zijn en beide pods horen in “Running”-status te staan.
Controleer of beide pods dezelfde data zien
Stap 1
Lees het bestand vanuit de writer-pod:
kubectl -n cephfs-test exec writer -- cat /data/hello.txt
Stap 2
Voeg vanuit de reader-pod een extra regel toe en toon daarna de inhoud opnieuw:
kubectl -n cephfs-test exec reader -- sh -c 'echo reader-check $(date -u +%FT%TZ) >> /data/hello.txt && cat /data/hello.txt'Zie je in de output zowel “writer-start” als “reader-check”, dan mounten beide pods hetzelfde CephFS-volume en werkt gedeelde opslag zoals bedoeld.
Houd rekening met de limieten van gedeelde file storage
- Namespace-scope: een PVC blijft gebonden aan één namespace. Wil je data over namespaces delen, dan vraagt dat een andere opzet dan alleen dezelfde PVC mounten.
- Applicatiegedrag: gedeelde storage is alleen veilig als je applicatie om kan gaan met gelijktijdige schrijfacties en file locking.
- Scheduling: wil je expliciet testen over verschillende nodes, plaats pods dan gericht met labels, selectors of anti-affinity.
- Back-upstrategie: replicatie beschermt tegen disk- of node-uitval, maar niet tegen logische fouten of ongewenste wijzigingen in bestanden. Maak dus daarnaast back-ups of snapshots.
Door CephFS via Rook te gebruiken combineer je gedeelde file storage met redundantie op storage-niveau. Zo kunnen meerdere pods tegelijk dezelfde data gebruiken, terwijl de data onderliggend over meerdere OSD's gerepliceerd blijft.