Kokil Thapa - Professional Web Developer in Nepal
Freelancer Web Developer in Nepal with 15+ Years of Experience

Kokil Thapa is an experienced full-stack web developer focused on building fast, secure, and scalable web applications. He helps businesses and individuals create SEO-friendly, user-focused digital platforms designed for long-term growth.

Rook: Ceph on Kubernetes

By Kokil Thapa | Last reviewed: September 2026

Rook: Ceph on Kubernetes is how teams run production-grade distributed storage inside the cluster instead of renting separate SAN arrays or cloud disks. You get block volumes for databases, a shared filesystem for legacy apps, and S3-compatible object storage from one control plane. That matters on bare-metal clusters, private clouds, and budget-conscious setups where managed EBS-style volumes are unavailable or expensive. This guide walks through architecture, install steps, StorageClasses, and the production checks I use before trusting Ceph with stateful workloads. If you are new to the storage layer itself, start with our Ceph storage fundamentals overview and the Kubernetes persistent volumes guide.

What is Rook: Ceph on Kubernetes and how does it work?

Rook is a Kubernetes operator. It watches custom resources and reconciles a full Ceph cluster on your worker nodes. Ceph handles data placement, replication, and recovery. Kubernetes handles scheduling, networking, and the volume API your apps already use.

The split is clean. Rook owns lifecycle: bootstrap, upgrades, expansion, and health checks. Ceph owns bytes on disk: erasure coding, CRUSH maps, and self-healing when a drive or node fails. Your application still requests a PersistentVolumeClaim. The Ceph CSI plugin provisions a RBD image or CephFS export behind the scenes.

Rook: Ceph on Kubernetes — Core ArchitectureKubernetes APIPVC, StorageClassRook OperatorCephCluster CRDCeph CSIRBD and CephFSMONQuorum mapsOSDData on disksMGRMetrics dashWorker nodes with raw disks or partitionsThree or more nodes recommended for production replication
Rook: Ceph on Kubernetes — operator reconciles Ceph daemons while CSI connects PVCs to RBD or CephFS backends.

Three Ceph daemons matter day to day. Monitors (MON) hold the cluster map and require an odd count—usually three—for quorum. OSDs store objects on raw devices you assign through Rook. Managers (MGR) expose metrics and the dashboard. RGW adds S3-compatible object storage when you enable it in the CephCluster spec.

On production Linux cluster administration engagements, I treat Rook like any other stateful platform service. Backups, monitoring, and upgrade windows are planned before the first PVC lands on Ceph block storage.

How do you install Rook and deploy a Ceph cluster on Kubernetes?

Start with a Kubernetes cluster that meets Rook’s baseline: a supported version, working CoreDNS, and nodes that can reach each other on pod networks. Rook publishes compatibility matrices on its documentation site—verify your control plane before you install.

Prepare nodes and disks

Ceph wants dedicated disks, not the OS root volume. Attach raw block devices or empty partitions per node. Label nodes if you want storage-only workers:

kubectl label node worker-storage-1 rook-ceph-storage=enabled
kubectl label node worker-storage-2 rook-ceph-storage=enabled
kubectl label node worker-storage-3 rook-ceph-storage=enabled

Verify devices are visible inside the node. Wipe prior filesystem signatures if these disks were reused:

lsblk -f
sudo wipefs -a /dev/sdb

Install the Rook operator

Apply the upstream manifests from the Rook release you pin—do not track master in production:

git clone --depth 1 --branch v1.15.0 https://github.com/rook/rook.git
cd rook/deploy/examples
kubectl create -f crds.yaml -f common.yaml -f operator.yaml

Wait until the operator pod is running in rook-ceph:

kubectl -n rook-ceph get pods -l app=rook-ceph-operator

Create the CephCluster custom resource

Edit cluster.yaml to match your environment. A minimal production-oriented fragment:

apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  cephVersion:
    image: quay.io/ceph/ceph:v19.2.0
  dataDirHostPath: /var/lib/rook
  mon:
    count: 3
    allowMultiplePerNode: false
  storage:
    useAllNodes: false
    useAllDevices: false
    nodes:
      - name: worker-storage-1
        devices:
          - name: sdb
      - name: worker-storage-2
        devices:
          - name: sdb
      - name: worker-storage-3
        devices:
          - name: sdb
  dashboard:
    enabled: true
  network:
    provider: host

Apply the cluster and toolbox manifests:

kubectl create -f cluster.yaml
kubectl create -f toolbox.yaml

Watch bootstrap progress. First install can take ten to twenty minutes while monitors form and OSDs come up:

kubectl -n rook-ceph get cephcluster
kubectl -n rook-ceph get pods
Rook Ceph Install Pipeline1. CRDscommon.yaml2. OperatorWatches CRs3. ClusterMON OSD MGR4. CSIDrivers up5. SCPVCPost-install validation checklist• ceph -s reports HEALTH_OK• OSD count matches raw disk count• Test PVC binds and writes data• CSI pods running in rook-ceph• Monitor quorum on three nodes• Dashboard or Prometheus metrics
Install sequence for Rook: Ceph on Kubernetes — pin a release tag, bootstrap the cluster, then validate before production PVCs.

Clusters built with Kubespray on bare metal are a common home for Rook. You already own the nodes and disks. Rook fills the storage gap that cloud CSI drivers cannot.

When should you choose Rook Ceph instead of other Kubernetes storage?

Not every cluster needs Ceph. The operator adds operational surface area. You are running distributed storage software on the same nodes that run apps. That trade-off is worth it when requirements exceed what NFS or local volumes provide.

Storage Backend Decision TreeNeed HA block on bare metal?YesNoRook + CephReplication and snapshotsManaged cloud?EBS, PD, Azure DiskUse cloud CSIVendor driver plus SCNeed shared file?CephFS or NFS layerSmall single-node lab: consider Longhorn or OpenEBS instead
Choose Rook: Ceph on Kubernetes when you need replicated block storage on infrastructure you control—not when a cloud CSI already meets SLA needs.
OptionBest fitReplicationOps burdenObject storage
Rook + CephBare metal, private cloud, multi-tenant block/file/objectYes, configurable poolsHigh — plan capacity and upgradesNative via RGW
LonghornSmall clusters, quick block volumesYes, per-volume replicasMediumNo
OpenEBSDev/test, engine-specific needsDepends on engineLow to mediumNo
Cloud CSI (EBS, etc.)Managed Kubernetes on AWS/GCP/AzureVendor-managedLowSeparate object service
NFSShared read-heavy files, legacy appsDepends on NASMediumNo

For a multi-service platform like a directory platform with uploads and search, object storage through Ceph RGW can replace a separate MinIO deployment. That reduces moving parts when your team already runs Rook for databases.

How do you expose Ceph storage to applications with StorageClasses and CSI?

After the cluster reaches HEALTH_OK, create StorageClasses for block and file workloads. Rook ships example manifests for RBD block volumes and CephFS shared volumes.

Block storage with RBD

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
  clusterID: rook-ceph
  pool: replicapool
  imageFormat: "2"
  imageFeatures: layering
  csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
  csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
  csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
  csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
  csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
  csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
allowVolumeExpansion: true
reclaimPolicy: Delete

Test with a simple PVC and pod before you migrate production databases:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ceph-test-pvc
spec:
  accessModes: [ReadWriteOnce]
  storageClassName: rook-ceph-block
  resources:
    requests:
      storage: 5Gi

Understand the persistent volume lifecycle before setting reclaimPolicy. Delete removes the RBD image when the PVC disappears. Production databases often need retain policies plus manual cleanup procedures.

Filesystem and object storage

CephFS suits multiple pods that must read/write the same path. Enable a CephFilesystem CR, then provision a CephFS StorageClass. For S3-compatible buckets, use ObjectBucketClaim resources against an RGW endpoint—useful for attachment stores and backup targets.

Snapshot workflows integrate with the Kubernetes volume snapshots API when you install the snapshot controller and define a VolumeSnapshotClass pointing at the Ceph pool. Test restore into a new namespace before you rely on snapshots for disaster recovery.

