| Interfaces | Block | Block, file, S3 object | Block | Block | Block |
| Where it runs | systemd hosts, Kubernetes, or both | Bare metal (cephadm) or Kubernetes (Rook) | Kubernetes only | Bare metal or Kubernetes | Kubernetes only |
| Data path | Client computes placement, talks to drives directly (ublk) | Client computes placement with CRUSH (librbd / krbd) | Per-volume engine fronting replicas | In-kernel replication of a whole device to N nodes | SPDK engine, NVMe-oF to the app node |
| One volume spreads over | Every drive in the pool | Every OSD in the pool | Its replica nodes' disks | Its replica nodes' disks | Its replica nodes' disks |
| Designed around | HDDs, with an optional SSD read cache | Any media, any scale | Simplicity on Kubernetes | Mature, local-read replication | NVMe at low latency |
| Host footprint | Small: no async runtime, 16 B per placement row | Larger: about 4 GiB memory target per OSD by default, plus MONs and MGRs | Moderate: engine and replica processes per volume | Small: kernel module plus controller | Dedicated polling cores and hugepages per engine |
| Smallest HA cluster | 2 storage nodes + storageless witness | 3 MONs recommended | 3 nodes recommended | 2 nodes + diskless tiebreaker | 3 nodes recommended |
| Maturity | Young: running in one lab, no outside production users yet | Very mature, huge production base | Mature; CNCF incubating project | Very mature; DRBD has run in production for two decades | Production releases; part of OpenEBS (CNCF Sandbox) |