Elk Kubernetes cluster heeft uiteindelijk persistent storage nodig. De vraag is: welke oplossing?

Voor self-hosted clusters zonder cloud provider storage classes domineren twee opties: Longhorn en Rook-Ceph. Beide zijn CNCF projecten. Beide bieden gerepliceerde block storage. Beide werken goed.

Maar ze zijn heel verschillend in filosofie, complexiteit en use cases. Ik heb beide in productie gedraaid. Laat me delen wat ik heb geleerd.

Het Fundamentele Verschil

Longhorn: Simpele gedistribueerde block storage gebouwd voor Kubernetes. Elk volume wordt gerepliceerd over nodes met standaard Linux storage primitieven.

Rook-Ceph: Kubernetes operator voor Ceph, een bewezen gedistribueerd storage systeem dat jaren ouder is dan Kubernetes. Brengt Ceph’s volledige feature set naar Kubernetes.

De trade-off:

  • Longhorn prioriteert simpelheid
  • Rook-Ceph prioriteert features en schaal

Longhorn: De Simpele Keuze

flowchart TD
    subgraph longhorn["Longhorn Architectuur"]
        subgraph node1["Node 1"]
            E1["Longhorn Engine"]
            R1["Replica"]
        end
        subgraph node2["Node 2"]
            E2["Longhorn Engine"]
            R2["Replica"]
        end
        subgraph node3["Node 3"]
            R3["Replica"]
        end
    end

    PV["PersistentVolume"] --> E1
    E1 --> R1
    E1 --> R2
    E1 --> R3

Hoe Longhorn Werkt

  1. Engine per volume: Elke PVC krijgt een dedicated Longhorn engine (draait als pod)
  2. Replica’s op nodes: Data gerepliceerd naar lokale disks van meerdere nodes
  3. Synchrone replicatie: Alle replica’s geschreven voor acknowledge
  4. iSCSI frontend: Engine stelt volume beschikbaar via iSCSI aan de workload

Longhorn Installeren

helm repo add longhorn https://charts.longhorn.io
helm repo update

helm install longhorn longhorn/longhorn \
  --namespace longhorn-system \
  --create-namespace

Basis configuratie:

# longhorn-values.yaml
defaultSettings:
  defaultReplicaCount: 3
  defaultDataPath: /var/lib/longhorn
  storageMinimalAvailablePercentage: 15
  defaultLonghornStaticStorageClass: longhorn

persistence:
  defaultClass: true
  defaultClassReplicaCount: 3

Longhorn Sterke Punten

Simpelheid: Installeer met Helm, krijg storage. Geen dedicated storage nodes, geen complexe configuratie.

UI: Ingebouwde web interface voor volume management, backup status, node health.

Backup: Native backup naar S3-compatible storage met incrementele snapshots.

Kubernetes-native: Vanaf het begin ontworpen voor Kubernetes. Geen legacy baggage.

Longhorn Beperkingen

Performance: Goed voor de meeste workloads, maar niet geoptimaliseerd voor extreme IOPS. Elk volume loopt door zijn eigen engine pod.

Schaal: Werkt goed tot ~100 nodes. Daarboven, overweeg alternatieven.

Storage efficiëntie: Elke replica is een volledige kopie. Geen erasure coding.

Rook-Ceph: De Feature-Rijke Keuze

flowchart TD
    subgraph rook["Rook-Ceph Architectuur"]
        subgraph mgmt["Management"]
            OP["Rook Operator"]
            MON["Ceph Monitors"]
            MGR["Ceph Manager"]
        end
        subgraph storage["Storage"]
            OSD1["OSD<br/>(disk 1)"]
            OSD2["OSD<br/>(disk 2)"]
            OSD3["OSD<br/>(disk 3)"]
            OSD4["OSD<br/>(disk 4)"]
        end
        subgraph access["Toegang"]
            RBD["RBD<br/>(Block)"]
            RGW["RGW<br/>(Object)"]
            CFS["CephFS<br/>(Filesystem)"]
        end
    end

    PV["PersistentVolume"] --> RBD
    RBD --> OSD1
    RBD --> OSD2

Hoe Rook-Ceph Werkt

  1. OSDs op disks: Elke disk wordt een Object Storage Daemon
  2. CRUSH algoritme: Data gedistribueerd over OSDs met placement rules
  3. Meerdere toegangsmethoden: Block (RBD), Object (S3-compatible), Filesystem (CephFS)
  4. Monitors voor consensus: Cluster state beheerd door monitor daemons

Rook-Ceph Installeren

helm repo add rook-release https://charts.rook.io/release
helm repo update

# Installeer Rook operator
helm install rook-ceph rook-release/rook-ceph \
  --namespace rook-ceph \
  --create-namespace

# Maak Ceph cluster
kubectl apply -f ceph-cluster.yaml

Cluster configuratie:

# ceph-cluster.yaml
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  cephVersion:
    image: quay.io/ceph/ceph:v18.2.0

  mon:
    count: 3
    allowMultiplePerNode: false

  mgr:
    count: 2

  storage:
    useAllNodes: true
    useAllDevices: false
    deviceFilter: "^sd[b-z]"  # Gebruik sdb, sdc, etc.

  resources:
    mon:
      requests:
        cpu: 500m
        memory: 1Gi
    osd:
      requests:
        cpu: 500m
        memory: 2Gi

Rook-Ceph Sterke Punten

Schaal: Handelt petabytes. Gebruikt door CERN, Bloomberg en andere enorme deployments.

Features: Block, object en filesystem storage. Erasure coding. Snapshots. Mirroring.

Performance tuning: Uitgebreide opties voor optimalisatie. Kan getuned worden voor specifieke workloads.