What production practices keep Rook Ceph healthy on Kubernetes?

Ceph failures are rarely sudden. They announce themselves as slow requests, degraded pools, or near-full OSDs. Operational discipline matters more than exotic tuning.

Capacity and placement

Run at least three storage nodes for replica-size-three pools. Never fill OSDs past seventy-five percent—backfill and recovery need headroom. Set Ceph’s full ratios in the cluster spec or via the toolbox:

kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph osd set-full-ratio 0.85
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph osd set-backfillfull-ratio 0.80

Spread monitors across failure domains. On bare metal, that means different racks or power circuits when possible. Combine with topology spread constraints for app pods—not only for Ceph daemons.

Monitoring, backups, and upgrades

Scrape Ceph metrics through the MGR Prometheus module or the Rook dashboard. Alert on HEALTH_WARN, OSD down counts, and pool near-full conditions before apps time out. Pair metrics with Kubernetes troubleshooting workflows so on-call engineers know whether the app or the volume layer failed first.

Production Rook Ceph TopologyNode AMON + OSD + appsNode BMON + OSD + appsNode CMON + OSD + appsReplicated pool — size 3, min size 2Survives one full node loss without data lossVelero backupsApp plus PVC snapshotsPrometheusCeph health alertsGitOps pinVersioned manifests
Production layout for Rook: Ceph on Kubernetes — three-way replication, monitored pools, Velero backups, and pinned GitOps manifests.

Application backups through Velero protect Kubernetes objects and PVC snapshots. They do not replace Ceph-level disaster planning. Export critical pool configuration and practice full cluster rebuild from scratch at least once.

Upgrade Rook during a maintenance window. Bump the operator manifest first, then the CephCluster cephVersion image. Read the release notes on the official Rook documentation before skipping minor versions. Ceph upgrades can trigger data rebalancing—watch latency on production databases during the process.

Lock down the Rook namespace with Kubernetes RBAC. Only platform admins should create or edit CephCluster resources. A mistaken edit can wipe OSD directories or resize pools incorrectly.

Manage manifests through Argo CD GitOps so every change is reviewed. Store cluster specs in Git, pin image tags, and avoid hand-editing live resources. When debugging CRD payloads, paste YAML into the JSON and YAML formatter to catch indentation errors before apply.

Common failure modes

  1. OSD pods pending: Usually missing raw devices, wrong deviceFilter, or insufficient memory. Confirm lsblk output matches the CephCluster node list.
  2. MON quorum loss: Often network partitions or scheduling two monitors on one failed node. Enforce anti-affinity and keep monitor count odd.
  3. Slow PVC provisioning: Check CSI driver logs, pool fullness, and whether secrets in rook-ceph match the StorageClass references.
  4. Clock skew: Ceph is sensitive to time drift. Run NTP on every storage node.
  5. Bluestore on SSD vs HDD: Mixing tiers without separate pools causes latency spikes. Separate pools and StorageClasses per media type.

Teams building enterprise applications often ask whether Kubernetes belongs in their stack at all. When the answer is yes and workloads are stateful, Rook Ceph becomes the storage foundation that keeps PostgreSQL, Redis persistence, and file imports on-platform rather than on ad-hoc NFS mounts.

Performance tuning overlaps with general Kubernetes performance work: right-size CPU requests for OSD pods, isolate noisy neighbors with taints on storage nodes, and keep etcd on fast disks separate from Ceph data devices. The Ceph documentation remains the authoritative reference for pool parameters, crush rules, and erasure-coded pools when cost efficiency beats replica-three defaults.

For hosting decisions—whether your cluster lives on owned hardware or a provider—see domain and hosting planning alongside long-term support and maintenance contracts. Ceph on three nodes still needs spare drives, monitoring, and someone who responds when a pool enters HEALTH_WARN at midnight.

The Kubernetes storage model itself is documented in the PersistentVolumes concept guide. Rook simply automates what used to require hand-built Ceph Ansible playbooks outside the cluster.

