Available in: Ultimate/EE
Included in extensions: Advanced Storage
The module lifecycle stage: Experimental
The module has requirements for installation
Before enabling the module, you need to allow the use of experimental modules in the deckhouse ModuleConfig. To do this, set the allowExperimentalModules parameter to true.
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), in its own namespace.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 a re-create of the cluster’s namespace.
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.
- One Ceph cluster per namespace:
ElasticClusterandElasticStorageClassare namespaced, at most one cluster is allowed in a namespace, and the Rook resources of a cluster are deployed into that same namespace — which the controller furnishes with the ServiceAccounts, Roles, RoleBindings and registry credentials the daemons need, labels so the Pod Security Standards admit them, and hands back unchanged when the cluster is deleted. - 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
- At most one
ElasticClusterper namespace: a second one is rejected on creation. Run several Ceph clusters in several namespaces. - 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 are rejected by a validating webhook in every namespace. Make all changes 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 BlockDevice Ownership 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 samed8 k 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. See USAGE.md.