The module lifecycle stage: Experimental
The module has requirements for installation
The module is in the Experimental stage. The API, configuration, and custom resources may change without notice; do not use it for production workloads.
The sds-object module manages S3-compatible object storage in a Deckhouse Kubernetes Platform cluster. It follows a no-ops philosophy: you declare what you need with a small set of COSI-aligned custom resources, and the module deploys and operates the backend for you. Low-level backend tuning is not exposed.
Custom resources
| Resource | Scope | Purpose |
|---|---|---|
ObjectStore (ostore) |
Cluster | Provisions an object storage instance of one of four turnkey profiles (deploys the data plane; outside COSI). |
Bucket (bkt) |
Cluster | The backing bucket: either administrator-declared (Shared) or provisioned for a BucketClaim. |
BucketClaim (bc) |
Namespaced | The tenant request for a bucket: greenfield (provisions its own private bucket) or brownfield (binds a Shared bucket, gated by BucketClaimPolicy). |
BucketAccess (ba) |
Namespaced | Requests scoped credentials for a BucketClaim; writes a standard S3 credentials Secret next to your application. |
BucketClaimPolicy (bcp) |
Namespaced | Declares which namespaces may bind a Shared bucket via a brownfield BucketClaim (deny-by-default). Honored only in the bucket’s owner namespace. |
The model mirrors COSI (Bucket + BucketClaim) with two additions: ObjectStore deploys the storage itself, and BucketClaimPolicy governs cross-namespace sharing of Shared buckets. Credentials are issued per namespace via BucketAccess against a BucketClaim in the same namespace; each access gets its own access key, rotatable independently via the storage.deckhouse.io/rotate annotation.
Cluster profiles
A single spec.type selects the profile; the backend is chosen and operated for you.
spec.type |
Backend | Placement / data | Use case |
|---|---|---|---|
System |
Garage | StatefulSet on control-plane nodes (3 replicas, or a single one with systemBucket.singleReplica), node-sticky local PV |
Platform/system needs (backups, registry, logs). |
Lightweight |
Garage | StatefulSet, PVC on a StorageClass | Small application workloads. |
Full |
SeaweedFS | StatefulSet, PVC | Scalable, full-featured storage. |
Heavy |
Ceph RGW | RADOS Gateway on an existing sds-elastic cluster | Reuses Ceph capacity and fault tolerance. |
Implementation status: all four profiles are available. Full runs a distributed SeaweedFS (master/volume/filer + S3 gateway; replica counts and replication scale with redundancy). Filer metadata is kept in a shared PostgreSQL provisioned via the managed-postgres module, so the filer/S3 gateway runs with multiple replicas (HA). Heavy provisions a Ceph RGW on an existing sds-elastic cluster. Buckets work on all four profiles.
The Full profile therefore requires the managed-postgres module to be enabled.
How it works
- The controller reconciles each
ObjectStoreinto a backend data plane (workloads, services, configuration) and reports readiness, the S3 endpoint, and capacity instatus. - The controller reconciles each
Bucketinto a bucket on the referenced object store (no credentials). - The controller reconciles each
BucketClaim: a greenfield claim provisions its own privateBucket; a brownfield claim binds an existing SharedBucketonce aBucketClaimPolicyin that bucket’s owner namespace allows its namespace. - The controller reconciles each
BucketAccess— once itsBucketClaimis Bound — into a scoped access key, then writes aSecret(owned by the access) with the standard connection variables:S3_ENDPOINT,S3_REGION,S3_BUCKET,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY.
See Usage for a walkthrough.
Requirements
- The
Heavyprofile requires thesds-elasticmodule with a readyElasticCluster; it is consulted only forHeavyclusters. - The
System,Lightweight, andFullprofiles are self-contained (the backend images are shipped with the module).