The module lifecycle stage: Experimental
The module has requirements for installation
The Deckhouse Kubernetes Platform installs CRDs but does not remove them when a module is disabled. If you no longer need the created CRDs, delete them.
Bucket
Short names: bkt
Scope: Cluster
Version: v1alpha1
-
objectspecDesired state of the bucket.
-
stringspec.accessPolicy
Bucket access policy.
Private(default) — accessible only with issued credentials.PublicRead— objects are readable anonymously; writes still require credentials.
Default:
PrivateAllowed values:
Private,PublicRead -
stringspec.bucketNameName of the bucket in S3. Defaults to
metadata.namewhen omitted. Must follow S3 bucket naming rules. Immutable after creation.Length:
3..63Pattern:
^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$ -
objectspec.claimRef
Identifies the BucketClaim that provisioned and owns this bucket (greenfield). Administrator-declared Shared buckets leave it empty.
This is the authoritative owner record. Only the module’s own service account may set it (enforced by the admission webhook on create), and it is immutable afterwards, so a bucket cannot be re-pointed at another claim and no claim can take over a bucket that already belongs to a different one. The
storage.deckhouse.io/owned-by-claim-*labels mirror it for label queries but are user-settable and are never used for authorization.It also scopes sharing: BucketClaimPolicy resources for this bucket are honored only in this namespace (or in the module namespace when the field is empty).
-
stringspec.claimRef.name
Required value
Name of the owning BucketClaim.Length:
1..253 -
stringspec.claimRef.namespace
Required value
Namespace of the owning BucketClaim.Length:
1..253
-
-
stringspec.objectStoreRef
Required value
Name of the ObjectStore this bucket belongs to. The referenced ObjectStore must exist and be inReadyphase before the bucket is provisioned. Immutable after creation.Length:
1..30Pattern:
^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ -
objectspec.quotaOptional usage limits for the bucket. Enforcement depends on backend capabilities.
-
integerspec.quota.maxObjectsMaximum number of objects.
0(default) means no limit.Allowed values:
0 <= X -
stringspec.quota.maxSizeMaximum total size of the bucket as a Kubernetes Quantity (BinarySI), e.g.
10Gi. Omit for no size limit.Pattern:
^[0-9]+(\.[0-9]+)?(Ki|Mi|Gi|Ti|Pi|Ei|k|M|G|T|P|E)?$
-
-
stringspec.reclaimPolicy
What happens to bucket data when the Bucket is deleted.
Retain(default) — the bucket and its objects are kept in the backend.Delete— the bucket and all its objects are deleted.
Default:
RetainAllowed values:
Retain,Delete
-
-
objectstatusObserved state of the bucket.
-
stringstatus.bucketNameEffective bucket name created in the backend.
-
array of objectsstatus.conditionsPer-component conditions:
BucketReadyand the aggregateReady.-
stringstatus.conditions.lastTransitionTimeTimestamp of the last status transition for this condition.
-
stringstatus.conditions.messageHuman-readable explanation of the current status.
Maximum length:
32768 -
integerstatus.conditions.observedGenerationValue of
metadata.generationthe condition was last set against.Allowed values:
0 <= X -
stringstatus.conditions.reasonMachine-readable reason for the current status, suitable for log filtering.
Length:
1..1024Pattern:
^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ -
stringstatus.conditions.statusCurrent status of the condition.
Allowed values:
True,False,Unknown -
stringstatus.conditions.typeCondition type, for example
ReadyorBucketReady.Maximum length:
316Pattern:
^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
-
-
stringstatus.endpointIn-cluster S3 endpoint URL of the backing cluster.
-
integerstatus.observedGenerationMost recent
metadata.generationreconciled by the controller. -
stringstatus.phaseCoarse-grained summary derived from Conditions.
Allowed values:
Pending,InProgress,Ready,Error
-
BucketAccess
Short names: ba
Scope: Namespaced
Version: v1alpha1
BucketAccess requests scoped S3 access to a
cluster-scoped Bucket from a consuming namespace. The
controller mints a dedicated access key / secret key for this
access, writes a Secret in the same namespace (see
status.secretRef) with the standard S3 connection variables, and
revokes the key when the access is deleted.
Whether the access is provisioned is governed by
BucketClaimPolicy resources (deny-by-default): an access
whose namespace matches no policy for the referenced bucket stays
Pending.
Key rotation: set or change the annotation
storage.deckhouse.io/rotate to trigger issuance of a fresh key
pair (the Secret is updated and the previous key is revoked).
-
objectspecDesired state of the access.
-
stringspec.bucketClaimName
Required value
Name of the BucketClaim (in this access’s namespace) whose bound Bucket the credentials are scoped to. The claim must be Bound before credentials are issued. Immutable after creation.Length:
1..253Pattern:
^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ -
stringspec.credentialsSecretNameOverrides the name of the credentials Secret written in this access’s namespace. Defaults to
<metadata.name>-s3-credentials.Length:
1..253 -
stringspec.permission
Access level granted to the issued credentials.
ReadWrite(default) — read and write objects.ReadOnly— read objects only.
Default:
ReadWriteAllowed values:
ReadWrite,ReadOnly
-
-
objectstatusObserved state of the access.
-
stringstatus.accessKeyIDPublic access key id issued for this access (the secret key is only written into the credentials Secret).
-
stringstatus.bucketNameEffective bucket name the access is scoped to.
-
array of objectsstatus.conditionsPer-component conditions:
AccessGranted,CredentialsReady, and the aggregateReady.-
stringstatus.conditions.lastTransitionTimeTimestamp of the last status transition for this condition.
-
stringstatus.conditions.messageHuman-readable explanation of the current status.
Maximum length:
32768 -
integerstatus.conditions.observedGenerationValue of
metadata.generationthe condition was last set against.Allowed values:
0 <= X -
stringstatus.conditions.reasonMachine-readable reason for the current status, suitable for log filtering.
Length:
1..1024Pattern:
^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ -
stringstatus.conditions.statusCurrent status of the condition.
Allowed values:
True,False,Unknown -
stringstatus.conditions.typeCondition type, for example
Ready,AccessGranted, orCredentialsReady.Maximum length:
316Pattern:
^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
-
-
stringstatus.endpointIn-cluster S3 endpoint URL of the backing cluster.
-
stringstatus.lastRotationTimeTimestamp of the most recent key issuance.
-
integerstatus.observedGenerationMost recent
metadata.generationreconciled by the controller. -
stringstatus.observedRotationLast value of the
storage.deckhouse.io/rotateannotation processed by the controller. -
stringstatus.phaseCoarse-grained summary derived from Conditions.
Allowed values:
Pending,InProgress,Ready,Error -
objectstatus.secretRefReference to the Secret (in this access’s namespace) holding the S3 connection variables and credentials:
S3_ENDPOINT,S3_REGION,S3_BUCKET,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY.-
stringstatus.secretRef.name
-
-
BucketClaim
Short names: bc
Scope: Namespaced
Version: v1alpha1
BucketClaim is the namespaced request for a bucket.
- Greenfield (
spec.existingBucketNameempty): the controller provisions a new cluster-scoped Bucket owned by this claim and private to this namespace, inspec.objectStoreRef. - Brownfield (
spec.existingBucketNameset): the claim binds an existing Shared Bucket, allowed only when aBucketClaimPolicygrants this namespace (deny-by-default).
Credentials are requested separately with a BucketAccess that
references this claim by name in the same namespace.
-
objectspecDesired state of the claim.
-
stringspec.accessPolicy
Access policy for a greenfield bucket. Ignored for brownfield.
Private(default) — accessible only with issued credentials.PublicRead— objects are readable anonymously; writes still require credentials.
Default:
PrivateAllowed values:
Private,PublicRead -
stringspec.existingBucketNameName of an existing Shared (administrator-declared) Bucket to bind (brownfield). Allowed only when a
BucketClaimPolicygrants this claim’s namespace. Immutable after creation.Length:
3..63Pattern:
^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$ -
stringspec.objectStoreRefName of the ObjectStore in which a greenfield bucket is provisioned. Required for greenfield; ignored for brownfield. Immutable after creation.
Length:
1..30Pattern:
^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ -
objectspec.quotaOptional usage limits for a greenfield bucket. Enforcement depends on backend capabilities.
-
integerspec.quota.maxObjectsMaximum number of objects. 0 (default) means no limit.
Allowed values:
0 <= X -
stringspec.quota.maxSizeMaximum total size as a Kubernetes Quantity (BinarySI), e.g.
10Gi. Omit for no size limit.Pattern:
^[0-9]+(\.[0-9]+)?(Ki|Mi|Gi|Ti|Pi|Ei|k|M|G|T|P|E)?$
-
-
stringspec.reclaimPolicy
What happens to a greenfield bucket’s data when the claim (and its owned Bucket) is deleted. Ignored for brownfield.
Retain(default) — the bucket and its objects are kept.Delete— the bucket and all its objects are deleted.
Default:
RetainAllowed values:
Retain,Delete
-
-
objectstatusObserved state of the claim.
-
stringstatus.boundBucketNameName of the cluster-scoped Bucket this claim is bound to.
-
array of objectsstatus.conditionsPer-stage conditions:
Bound,BucketReady, and the aggregateReady.-
stringstatus.conditions.lastTransitionTimeTimestamp of the last status transition for this condition.
-
stringstatus.conditions.messageHuman-readable explanation of the current status.
Maximum length:
32768 -
integerstatus.conditions.observedGenerationValue of
metadata.generationthe condition was last set against.Allowed values:
0 <= X -
stringstatus.conditions.reasonMachine-readable reason for the current status, suitable for log filtering.
Length:
1..1024Pattern:
^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ -
stringstatus.conditions.statusCurrent status of the condition.
Allowed values:
True,False,Unknown -
stringstatus.conditions.typeCondition type, for example
Ready,Bound, orBucketReady.Maximum length:
316Pattern:
^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
-
-
stringstatus.endpointIn-cluster S3 endpoint URL of the backing ObjectStore.
-
integerstatus.observedGenerationMost recent
metadata.generationreconciled by the controller. -
stringstatus.phaseCoarse-grained summary derived from conditions.
Allowed values:
Pending,InProgress,Ready,Error
-
BucketClaimPolicy
Short names: bcp
Scope: Namespaced
Version: v1alpha1
BucketClaimPolicy declares which namespaces may bind a Shared cluster-scoped Bucket (via a brownfield BucketClaim) and, with it, obtain credentials via BucketAccess. Access is deny-by-default: it is only granted when at least one policy for the bucket matches the consuming namespace. Multiple policies for the same bucket are additive (their allowed sets are unioned).
The policy must live in the bucket’s OWNER namespace — the namespace
of the BucketClaim that provisioned the bucket
(Bucket.spec.claimRef.namespace), or the module namespace
(d8-sds-object) for administrator-declared Shared buckets. Sharing
is therefore granted by whoever owns the bucket. A policy created in
any other namespace grants nothing: the controller reports it with
phase Error and reason NotOwnerNamespace rather than applying it.
-
objectspecDesired policy.
-
objectspec.allowedNamespaces
Required value
Namespaces permitted to request access to the bucket. A namespace matches when it appears innamesor fully matches any RE2 regular expression inpatterns.-
array of stringsspec.allowedNamespaces.namesExact namespace names allowed.
-
stringspec.allowedNamespaces.names.Element of the array
Maximum length:
253
-
-
array of stringsspec.allowedNamespaces.patternsRE2 regular expressions matched (anchored, full-string) against the namespace name, e.g.
team-.*.-
stringspec.allowedNamespaces.patterns.Element of the array
Maximum length:
253
-
-
-
stringspec.bucketRef
Required value
Name of the cluster-scoped Bucket this policy governs. The policy is honored only when it lives in that bucket’s owner namespace. Immutable after creation.Length:
1..63Pattern:
^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
-
-
objectstatusObserved state of the policy.
-
array of objectsstatus.conditionsLatest state. Known type:
Ready.-
stringstatus.conditions.lastTransitionTimeTimestamp of the last status transition for this condition.
-
stringstatus.conditions.messageHuman-readable explanation of the current status.
Maximum length:
32768 -
integerstatus.conditions.observedGenerationValue of
metadata.generationthe condition was last set against.Allowed values:
0 <= X -
stringstatus.conditions.reasonMachine-readable reason for the current status, suitable for log filtering.
Length:
1..1024Pattern:
^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ -
stringstatus.conditions.statusCurrent status of the condition.
Allowed values:
True,False,Unknown -
stringstatus.conditions.typeCondition type, for example
Ready.Maximum length:
316Pattern:
^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
-
-
integerstatus.observedGenerationMost recent
metadata.generationreconciled by the controller. -
stringstatus.phaseCoarse-grained summary.
Readywhen the policy is valid and its bucket exists;Errorwhen a pattern fails to compile.Allowed values:
Pending,Ready,Error
-
ObjectStore
Short names: ostore
Scope: Cluster
Version: v1alpha1
ObjectStore describes the desired state of an S3-compatible
object storage cluster managed by the sds-object module. A single
spec.type selects one of four turnkey profiles; the backend
(Garage / SeaweedFS / Ceph RGW) and its low-level settings are hidden
from the user (noops).
Buckets are declared separately in cluster-scoped Bucket resources that reference this cluster by name; per-namespace credentials are requested via BucketAccess.
-
objectspecDesired state of the object storage cluster.
-
stringspec.elasticClusterRefName of the ElasticCluster (sds-elastic) the Ceph CephObjectStore is provisioned on. Required and only allowed when
spec.typeisHeavy. Immutable after creation.Maximum length:
30Pattern:
^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ -
objectspec.placementScheduling of the cluster data plane. For
type: Systemplacement is forced onto control-plane nodes and these fields are ignored.-
objectspec.placement.nodeSelectorNode labels the data-plane Pods must match (same semantics as a Pod’s
spec.nodeSelector). -
array of objectsspec.placement.tolerationsTolerations for the data-plane Pods (same shape as a Pod’s
spec.tolerations).-
stringspec.placement.tolerations.effect
Allowed values:
‘’,NoSchedule,PreferNoSchedule,NoExecute -
stringspec.placement.tolerations.key
-
stringspec.placement.tolerations.operator
Allowed values:
Exists,Equal -
integerspec.placement.tolerations.tolerationSeconds
-
stringspec.placement.tolerations.value
-
-
-
stringspec.reclaimPolicy
What happens to the backend data plane and its persisted data when the ObjectStore is deleted.
Retain(default) — persisted data is preserved. ForHeavythe Ceph RGW pools are kept (preservePoolsOnDelete: true), so no stored objects are lost; the CephObjectStore itself is still removed, because leaving it behind would keep the Ceph cluster in use and block the ElasticCluster from ever being deleted. For other profiles the PVCs/hostPath data are left in place.Delete— the backend data (PVCs, hostPath data, or Ceph RGW pools) is destroyed.
Immutable after creation.
Default:
RetainAllowed values:
Retain,Delete -
stringspec.redundancy
High-level fault-tolerance intent. The controller maps it to backend-specific settings (replication factor / erasure coding). When omitted, defaults to
Standard.None— no redundancy (single copy). Lowest overhead. Not accepted forHeavy: a Ceph RGW data pool below size 3 gives no usable redundancy.Standard— replicated copies across nodes/zones (typical default).High— maximum durability (extra replicas or erasure coding), requires more nodes.
Immutable after creation: changing the replication factor on a live cluster is not supported.
For
Systemthe only accepted value isNone, which runs a single Garage replica (factor 1) instead of the default 3, and it is the one case where the field may be changed afterwards: the module sets it fromsdsObject.systemBucket.singleReplica. Switching it RECREATES the system store — the data plane is torn down and rebuilt empty, so every stored object is lost (buckets are recreated and access keys re-issued automatically).Allowed values:
None,Standard,High -
objectspec.storageCapacity and backing storage. Ignored for
type: Heavy(capacity comes from the referenced Ceph cluster).-
stringspec.storage.className of the Kubernetes StorageClass used to provision PVCs. Required for
LightweightandFull; ignored forSystem(managed local StorageClass) andHeavy(Ceph).Length:
1..253 -
integerspec.storage.nodesNumber of data-plane nodes (StatefulSet replicas for
Lightweight, SeaweedFS volume servers forFull). When unset, the count is derived fromredundancy. Ignored forSystem(a fixed 3-replica set) andHeavy(topology comes from the referenced Ceph cluster).Allowed values:
1 <= X -
stringspec.storage.sizePerNodeUsable capacity provisioned per data-plane node as a Kubernetes Quantity (BinarySI), e.g.
50Gior2Ti. The cluster-wide capacity is roughlysizePerNodetimes the node count. Defaults to10Giwhen unset. Must not be set forSystem(local PVs on control-plane nodes).Pattern:
^[0-9]+(\.[0-9]+)?(Ki|Mi|Gi|Ti|Pi|Ei|k|M|G|T|P|E)?$
-
-
stringspec.type
Required value
Cluster profile. Selects the backend and placement model:
System— Garage, deployed as a StatefulSet on control-plane nodes with node-sticky local PVs: 3 replicas by default, or a single one withredundancy: None. The count is independent of the master count. For platform/system needs (backups, registry, logs).storage.classis ignored.Lightweight— Garage, deployed as a StatefulSet backed by PVCs onstorage.class. For small application workloads.Full— SeaweedFS (master/volume/filer + S3 gateway), backed by PVCs onstorage.class. Scalable, full-featured.Heavy— Ceph RADOS Gateway (CephObjectStore) on top of an existing sds-elastic cluster referenced byelasticClusterRef. Reuses Ceph capacity and HA.
Immutable after creation.
Allowed values:
System,Lightweight,Full,Heavy
-
-
objectstatusObserved state of the object storage cluster.
-
objectstatus.adminSecretRef
Reference to the Secret (in the module namespace) holding the backend admin credentials used by the controller to manage buckets and access keys.
Not published for
Heavy: its RGW credentials are owned by Rook and live in the sds-elastic namespace, not this module’s.-
stringstatus.adminSecretRef.name
-
-
objectstatus.backendResolved backend implementation behind
spec.type.-
stringstatus.backend.typeBackend implementing the selected profile.
Allowed values:
Garage,SeaweedFS,CephRGW -
stringstatus.backend.versionRunning backend version.
-
-
objectstatus.capacityCluster-wide storage usage reported by the backend.
-
stringstatus.capacity.availableFree capacity, Kubernetes Quantity (BinarySI).
-
stringstatus.capacity.lastUpdatedTimestamp of the latest capacity probe.
-
stringstatus.capacity.totalTotal usable capacity, Kubernetes Quantity (BinarySI).
-
stringstatus.capacity.usedConsumed capacity, Kubernetes Quantity (BinarySI).
-
stringstatus.capacity.usedPercent
used / total * 100, formatted with two decimals.
-
-
array of objectsstatus.conditionsPer-component conditions:
BackendReady,EndpointReady, and the aggregateReady.-
stringstatus.conditions.lastTransitionTimeTimestamp of the last status transition for this condition.
-
stringstatus.conditions.messageHuman-readable explanation of the current status.
Maximum length:
32768 -
integerstatus.conditions.observedGenerationValue of
metadata.generationthe condition was last set against.Allowed values:
0 <= X -
stringstatus.conditions.reasonMachine-readable reason for the current status, suitable for log filtering.
Length:
1..1024Pattern:
^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ -
stringstatus.conditions.statusCurrent status of the condition.
Allowed values:
True,False,Unknown -
stringstatus.conditions.typeCondition type, for example
Ready,BackendReady, orEndpointReady.Maximum length:
316Pattern:
^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
-
-
objectstatus.endpointS3 endpoint clients use to reach this cluster.
-
stringstatus.endpoint.internalIn-cluster S3 endpoint URL (Service DNS), e.g.
http://system.d8-sds-object.svc.cluster.local. -
stringstatus.endpoint.regionDefault S3 region advertised by the endpoint.
-
-
integerstatus.observedGenerationMost recent
metadata.generationreconciled by the controller. -
stringstatus.phaseCoarse-grained summary derived from Conditions.
Allowed values:
Pending,InProgress,Ready,Error
-