Key Takeaways

  • Deploy Rook: Ceph on Kubernetes when you need replicated block, file, and object storage on bare metal or private cloud—not when a cloud CSI already satisfies your SLA.
  • Pin Rook and Ceph image versions, dedicate raw disks per OSD node, and validate HEALTH_OK before any production PVC.
  • Create separate StorageClasses for RBD block and CephFS shared workloads; test snapshots and restore paths early.
  • Keep OSD utilization below seventy-five percent, run three monitors across failure domains, and alert on Ceph health—not only pod restarts.
  • Combine Velero application backups with documented Ceph disaster-recovery drills and GitOps-managed manifests.
  • Restrict CephCluster edits to platform admins via RBAC; mistaken CR changes can destroy data paths.

People Also Ask

Is Rook Ceph production-ready for Kubernetes?

Yes, for teams that can operate distributed storage. Thousands of clusters run Rook-managed Ceph in production. Success depends on adequate nodes, dedicated disks, monitoring, and upgrade discipline—not on treating Rook as a fire-and-forget add-on.

How many nodes do you need for Rook Ceph?

Plan three or more storage nodes for replica-size-three pools so you survive a single node loss. Lab installs can run reduced setups, but production databases should not rely on two-node compromises that sacrifice quorum or redundancy.

Can Rook Ceph replace cloud block storage?

On infrastructure you control, it often does. On managed Kubernetes where EBS-style volumes are cheap and integrated, cloud CSI is usually simpler. Rook wins when you need unified block, file, and object storage without per-gigabyte cloud fees.

What is the difference between Rook and Ceph?

Ceph is the distributed storage system. Rook is the Kubernetes operator that deploys and manages Ceph daemons using custom resources, CSI drivers, and automated reconciliation—so you do not maintain Ceph entirely outside the cluster lifecycle.

Deploy Rook Ceph with confidence

Rook: Ceph on Kubernetes turns your worker nodes into a unified storage platform for databases, shared files, and object buckets. Start small: one non-production cluster, pinned manifests, a tested PVC, and a snapshot restore drill. Scale out only after monitoring and backup paths are boringly reliable. If you want help designing a stateful platform—from cluster layout to GitOps and ongoing ops—contact us to talk through your storage requirements.

Frequently Asked Questions

Rook is a Kubernetes operator that runs Ceph inside the cluster, exposing block, file, and object storage through CSI drivers and standard PersistentVolumeClaims.

Start with a supported Kubernetes cluster, working CoreDNS, and reachable pod networks. Label storage nodes, attach raw block devices, and wipe prior filesystem signatures on reused disks. Pin a Rook release such as v1.15.0, apply crds.yaml, common.yaml, and operator.yaml, then create a CephCluster custom resource specifying cephVersion, three monitors, and per-node device names. Apply cluster.yaml and toolbox.yaml, then watch bootstrap for ten to twenty minutes until the cluster reports HEALTH_OK. Confirm the operator pod is running in rook-ceph before attaching production workloads.

Choose Rook plus Ceph on bare metal, private cloud, or any setup where managed EBS-style volumes are unavailable or costly and you need replicated block, shared file, and native object storage together. Longhorn suits small clusters needing quick block volumes; OpenEBS fits dev or engine-specific cases; cloud CSI wins on managed Kubernetes with vendor SLAs; NFS works for read-heavy shared files. Rook adds high operational burden because you plan capacity and upgrades yourself, but it can replace a separate MinIO deployment when Ceph RGW already runs in-cluster.

Plan at least three storage nodes for replica-size-three pools so one node can fail without losing quorum. Lab setups can be smaller; production databases should not rely on two-node compromises.

Ceph is the distributed storage engine handling data placement, replication, erasure coding, CRUSH maps, and self-healing when drives fail. Rook is the Kubernetes operator that watches custom resources and reconciles Ceph daemons—monitors, OSDs, managers, optional RGW—as native cluster workloads. Rook owns bootstrap, upgrades, expansion, and health checks; Ceph owns bytes on disk. Your applications still request PersistentVolumeClaims while the Ceph CSI plugin provisions RBD images or CephFS exports behind the scenes.

