The module lifecycle stage: Experimental
The module has requirements for installation
The module is in Experimental stage. The API, configuration, and custom resources may change without notice; do not use it for production workloads.
The sds-elastic module deploys and manages Rook Ceph in a Deckhouse Kubernetes Platform cluster, turning a set of nodes into a distributed Ceph-backed storage system. The module provisions block volumes (RBD) and shared filesystems (CephFS) backed by csi-ceph StorageClasses, without manual Rook deployment.
Management is split across three custom resources from the storage.deckhouse.io/v1alpha1 API group:
ElasticCluster(ec) — declares the desired Ceph cluster: which nodes participate (storage.nodeSelector), which BlockDevice CRs back the OSDs (storage.blockDeviceSelector) and, optionally, which CIDRs are used for the public and cluster networks. The controller bootstraps a RookCephCluster(mon/mgr/osd) from this declaration.ElasticStorageClass(esc) — declares a single Ceph pool plus the matching KubernetesStorageClass, provisioned through the csi-ceph module.spec.replication(AvailabilityWithoutConsistency/ConsistencyAndAvailability/HighRedundancy) maps to a production-tested pool layout. References its parentElasticClusterby name (spec.clusterRef).ElasticClusterCredential(ecc) — internal cluster-scoped backup of the Ceph cluster identity (FSID, mon-secret, admin-secret), populated by the controller from therook-ceph-monSecret. Operators do not manage this CR directly; it exists so the cluster identity survives ad8-sds-elasticnamespace re-create.
The module deploys the Rook Ceph operator, the rook-ceph-operator-config ConfigMap, the full set of Ceph CRDs and the three storage.deckhouse.io CRDs listed above.
Main Features
- Single-CR cluster bootstrap from an ElasticCluster selecting BlockDevice / Node CRs by labels.
- LVM-based OSD layout: per matched BlockDevice the controller provisions one LVMVolumeGroup, one LVMLogicalVolume, and one local
PersistentVolumebound to the helm-managedsds-elastic-osdStorageClass(provisionerkubernetes.io/no-provisioner,volumeBindingMode: WaitForFirstConsumer). Rook consumes those PVs as OSDs throughstorageClassDeviceSets. - Three replication strategies per ElasticStorageClass:
AvailabilityWithoutConsistency(2 replicas,min_size=1,requireSafeReplicaSize=false),ConsistencyAndAvailability(3 replicas,min_size=2, default), andHighRedundancy(4 replicas,min_size=2,requireSafeReplicaSize=true; tolerates two simultaneous host failures with continued I/O and one extra failure as a recovery margin; requires at least 5 storage nodes). TheErasureCodedCompactmode is temporarily disabled and cannot be selected. - RBD and CephFS pools per ElasticStorageClass — one ESC produces one Ceph pool plus one csi-ceph
CephStorageClassnamed after the ESC. - Automatic csi-ceph wiring: the controller maintains a single
CephClusterConnection(1:1 with the parent ElasticCluster) and oneCephStorageClassper ElasticStorageClass; the user does not edit these vendor CRs by hand. - Identity backup via ElasticClusterCredential: FSID and mon/admin secrets are mirrored from the
rook-ceph-monSecret so the cluster identity survives a namespace re-create.
System Requirements
- Deckhouse Kubernetes Platform of version
1.72or later with at least three nodes for Ceph daemons (mon,mgr,OSD). - Two non-overlapping IPv4 CIDRs reachable from every storage node:
-
one for the Ceph public network (client traffic)
-
and one for the cluster network (replication and heartbeat).
The same CIDR may be used for both if network separation is not needed;
spec.networkmay also be omitted, in which case Rook listens on every host IP of the storage nodes (host networking).
-
- The sds-node-configurator (≥ 0.6.8) module enabled. The module owns the
BlockDeviceandLVMVolumeGroupCRDs thatElasticClusterselects from and creates LVMVolumeGroups in. - The csi-ceph (≥ 0.5.26) module enabled. The module owns the
CephClusterConnectionandCephStorageClassCRDs the controller writes into. - The snapshot-controller module enabled for VolumeSnapshot support (optional).
Limitations
- One Ceph cluster per module instance. The controller always reconciles a single Rook
CephClusternamedceph-clusterin thed8-sds-elasticnamespace, regardless of how manyElasticClusterobjects are created. MultipleElasticClusterobjects compete for the same backend; create only one per cluster. - The vendored Rook operator registers its CRs under the renamed API group
internal.sdselastic.deckhouse.io(upstream usesceph.rook.io); this isolates sds-elastic from a user-installed Rook on the same cluster. - Direct edits of Rook (
internal.sdselastic.deckhouse.io) resources in thed8-sds-elasticnamespace are rejected by a validating webhook. All changes must go throughElasticCluster/ElasticStorageClass. - RGW and S3 buckets are not supported in this release. The Rook ObjectBucket (OBC) controller is disabled via
ROOK_DISABLE_OBJECT_BUCKET_CLAIM=true, and theobjectbucket.ioCRDs are not vendored. ElasticCluster.spec.networkis immutable after creation (enforced by CEL in the CRD and mirrored by the validating webhook); changing public/cluster CIDRs on a live cluster invalidates mon endpoints and host-network bindings, so a network change requires deleting and re-creating theElasticCluster.ElasticCluster.spec.storage.nodeSelectorandspec.storage.blockDeviceSelectorare editable after creation. The validating webhook rejects narrowing edits that would orphan an already-adoptedBlockDevice(the controller cannot safely release the LVG/LLV/PV plumbing without manual cleanup) and widening edits that would pull in aBlockDevicealready owned by anotherElasticCluster. See USAGE.md for the full ownership contract and the manual release procedure.ElasticStorageClass.spec.{clusterRef,type,replication}are immutable after creation (enforced by CEL and the validating webhook). Replacing a pool requires creating a newElasticStorageClasswith a different name.- The name
sds-elastic-osdis reserved for the helm-managed internalStorageClass;ElasticStorageClassresources with thismetadata.nameare rejected by the webhook. ErasureCodedCompactis temporarily disabled: it is omitted from thespec.replicationenum and rejected by the validating webhook, so it cannot be selected on anyElasticStorageClass.replication: HighRedundancyrequires at least 5 storage nodes (4 for the pool’s CRUSH placement atfailureDomain=hostand 5 to host a 5-mon quorum). The controller auto-promotes the underlyingCephClustertomon.count=5,mgr.count=3while at least one HighRedundancy ESC is present, and keeps the promotion sticky after the trigger ESC is removed (silently weakening fault tolerance on a live cluster is unsafe). Operators can force a recompute by clearingElasticCluster.status.cephTopologyvia the status subresource. The ESC validating webhook rejects CREATE of a HighRedundancy ESC when its parentElasticClusteris absent, when fewer than 5 nodes matchspec.storage.nodeSelector, or when the parent EC’s adoptedBlockDeviceresources span fewer than 4 distinct nodes — applying the EC and the HighRedundancy ESC in the samekubectl applyis therefore rejected, and the EC must be applied (and its OSD-host set populated) first.- Vendor Rook and Ceph CRDs are bundled with the module and are not user-configurable.
ElasticCluster/ElasticStorageClassteardown is finalizer-driven: deleting them removes the controller-managed RookCephCluster/CephClusterConnectionand the backing pools / filesystems plus their csi-cephCephStorageClasses. The per-device objects (LVMVolumeGroup/LVMLogicalVolume/ localPersistentVolume) and theBlockDeviceownership label are intentionally preserved and must be cleaned up manually; full OwnerReferences-driven GC of those is not yet wired (planned, B20 in the backlog). See USAGE.md.