Storage efficiëntie: Erasure coding vermindert overhead (bijv. 1.5x in plaats van 3x voor replicatie).

Rook-Ceph Beperkingen

Complexiteit: Meer bewegende delen. Monitors, managers, OSDs hebben allemaal resources en aandacht nodig.

Resource overhead: Minimaal 3 monitors, 2 managers, plus OSDs. Significant geheugengebruik.

Leercurve: Ceph heeft decennia aan features en configuratieopties.

Dedicated storage nodes: Voor performance, vaak dedicated nodes nodig voor OSDs.

Vergelijking

AspectLonghornRook-Ceph
ComplexiteitLaagHoog
Setup tijd10 minuten30+ minuten
Resource overheadLaagHoog
Max schaal~100 nodes1000+ nodes
Storage typesAlleen blockBlock, Object, Filesystem
PerformanceGoedExcellent (na tuning)
Storage efficiëntie3x (replicatie)1.5x+ (erasure coding)
BackupIngebouwd S3Externe tools
UIExcellentCeph Dashboard
CommunityGroeiendMature

Wanneer Longhorn Kiezen

Kies Longhorn wanneer:

  1. Kleine tot medium clusters (onder 100 nodes)
  2. Simpelheid belangrijk is — Je wilt storage die “gewoon werkt”
  3. Beperkte ops capaciteit — Klein team, kan geen tijd besteden aan storage management
  4. Algemene workloads — Databases, stateful apps met moderate I/O
  5. Homelab of edge — Resource-beperkte omgevingen
# Typische Longhorn workload
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-data
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 100Gi

Wanneer Rook-Ceph Kiezen

Kies Rook-Ceph wanneer:

  1. Grote clusters (100+ nodes)
  2. Meerdere storage types nodig — Block EN object EN filesystem
  3. Performance kritiek — Moet tunen voor specifieke workloads
  4. Storage efficiëntie belangrijk — Erasure coding vermindert kosten
  5. Dedicated storage team — Mensen die Ceph kunnen leren en opereren
# Rook-Ceph met erasure coding
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
  name: replicated-pool
  namespace: rook-ceph
spec:
  failureDomain: host
  replicated:
    size: 3
---
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
  name: erasure-coded-pool
  namespace: rook-ceph
spec:
  failureDomain: host
  erasureCoded:
    dataChunks: 2
    codingChunks: 1

Performance Overwegingen

Longhorn Performance

# Tune replica count voor performance vs durability
defaultSettings:
  defaultReplicaCount: 2  # Sneller dan 3, minder durable

# Gebruik dedicated disk pad
defaultDataPath: /mnt/fast-ssd/longhorn

Longhorn is I/O bound door de engine pod. Voor high IOPS workloads kan het bottlenecken.

Rook-Ceph Performance

# Dedicated OSD nodes
spec:
  placement:
    osd:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
            - matchExpressions:
                - key: storage-node
                  operator: In
                  values:
                    - "true"

# NVMe optimalisatie
storage:
  config:
    osdsPerDevice: "1"
    storeType: bluestore

Ceph kan moderne NVMe drives satureren als correct geconfigureerd.

Backup Strategieën

Longhorn Backup

Ingebouwd, configureer S3 target:

defaultSettings:
  backupTarget: s3://longhorn-backups@us-east-1/
  backupTargetCredentialSecret: longhorn-s3-credentials

Schedule backups per volume:

apiVersion: longhorn.io/v1beta1
kind: RecurringJob
metadata:
  name: daily-backup
spec:
  cron: "0 2 * * *"
  task: backup
  groups:
    - default
  retain: 7

Rook-Ceph Backup

Gebruik Velero met Ceph CSI snapshots:

velero install \
  --provider aws \
  --plugins velero/velero-plugin-for-csi \
  --features=EnableCSI

Of native Ceph mirroring voor disaster recovery tussen clusters.

Mijn Setup

Ik draai Longhorn in mijn homelab:

# Mijn Longhorn configuratie
defaultSettings:
  defaultReplicaCount: 2  # 3 nodes, 2 replica's
  defaultDataPath: /mnt/storage/longhorn
  backupTarget: s3://backups@minio/longhorn/
  backupTargetCredentialSecret: minio-credentials
  storageMinimalAvailablePercentage: 20

persistence:
  defaultClass: true

Waarom Longhorn?

  • 3 nodes — Te klein voor Ceph overhead
  • Simpelheid — Ik wil niet om 2 uur ’s nachts Ceph debuggen
  • Backup integratie — S3 backups naar mijn MinIO
  • Resource efficiëntie — Elke MB telt op kleine nodes

Als ik 50+ nodes zou draaien of object storage nodig had, zou ik switchen naar Ceph.

Migratie Pad

Begin met Longhorn en groeiend? Je kunt migreren:

  1. Backup data van Longhorn volume
  2. Deploy Rook-Ceph ernaast
  3. Restore naar Ceph volumes
  4. Update workloads om nieuwe StorageClass te gebruiken
  5. Retire Longhorn zodra gemigreerd

Beide ondersteunen CSI, dus de interface naar workloads is identiek.

Waarom Dit Ertoe Doet

Storage is het moeilijkste deel van Kubernetes. Doe het verkeerd en je verliest data. Over-engineer het en je verspilt resources aan complexiteit die je niet nodig hebt.

De juiste keuze hangt af van je schaal:

  • Homelab/kleine clusters: Longhorn
  • Medium productie: Beide, gebaseerd op benodigde features
  • Grote schaal: Rook-Ceph

Beide zijn solide. Beide zullen je goed dienen. Het verschil is hoeveel complexiteit je bereid bent te beheren.


Simpele systemen falen op simpele manieren. Complexe systemen falen op complexe manieren. Kies de complexiteit die je aankunt.