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
- Engine per volume: Elke PVC krijgt een dedicated Longhorn engine (draait als pod)
- Replica’s op nodes: Data gerepliceerd naar lokale disks van meerdere nodes
- Synchrone replicatie: Alle replica’s geschreven voor acknowledge
- 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
- OSDs op disks: Elke disk wordt een Object Storage Daemon
- CRUSH algoritme: Data gedistribueerd over OSDs met placement rules
- Meerdere toegangsmethoden: Block (RBD), Object (S3-compatible), Filesystem (CephFS)
- 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
| Aspect | Longhorn | Rook-Ceph |
|---|---|---|
| Complexiteit | Laag | Hoog |
| Setup tijd | 10 minuten | 30+ minuten |
| Resource overhead | Laag | Hoog |
| Max schaal | ~100 nodes | 1000+ nodes |
| Storage types | Alleen block | Block, Object, Filesystem |
| Performance | Goed | Excellent (na tuning) |
| Storage efficiëntie | 3x (replicatie) | 1.5x+ (erasure coding) |
| Backup | Ingebouwd S3 | Externe tools |
| UI | Excellent | Ceph Dashboard |
| Community | Groeiend | Mature |
Wanneer Longhorn Kiezen
Kies Longhorn wanneer:
- Kleine tot medium clusters (onder 100 nodes)
- Simpelheid belangrijk is — Je wilt storage die “gewoon werkt”
- Beperkte ops capaciteit — Klein team, kan geen tijd besteden aan storage management
- Algemene workloads — Databases, stateful apps met moderate I/O
- 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:
- Grote clusters (100+ nodes)
- Meerdere storage types nodig — Block EN object EN filesystem
- Performance kritiek — Moet tunen voor specifieke workloads
- Storage efficiëntie belangrijk — Erasure coding vermindert kosten
- 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:
- Backup data van Longhorn volume
- Deploy Rook-Ceph ernaast
- Restore naar Ceph volumes
- Update workloads om nieuwe StorageClass te gebruiken
- 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.
