Доступно в редакциях: EE
Стадия жизненного цикла модуля: Experimental
У модуля есть требования для установки
Модуль настраивается через ModuleConfig. Контракт содержит параметры
платформенного уровня: уровень логирования, объектное хранилище, способ
доставки и режим раздачи каталога. Списки моделей, внешние каталоги и
пользовательские импорты не хранятся в ModuleConfig.
Пример минимальной конфигурации
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: trueОбъектное хранилище и DMCR
artifacts задаёт S3-совместимое объектное хранилище для данных DMCR,
временных загрузок и служебных данных передачи. Все модели проходят через
управляемый контроллером путь подготовки независимо от источника: URL,
загрузка или импорт из внешнего каталога.
DMCR (Deckhouse Model Container Registry) — служебный OCI-реестр модуля. Он
хранит подготовленные модели как внутренние OCI-артефакты поверх bucket,
настроенного в artifacts.
Учётные данные задаются секретом в d8-system:
apiVersion: v1
kind: Secret
metadata:
name: ai-models-artifacts
namespace: d8-system
type: Opaque
stringData:
accessKey: "<access-key>"
secretKey: "<secret-key>"Для частного центра сертификации укажите artifacts.caSecretName или добавьте
ca.crt в тот же секрет.
Службы данных для внешнего каталога provider’а
Внешние каталоги provider’ов, например Hugging Face, могут содержать гораздо
больше записей, чем Kubernetes API должен хранить или отслеживать через watch.
Поэтому модуль хранит данные поиска и индекса внешнего provider’а вне etcd.
Только модель, которую пользователь или администратор явно импортировал,
становится локальным Model или ClusterModel.
Когда включён просмотр, поиск и импорт из внешнего каталога provider’а, модулю нужны две уже созданные службы данных:
- PostgreSQL-совместимая база данных для долговечного индекса внешнего каталога, состояния синхронизации, состояния миграций схемы и истории импортов.
- Valkey-совместимая служба для краткоживущего кэша поиска, счётчиков лимитов provider API, распределённых блокировок и временной координации.
ai-models не создаёт экземпляры PostgreSQL или Valkey. Администратор
передаёт модулю Secret с настройками подключения к уже существующим службам.
Эти службы можно создать через DKP managed-postgres и managed-valkey, через
корпоративный DBaaS или другим эксплуатационным процессом. DKP managed-модули
— удобный способ подготовить службы, но не архитектурная зависимость
ai-models.
Настройте модуль с именами существующих Secret:
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: ai-models
spec:
enabled: true
version: 1
settings:
externalCatalog:
enabled: true
dataServices:
postgresConnectionSecretName: ai-models-catalog-postgres
valkeyConnectionSecretName: ai-models-catalog-valkeyУказанные Secret должны находиться в d8-system. Если внешний каталог
включён, readiness check контроллера проверяет Secret и выполняет ограниченные
live probes перед тем, как считать службы данных внешнего каталога готовыми.
Рекомендуемая форма Secret:
apiVersion: v1
kind: Secret
metadata:
name: ai-models-catalog-postgres
namespace: d8-system
type: Opaque
stringData:
dsn: "postgres://ai_models:<password>@postgres.example.com:5432/ai_models_catalog?sslmode=require"
ca.crt: |-
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----apiVersion: v1
kind: Secret
metadata:
name: ai-models-catalog-valkey
namespace: d8-system
type: Opaque
stringData:
url: "rediss://:<password>@valkey.example.com:6379/0"
ca.crt: |-
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----ca.crt нужен только если служба использует частный центр сертификации.
Значения Secret, provider tokens и пароли базы данных нельзя копировать в
Model, ClusterModel, события, labels метрик или пользовательские status
messages.
Перед синхронизацией provider source задайте безопасные границы источника:
разрешённые организации, репозитории, коллекции или теги, максимальное число
индексируемых записей, лимиты размера metadata, интервал обновления и бюджет
обновления. Слишком широкий источник должен оставаться заблокированным с
понятной причиной, например SourcePolicyTooBroad, а не начинать безлимитное
сканирование provider’а.
Готовность внешнего каталога отделена от готовности модели. Текущий readiness check контроллера проверяет PostgreSQL connection/auth/database reachability через временную read/write-пробу, а Valkey — через PING, TTL read/write, lock и rate-limit key probes. Следующие source/status slices будут выводить отдельные причины для сбоев PostgreSQL, сбоев Valkey, лимитов provider API, невалидных Secret служб данных и нарушений source policy. Если PostgreSQL или Valkey недоступны, поиск и импорт из внешнего каталога должны оставаться недоступными или в ожидании; модуль не должен переходить к хранению записей внешнего provider’а в etcd или безлимитном in-memory индексе.
Пользовательский сценарий с внешним каталогом provider’а:
- Администратор настраивает подключения к службам данных и bounded provider source.
- Модуль проверяет готовность PostgreSQL, Valkey и provider/source.
- Пользователь ищет или просматривает записи внешнего provider’а.
- Пользователь явно импортирует одну запись.
- Только выбранная запись становится локальным
ModelилиClusterModelи дальше проходит обычный путь подготовки в DMCR.
Доставка
delivery.type выбирает способ доставки модели в рабочую нагрузку:
SharedPVC— значение по умолчанию. ТребуетStorageClass, подходящий для PVC с RWX.NodeCache— локальный кэш на узле поверх SDS и CSI-монтирования.
Параметры доставки являются плоскими полями внутри delivery, чтобы в UI был
один переключатель и только релевантные настройки выбранного режима.
Раздача каталога
Раздача каталога включается через distribution.mode=PublicCatalog. Модуль
готовит публичный каталог и путь копирования на публичном адресе модуля из
глобальных настроек Deckhouse.
spec:
settings:
distribution:
mode: PublicCatalogАдрес локально не настраивается. Он всегда строится из
global.modules.publicDomainTemplate как публичный адрес модуля.
При включении PublicCatalog публикуются два маршрута:
/api/distribution/v1/models— каталогClusterModelв фазеReady;/v2— OCI-путь для управляемого контроллером копирования и импорта.
Это отдельная ось конфигурации от доставки. Доставка внутри потребляющего
кластера остаётся SharedPVC или NodeCache; владение каталогом остаётся в
раздающем кластере.
Доступ к публичному каталогу задаётся не в ModuleConfig, а через Kubernetes
RBAC в раздающем кластере. Привяжите субъект потребителя к
ClusterRole d8:ai-models:distribution:reader. Внешние каталоги в
потребляющем кластере описываются отдельными ModelCatalogSource. Такой
контракт позволяет
добавлять или удалять сотни моделей через ClusterModel без изменения
конфигурации модуля.
Учётные данные и сертификаты для импортируемых источников тоже не хранятся в
ModuleConfig. Поместите их в секрет неймспейса d8-system и укажите
эти секреты в ModelCatalogSource.
Требования
К версии Kubernetes: 1.34 и выше.
К версии Deckhouse: 1.75.0 и выше.
Параметры
Версия схемы: 1
-
-
объектsettings.artifactsS3-совместимое хранилище для загружаемых файлов, подготовленных моделей в DMCR и служебных данных передачи. Внутренние префиксы объектов принадлежат модулю.
-
строкаsettings.artifacts.bucket
Обязательный параметр
Имя bucket для загружаемых файлов и подготовленных моделей.По умолчанию:
‘’ -
строкаsettings.artifacts.caSecretNameНеобязательный существующий Secret в
d8-systemс ключомca.crtдля доверия частному центру сертификации S3-совместимого хранилища. Если поле пустое, модуль используетcredentialsSecretNameкак источникca.crt, когда этот Secret содержит такой ключ.По умолчанию:
‘’ -
строкаsettings.artifacts.capacityLimitНеобязательный общий лимит места для данных моделей, которыми управляет модуль, например
500Gi. Если значение задано, сессии загрузки должны заранее сообщать размер передаваемых данных, а шлюз загрузки резервирует место перед записью. Пустое значение отключает проверку лимита при приёме загрузок и показывает доступное место как неизвестное.По умолчанию:
‘’ -
строкаsettings.artifacts.credentialsSecretName
Обязательный параметр
Существующий Secret вd8-systemс ключамиaccessKeyиsecretKey. Secret также может содержатьca.crt, если тот же Secret используется как источник доверенного сертификата для частного центра сертификации S3. Модуль синхронизирует нужные данные в своё служебное пространство имён после его создания. Учётные данные прямо в ModuleConfig не поддерживаются.По умолчанию:
‘’ -
строкаsettings.artifacts.endpoint
Обязательный параметр
Адрес S3-совместимого хранилища.По умолчанию:
‘’ -
булевыйsettings.artifacts.insecureОтключает проверку TLS при обращении к S3-совместимому хранилищу.
По умолчанию:
false -
строкаsettings.artifacts.regionРегион S3, который использует клиент.
По умолчанию:
us-east-1 -
булевыйsettings.artifacts.usePathStyleИспользовать path-style запросы S3.
По умолчанию:
true
-
-
объектsettings.deliveryСпособ доставки модели в рабочие нагрузки. Активен ровно один вариант:
SharedPVCдля управляемого контроллером RWX PVC илиNodeCacheдля локального кэша на выбранных узлах и CSI-монтирования только для чтения. Раздача каталога между кластерами отделена от доставки в приложения и не является дополнительным значениемdelivery.type.-
целочисленныйsettings.delivery.maxConcurrentMaterializationsМаксимальное число одновременно выполняющихся Job-материализаторов
SharedPVCв пределах кластера. Каждый namespace-потребитель материализует модель в свой ReadWriteMany PVC, и эти материализации конкурируют за полосу чтения из реестра и записи в хранилище, поэтому пропускная способность насыщается уже при низкой конкурентности и деградирует выше неё. Консервативное значение снижает задержку материализации, чтобы поды не оставались вSchedulingGatedминутами; увеличивайте на кластерах с бо́льшим числом узлов или более быстрым хранилищем. Пустое значение означает2.Допустимые значения:
1 <= X <= 64Примеры:
maxConcurrentMaterializations: 2maxConcurrentMaterializations: 4 -
объектsettings.delivery.nodeCacheBlockDeviceSelectorСелектор
matchLabelsдля ресурсовBlockDevice, из которых строится группа томов локального кэша. Пустое значение означаетai.deckhouse.io/model-cache=true.Пример:
ai.deckhouse.io/model-cache: 'true' -
объектsettings.delivery.nodeCacheNodeSelectorСелектор
matchLabelsдля нод, где должен работать локальный кэш. Пустое значение означаетai.deckhouse.io/model-cache=true.Пример:
ai.deckhouse.io/model-cache: 'true' -
строкаsettings.delivery.nodeCacheSizeРазмер кэша на каждом выбранном узле для
NodeCache. То же значение используется для локального хранилища и PVC кэша на узле. Пустое значение означает200Gi.Пример:
nodeCacheSize: 200Gi -
строка
StorageClassдля режимаSharedPVC. Пустое значение означает: сначала глобальные настройки класса хранения Deckhouse, затем Kubernetes defaultStorageClass. Найденный класс должен существовать, быть выбран однозначно, поддерживать PVC сReadWriteManyи использоватьvolumeBindingMode: Immediate. Класс сWaitForFirstConsumerиспользовать нельзя: доставка ждёт привязки тома, прежде чем создать его потребителя, поэтому такой том не будет привязан никогда.Примеры:
sharedPVCStorageClassName: rwx-storage-classsharedPVCStorageClassName: nfs-rwx -
строкаsettings.delivery.type
Обязательный параметр
Способ доставки модели в рабочие нагрузки.
SharedPVCиспользуется по умолчанию. Он создаёт управляемый контроллером RWX PVC в пространстве имён рабочей нагрузки. Пустойdelivery.sharedPVCStorageClassNameвыбирается через глобальные настройки класса хранения Deckhouse (global.modules.storageClass, затемglobal.defaultClusterStorageClass) и затем defaultStorageClass. Найденный класс должен существовать, быть выбран однозначно и использоватьvolumeBindingMode: Immediate. Невыполненные требования модуль сообщает на уровне модуля сразу после старта, через метрикуd8_ai_models_storage_prerequisites_satisfiedи алертD8AIModelsStoragePrerequisitesNotSatisfied, не дожидаясь рабочей нагрузки; модуль при этом остаётся включённым, и его каталожные интерфейсы продолжают работать в деградированном режиме. По каждой рабочей нагрузке те же дефекты видны как причиныSharedPVCStorageClassMissingиSharedPVCStorageClassAmbiguous. Провайдер хранилища отвечает за создание итогового PVC с ReadWriteMany; сообщённая им ошибка показывается с причинойSharedPVCProvisioningFailed, а том, который так и не создан и о котором ничего не сообщено, получает причинуSharedPVCProvisioningTimedOutвместо бесконечного ожидания.NodeCacheсоздаёт локальный кэш на выбранных узлах поверх SDS и CSI-монтирования только для чтения.По умолчанию:
SharedPVCДопустимые значения:
SharedPVC,NodeCache
-
-
объектsettings.distributionРежим раздачи каталога подготовленных кластерных моделей. Эта настройка независима от доставки в рабочие нагрузки:
delivery.typeвыбирает, как приложения получают файлы модели внутри кластера, аdistribution.modeвыбирает, открыт ли защищённый публичный интерфейс для импорта моделей в другие кластеры.-
строкаsettings.distribution.mode
Обязательный параметр
Режим раздачи каталога.
InternalOnlyоставляет DMCR доступным только внутри кластера.PublicCatalogоткрывает защищённый/v2endpoint на публичном адресе модуля. Список моделей и импорт описываются черезModelCatalogSource; внутренние пути реестра, список моделей и отдельный host здесь не настраиваются.По умолчанию:
InternalOnlyДопустимые значения:
InternalOnly,PublicCatalog
-
-
объектsettings.externalCatalogНастройка просмотра, поиска и импорта из внешнего каталога provider’а. Эта настройка включает будущий путь индексации provider’ов, например Hugging Face. Записи внешнего provider’а хранятся вне Kubernetes etcd и становятся локальными
ModelилиClusterModelтолько после явного импорта. Службы PostgreSQL и Valkey должны уже существовать; модуль только читает Secret с настройками подключения и не создаёт базу данных или кэш.-
объектsettings.externalCatalog.dataServicesИмена Secret с подключениями к уже созданным службам данных внешнего каталога. PostgreSQL хранит долговечные данные индекса provider’а. Valkey хранит краткоживущий кэш, счётчики лимитов и блокировки. Модуль проверяет наличие Secret, форму строки подключения и ограниченные live probes перед тем, как считать внешний каталог готовым. PostgreSQL проверяется временной read/write-пробой. Valkey проверяется через PING, TTL read/write, lock и rate-limit key probes.
-
строкаsettings.externalCatalog.dataServices.postgresConnectionSecretNameИмя существующего Secret в
d8-systemс ключомdsn. Значение должно быть PostgreSQL DSN со схемойpostgres://илиpostgresql://и именем базы данных. Secret также может содержатьca.crtдля частного центра сертификации.По умолчанию:
‘’ -
строкаsettings.externalCatalog.dataServices.valkeyConnectionSecretNameИмя существующего Secret в
d8-systemс ключомurl. Значение должно быть Valkey-compatible URL со схемойredis://илиrediss://. Secret также может содержатьca.crtдля частного центра сертификации.По умолчанию:
‘’
-
-
булевыйsettings.externalCatalog.enabledВключает проверки готовности служб данных внешнего каталога provider’а. Если значение
true, поляdataServices.postgresConnectionSecretNameиdataServices.valkeyConnectionSecretNameобязательны и должны указывать на существующие Secret вd8-system.По умолчанию:
false
-
-
строкаsettings.logLevelУровень логирования служебных компонентов модуля.
По умолчанию:
InfoДопустимые значения:
Debug,Info,Warn,Error
-