Yes, for teams that can operate distributed storage. Success depends on dedicated disks, monitoring, and upgrade discipline—not treating Rook as fire-and-forget.

After the cluster reaches HEALTH_OK, create StorageClasses backed by rook-ceph.rbd.csi.ceph.com for block volumes or CephFS classes for shared file access. Reference the clusterID, pool name, and Rook CSI secrets in parameters, enable allowVolumeExpansion, and set reclaimPolicy deliberately—Delete removes RBD images when PVCs disappear, while production databases often need Retain plus manual cleanup. Test with a small PVC and pod first. For S3 buckets, use ObjectBucketClaim against an RGW endpoint. Install the volume snapshot controller and test restore into a new namespace before relying on snapshots for disaster recovery.

On infrastructure you control—bare-metal clusters built with Kubespray or private clouds—it often replaces separate SAN arrays or per-gigabyte cloud disks, delivering unified block, file, and object from one platform. On managed Kubernetes where EBS-style volumes are cheap, integrated, and vendor-operated, cloud CSI is usually simpler and lower burden. Rook wins when cloud CSI cannot meet your SLA or when object storage through Ceph RGW should replace a standalone MinIO deployment alongside database volumes.

Run at least three storage nodes and keep OSD utilization below seventy-five percent so backfill and recovery have headroom; set full-ratio and backfillfull-ratio via the toolbox. Spread monitors across failure domains such as different racks or power circuits, scrape MGR Prometheus metrics, and alert on HEALTH_WARN and near-full pools before apps time out. Pair Ceph alerts with Kubernetes troubleshooting so on-call knows whether the app or volume layer failed. Upgrade during maintenance windows, bump operator manifests before cephVersion images, and manage specs through Argo CD GitOps with pinned tags.

Monitors hold the cluster map and require an odd count—usually three—for quorum. OSDs store objects on raw devices assigned through the CephCluster spec. Managers expose metrics and the dashboard when enabled. RGW adds S3-compatible object storage when configured in the cluster spec. Rook reconciles all of these as pods on worker nodes while CSI drivers connect PersistentVolumeClaims to RBD block images or CephFS exports for your applications.

Pending OSD pods usually mean missing raw devices, a deviceFilter that does not match actual hardware, or insufficient memory on the node. Confirm lsblk output inside each worker matches the device names listed under the CephCluster storage nodes section. Ceph expects dedicated disks—not the OS root volume—and prior filesystem signatures on reused drives can block clean OSD creation until you wipe them.

Application backups through Velero protect Kubernetes objects and PVC snapshots, but they do not replace Ceph-level disaster planning. Export critical pool configuration, test snapshot restore into a new namespace before trusting snapshots for disaster recovery, and practice a full cluster rebuild from scratch at least once. On production Linux cluster administration engagements, plan backups and monitoring before the first production PVC lands on Ceph block storage.

Schedule upgrades during a maintenance window. Bump the operator manifest first, then update the CephCluster cephVersion image—read official Rook release notes before skipping minor versions. Ceph upgrades can trigger data rebalancing, so watch database latency during the process. Store cluster specs in Git, pin image tags, and avoid hand-editing live CephCluster resources that could resize pools incorrectly or wipe OSD directories.

Lock down the rook-ceph namespace with Kubernetes RBAC so only platform admins can create or edit CephCluster resources—a mistaken edit can destroy data paths. Manage manifests through Argo CD GitOps so every change is reviewed, pin image tags, and validate YAML before apply. Restrict who can modify pool configuration and storage node assignments, treating Rook like any other stateful platform service with planned upgrade windows.

Slow provisioning often traces to CSI driver errors, pools nearing capacity, or mismatched secrets in rook-ceph that do not align with StorageClass references for provisioner, expand, or node-stage operations. Check pool fullness and OSD health via the toolbox, confirm HEALTH_OK on the cluster, and review Ceph CSI logs alongside Kubernetes events on the PersistentVolumeClaim before blaming the application layer.

Share this article

0 Comments

Leave a comment

Your email is not published. Comments appear once they have been read. Sign in to have your details filled in.

Quick Contact Options
Choose how you want to connect me: