The module lifecycle stage: Experimental
The module has requirements for installation
The module is configured through ModuleConfig. The contract contains
platform-level settings: logging level, object storage, delivery mode, and
distribution mode. Model lists, upstreams, and user catalog imports are not
stored in ModuleConfig.
Minimal Configuration
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: ai-models
spec:
enabled: true
version: 1
settings:
artifacts:
bucket: ai-models
endpoint: https://s3.example.com
region: us-east-1
credentialsSecretName: ai-models-artifacts
usePathStyle: trueObject Storage and DMCR
artifacts configures S3-compatible object storage for DMCR data, upload
staging, and module byte-path data. Every model goes through this
controller-owned preparation path regardless of source: URL, upload, or
catalog import.
DMCR (Deckhouse Model Container Registry) is the module’s internal OCI
registry. It stores prepared models as internal OCI artifacts on top of the
bucket configured in artifacts.
Credentials are provided through a Secret in d8-system:
apiVersion: v1
kind: Secret
metadata:
name: ai-models-artifacts
namespace: d8-system
type: Opaque
stringData:
accessKey: "<access-key>"
secretKey: "<secret-key>"For a custom CA, set artifacts.caSecretName or add ca.crt to the same
Secret.
Delivery
delivery.type selects how models in the Ready phase are mounted into
workloads:
SharedPVC— the default value. Requires aStorageClasssuitable for RWX PVCs.NodeCache— node-local cache backed by SDS and a CSI mount.
Delivery parameters are flat fields inside delivery, so the UI has one
selector and only the relevant settings for the selected mode.
Distribution
Distribution is enabled through distribution.mode=PublicCatalog. It prepares
the public catalog/import surface on the module public host from global
Deckhouse settings.
spec:
settings:
distribution:
mode: PublicCatalogThe host is not configured locally. It is always derived from
global.modules.publicDomainTemplate as the module public host.
When PublicCatalog is enabled, two routes are published:
/api/distribution/v1/models— the semantic catalog ofClusterModelobjects in theReadyphase;/v2— the OCI byte path for controller-owned copy/import workflows.
This is separate from delivery. Workload delivery inside the consuming cluster
remains SharedPVC or NodeCache; catalog ownership remains in the publishing
cluster.
Production public catalog access is configured with Kubernetes RBAC in the
publishing cluster, not in ModuleConfig. Bind the consuming subject to
ClusterRole d8:ai-models:distribution:reader. External catalogs on a
consuming cluster are described with ModelCatalogSource. This keeps adding
or removing hundreds of ClusterModel objects out of module configuration.
Catalog credentials and custom CA for imported sources are also not stored in
ModuleConfig. Put them into d8-system Secrets and reference them from
ModelCatalogSource.
Requirements
To the Kubernetes version: 1.34 and above.
To the Deckhouse version: 1.75.0 and above.
Parameters
Schema version: 1
-
-
objectsettings.artifactsS3-compatible storage for upload staging, the publication store, and module byte-path data. Internal object prefixes are module-owned.
-
stringsettings.artifacts.bucket
Required value
Bucket name for upload staging and published model artifacts.Default:
‘’ -
stringsettings.artifacts.caSecretNameOptional existing Secret in
d8-systemwith keyca.crtused to trust a custom CA for the S3-compatible endpoint. When empty, the module usescredentialsSecretNameas the CA source if that Secret containsca.crt.Default:
‘’ -
stringsettings.artifacts.capacityLimitOptional total capacity budget for module-owned artifacts, for example
500Gi. When set, upload sessions must declare payload size and the upload gateway reserves capacity before staging. Empty value disables admission enforcement and reports capacity as unknown.Default:
‘’ -
stringsettings.artifacts.credentialsSecretName
Required value
Existing Secret ind8-systemwithaccessKeyandsecretKey. The Secret may also containca.crtwhen the same Secret is used as the custom S3 trust source. The module synchronizes the required data into its service namespace after the Helm-owned namespace exists. This Secret is required; inline credentials are not supported.Default:
‘’ -
stringsettings.artifacts.endpoint
Required value
S3-compatible endpoint URL.Default:
‘’ -
booleansettings.artifacts.insecureDisable TLS verification for S3-compatible endpoint access.
Default:
false -
stringsettings.artifacts.regionS3 region value used by the client.
Default:
us-east-1 -
booleansettings.artifacts.usePathStyleUse path-style S3 requests.
Default:
true
-
-
objectsettings.deliveryWorkload delivery backend. Exactly one backend is active:
SharedPVCfor controller-owned RWX PVC materialization, orNodeCachefor SDS-backed node-local cache and CSI delivery. Perimeter distribution is separate from workload delivery and is not an additionaldelivery.typevalue.-
objectsettings.delivery.nodeCacheBlockDeviceSelectorMatchLabels selector for BlockDevice resources used to build the managed cache volume group. Empty value means
ai.deckhouse.io/model-cache=true.Example:
ai.deckhouse.io/model-cache: 'true' -
objectsettings.delivery.nodeCacheNodeSelectorMatchLabels selector for nodes that should host managed node-local cache substrate. Empty value means
ai.deckhouse.io/model-cache=true.Example:
ai.deckhouse.io/model-cache: 'true' -
stringsettings.delivery.nodeCacheSizePer-node cache size for
NodeCache. The same value is used for managed local storage capacity and for the per-node shared cache PVC. Empty value means200Gi.Example:
nodeCacheSize: 200Gi -
stringStorageClass name for
SharedPVCdelivery. Empty value means Deckhouse global storage class settings first, then Kubernetes defaultStorageClass. The resolved class must exist and be unambiguous before workload delivery can create the shared ReadWriteMany PVC.Examples:
sharedPVCStorageClassName: rwx-storage-classsharedPVCStorageClassName: nfs-rwx -
stringsettings.delivery.type
Required value
Workload delivery backend.
SharedPVCis the default. It creates controller-owned RWX PVCs in workload namespaces. Emptydelivery.sharedPVCStorageClassNameresolves through Deckhouse global storage class settings (global.modules.storageClass, thenglobal.defaultClusterStorageClass) and then Kubernetes defaultStorageClass. If the resolved class is absent, workloads stay gated with reasonSharedPVCStorageClassMissing. If multiple Kubernetes defaultStorageClassobjects exist, workloads stay gated with reasonSharedPVCStorageClassAmbiguousuntil the module or Deckhouse global storage class selects one class explicitly. The storage provisioner is responsible for binding the resulting ReadWriteMany PVC; provisioner failures are visible in PVC events.NodeCachecreates managed SDS-backed node-local cache substrate and read-only CSI mounts.Default:
SharedPVCAllowed values:
SharedPVC,NodeCache
-
-
objectsettings.distributionDistribution mode for published model artifacts. This setting is independent from workload delivery:
delivery.typecontrols how workloads mount artifacts, whiledistribution.modecontrols whether the module exposes the publication byte path as a controller-owned distribution surface for downstream catalog/import topologies.-
stringsettings.distribution.mode
Required value
Distribution mode.
InternalOnlykeeps the publication registry available only inside the cluster.PublicCatalogexposes a public/v2transport endpoint on the module public host. Semantic catalog API andModelCatalogSourceimport are implemented in the controller/API slice; users do not configure model lists, registry paths, or custom hosts here.Default:
InternalOnlyAllowed values:
InternalOnly,PublicCatalog
-
-
stringsettings.logLevelLogging level for module runtime components.
Default:
InfoAllowed values:
Debug,Info,Warn,Error
-