Winkelwagen

/ .nl-domeinnaam

Jouw .nl voor slechts € 0,49.

Domeinnaam checken
E-mail

/ Hostingpakket keuzehulp

Weet je niet zeker welk hostingpakket de beste
keus is voor jouw website? Met onze keuzehulp
kom je er wel uit.

Direct naar de keuzehulp

/ OpenStack

/ Probeer Public Cloud uit

Gratis 1 maand aan de slag met Public Cloud?

Vraag proefperiode aan

/ TransIP Blog

CSM25: API security in een SaaS-wereld

Lees de blogpost
Hulp nodig?

    Sorry, we konden geen resultaten vinden voor jouw zoekopdracht.

    Redundante shared storage in Kubernetes met Rook CephFS

    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/examples

    Volgens 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.yaml

    Hiermee 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 pods

    Ga 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.yaml

    Plaats 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: false

    Sla 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.yaml

    Dit 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-ceph

    Ga 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.yaml

    Plaats 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: true

    Sla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).


     

    Stap 2

    Maak het filesystem nu daadwerkelijk aan:

    kubectl apply -f filesystem.yaml

    Hiermee 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-mds

    Je 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.yaml

    Plaats 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: Immediate

    Sla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).


     

    Stap 2

    Maak de StorageClass aan:

    kubectl apply -f storageclass.yaml

    Het 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.yaml

    Plaats 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-data

    Sla 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.yaml

    Deze 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,pods

    De 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.

    Kom je er niet uit?

    Ontvang persoonlijke hulp van onze supporters

    Neem contact op