Nova AI. Установка
1. Пререквезиты
Перед установкой убедитесь, что выполнены условия:
-
У вас есть доступ к кластеру с учетной записью, имеющей роль
cluster-adminв Kubernetes. -
Вы установили утилиту
kubectlдля работы с Kubernetes. -
Если необходима установка ресурса MLCluster только на определнные ноды в платформе, то необходимо заранее поставить labels и tolerations в конфигурацию ноды до установки ресурса. В конфигурации самого ресурса задать поля
spec.nodeSelector(spec.<component>.nodeSelector) иspec.tolerations(spec.<component>.tolerations) по необходимости.
Для установки MLCluster
-
Необходимо подготовить хранилище с поддержкой формата RWX или использовать решение Longhorn, развернутое в кластере. Подробнее с документацией по Longhorn ознакомьтесь в статье Longhorn.
-
При необходимости настройки tls-взаимодействия с внешними s3/db и git, необходимо предварительно создать configMap (пример представлен ниже) в Namespace
nova-cert-managementс указанием лейблаnova-platform.io/trusted-ca-bundle-inject: enabled. Подробнее с деталями по работе с доверенными сертификатами ознакомьтесь в статье Управление цепочками сертификатов.
Пример configMap с сертификатом
apiVersion: v1
kind: ConfigMap
metadata:
name: external-git-ca-cert
namespace: nova-cert-management
labels:
nova-platform.io/trusted-ca-bundle-inject: enabled
data:
ca.crt: |
-----BEGIN CERTIFICATE-----
MIIEQDCCAyigAwIBAgIUa562g9g18o89Ha71kj5furb0D4swDQYJKoZIhvcNAQEM
BQAwZTELMAkGA1UEBhMCVVMxDTALBgNVBAgMBFRlc3QxETAPBgNVBAcMCFRlc3RD
aXR5MRkwFwYDVQQKDBBUZXN0T3JnYW5pemF0aW9uMRkwFwYDVQQDDBB0ZXN0LmV4
YW1wbGUuY29tMB4XDTI1MTAyMTEwMzc1MloXDTM1MTAxOTEwMzc1MlowZTELMAkG
A1UEBhMCVVMxDTALBgNVBAgMBFRlc3QxETAPBgNVBAcMCFRlc3RDaXR5MRkwFwYD
VQQKDBBUZXN0T3JnYW5pemF0aW9uMRkwFwYDVQQDDBB0ZXN0LmV4YW1wbGUuY29t
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1jL86Q736WEWKce7gmZ
8pZ5ozjn/oU7BiAJu+H7xS3iSoHN7lVIiNKul9v6mZMvEW0kGX6QOXd4MMFNLDgT
+o4AZy4t2lc2APsGlobjKtx90cQo66BqnRteJe+xmFek6G9vsVV92jR8rR5f9tzT
09kMYpKMsNqXYFatqtS2x07PJDvihDlu+xn3J1iNFR0A5R/CWcUwk0DU1kSJg00k
VnfEYotpHYzupTh/m6sbxFDYSKoVRmDtQfiS6jbum+HdrbJIuuSq9piXh0koDxk0
sSrZy2m9ZqdSGOICPksFBx57UHC4T8qNKxqcHm9Ca+c1sKGWfU16Zwa08pdaBf9q
kwIDAQABo4HnMIHkMB0GA1UdDgQWBBR4taMemgLYpcQI4/3G6JuYN9SgeDAfBgNV
HSMEGDAWgBR4taMemgLYpcQI4/3G6JuYN9SgeDBlBgNVHREEXjBcghB0ZXN0LmV4
YW1wbGUuY29tghIqLnRlc3QuZXhhbXBsZS5jb22CC2V4YW1wbGUuY29tgg0qLmV4
YW1wbGUuY29tggp0ZXN0LmxvY2FsggwqLnRlc3QubG9jYWwwDgYDVR0PAQH/BAQD
AgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAA
MA0GCSqGSIb3DQEBDAUAA4IBAQA0QvtGchPsJhe0KuI9rUJaSMEBDBsxZGsLRcTx
bSpMXbyviN4ICgh8SmDLHN2et6tbVRaRRBwmxff7iRbLidHHfuF36fKsRTMTB0CH
ukRmKrm4Cy6h9FMiNiS+nLfVk8srip5OhHHj9JNsvhnid1CMBtcrWraPOEVTnO1x
mpNvb3ho8TaFTnPqv6LIJRm77zpMzU6XdhMW1ywqqmGq5QY7i1ZpDqymK8H/Z/2T
dH1r3s1tbIVI0fiK+eARKU8jap8gVduorpbEXMB6DtAsSBq0wm4k6fPbaPIBgzrl
VXZl0EWTjvpmiq8MD6oUIZIjPQJOcLHK8P7liWNhmJC0kxJY
-----END CERTIFICATE-----
-
Для корректного подключения компонентов к внешним хранилищам и базам данных необходимо заранее создать в StarVault секреты с учетными данными для подключения. Секреты должны располагаться строго по пути
nova-secrets/data/credentials/external-integrationsи быть указаны в манифесте (см. пример манифеста)
Для установки MLInfrastructure
-
Установлены пакеты с драйверами GPU по инструкции.
Применимо при использовании нагрузки на GPU и наличии соответствующих ресурсов в кластере.
|
Модули MLInfrastructure и MLCluster могут устанавливаться независимо друг от друга в зависимости от требований.
|
2. Установка MLInfrastructure
В Nova Console в правом верхнем углу нажмите на + и установите манифест MLInfrastructure. Ниже приведен пример манифеста и описание его полей:
Пример манифеста
apiVersion: apps.nova-platform.io/v1alpha1
kind: MLInfrastructure
metadata:
name: nova-ml-infrastructure (1)
spec:
nvidiaGpuOperator: (2)
mig: (3)
enabled: true (4)
strategy: single (5)
configRef: mig-config (6)
timeSlicing: (7)
enabled: true (8)
configRef: time-slicing-config
| 1 | metadata.name (тип: string) - название ресурса MLInfrastructure.
|
||
| 2 | spec.nvidiaGpuOperator (тип: object) - объект в котором задается конфигурация Nvidia GPU Operator. |
||
| 3 | spec.nvidiaGpuOperator.mig (тип: object) - конфигурация multi instance GPU. Подробнее можно ознакомиться в статье Multi-Instance GPU. |
||
| 4 | spec.nvidiaGpuOperator.mig.enabled (тип: bool) - включение функционала. Если значение true, то параметры объекта spec.nvidiaGpuOperator.mig обязательны к заполнению. |
||
| 5 | spec.nvidiaGpuOperator.mig.strategy (тип: string (enum)) - в данное поле вы можете подставить одну из перечисленных ниже стратегий:
|
||
| 6 | spec.nvidiaGpuOperator.mig.configRef (тип: string) - ConfigMap конфигурации MIG профилей. |
||
| 7 | spec.nvidiaGpuOperator.timeSlicing (тип: object) - конфигурация функционала для виртуального разделения одной физической GPU между несколькими подами на уровне рабочего узла Nvidia GPU Operator. Подробнее можно ознакомиться в статье Time-Slicing GPUs in Kubernetes. |
||
| 8 | spec.nvidiaGpuOperator.timeSlicing.enabled (тип: bool) - включение функционала timeSlicing. Если значение true, то параметры объекта spec.nvidiaGpuOperator.timeSlicing обязательны к заполнению. |
3. Установка MLCluster
В Nova Console в правом верхнем углу нажмите на + и установите манифест MLCluster. Ниже приведен пример минимальной конфигурации:
Пример манифеста
apiVersion: apps.nova-platform.io/v1alpha1
kind: MLCluster
metadata:
name: nova-ml-cluster
spec:
mlBaseDomain: "apps.test.platform"
storageClass: longhorn-storage-single-replica
jupyterHub:
enabled: true
airFlow:
enabled: true
logVolumeSize: 5G
mlFlow:
enabled: true
kubeRay:
enabled: true
kserve:
enabled: true
postgreSQL:
enabled: true
minIO:
enabled: true
driveCount: 1
driveSize: 25Gi
Ниже приведен пример рекомендуемой конфигурации и описание всех основных полей манифеста:
Пример манифеста
apiVersion: apps.nova-platform.io/v1alpha1
kind: MLCluster
metadata:
name: nova-ml-cluster (1)
spec:
mlBaseDomain: "test" (2)
jupyterHub: (3)
enabled: true (4)
nodeSelector:
"node-role.kubernetes.io/infra": ""
"node-role.kubernetes.io/master": ""
tolerations:
- key: "node-role.kubernetes.io/main"
operator:"Exists"
effect:"NoSchedule"
- key: gpu
operator: "Exists"
effect: "NoSchedule"
storageClass: longhorn-storage-single-replica
notebookProfileList:
- displayName: "Test_Ml"
description: "Test_Ml"
default: false
storageSize: 5Gi
externalDatabase:
enabled: true
host: "psql-postgresql.nova-postgresql.svc"
port: 5432
database: airflow
starVaultUserSecretPath: "nova-secrets/data/credentials/external-integrations#new_username"
starVaultPassSecretPath: "nova-secrets/data/credentials/external-integrations#new_password"
airFlow: (5)
enabled: true (6)
nodeSelector:
"node-role.kubernetes.io/infra": ""
"node-role.kubernetes.io/master": ""
tolerations:
- key: "node-role.kubernetes.io/main"
operator:"Exists"
effect:"NoSchedule"
- key: gpu
operator: "Exists"
effect: "NoSchedule"
storageClass: longhorn-storage-single-replica (7)
logVolumeSize: 40Gi (8)
externalGit:
enabled: false
repo: "https://nova-release-git-main.${dnsBaseDomain}/container-platform/airflow.git"
branch: dev
starVaultUserSecretPath: "nova-secrets/data/credentials/external-integrations#new_username"
starVaultPassSecretPath: "nova-secrets/data/credentials/external-integrations#new_password"
externalDatabase:
enabled: false
host: "psql-postgresql.nova-postgresql.svc"
port: 5432
database: airflow
starVaultUserSecretPath: "nova-secrets/data/credentials/external-integrations#new_pg_user"
starVaultPassSecretPath: "nova-secrets/data/credentials/external-integrations#new_pg_password"
mlFlow: (9)
enabled: true (6)
nodeSelector:
"node-role.kubernetes.io/infra": ""
"node-role.kubernetes.io/master": ""
tolerations:
- key: "node-role.kubernetes.io/main"
operator:"Exists"
effect:"NoSchedule"
- key: gpu
operator: "Exists"
effect: "NoSchedule"
externalDatabase:
enabled: true
host: "psql-postgresql.nova-postgresql.svc"
port: 5432
database: mlflow
userDatabase: mlflow_auth
starVaultUserSecretPath: "nova-secrets/data/credentials/external-integrations#pg_password"
starVaultPassSecretPath: "nova-secrets/data/credentials/external-integrations#pg_password"
externalS3:
enabled: true
host: "minio.nova-minio.svc"
port: 443
bucketRegion: "ru-nova-1"
bucket: "ml"
starVaultUserSecretPath: "nova-secrets/data/credentials/external-integrations#root_user"
starVaultPassSecretPath: "nova-secrets/data/credentials/external-integrations#root_password"
kubeRay: (10)
enabled: true (6)
nodeSelector:
"node-role.kubernetes.io/infra": ""
"node-role.kubernetes.io/master": ""
tolerations:
- key: "node-role.kubernetes.io/main"
operator:"Exists"
effect:"NoSchedule"
- key: gpu
operator: "Exists"
effect: "NoSchedule"
postgreSQL: (11)
enabled: false (6)
minIO: (12)
enabled: false
kserve: (13)
enabled: true (6)
nodeSelector:
"node-role.kubernetes.io/infra": ""
"node-role.kubernetes.io/master": ""
tolerations:
- key: "node-role.kubernetes.io/main"
operator:"Exists"
effect:"NoSchedule"
- key: gpu
operator: "Exists"
effect: "NoSchedule"
externalS3:
enabled: true
host: "minio.nova-minio.svc"
port: 443
bucket: "ml"
bucketRegion: "ru-nova-1"
starVaultUserSecretPath: "nova-secrets/data/credentials/external-integrations#root_user"
starVaultPassSecretPath: "nova-secrets/data/credentials/external-integrations#root_password"
| 1 | metadata. name (тип данных: string) - название ресурса MLCluster;
|
||
| 2 | spec.mlBaseDomain (тип данных: string) - базовый DNS-домен для настройки и публикации служебных веб-сервисов через Ingress-контроллер; |
||
| 3 | spec.jupyterHub (тип данных: object) - конфигурирование компонента JupyterHub; |
||
| 4 | spec.jupyterHub.enabled (тип данных: bool) - необходимость установки компонента; |
||
| 5 | spec.airFlow (тип данных: object) - конфигурирование компонента AirFlow; |
||
| 6 | spec.<название_компонента>.enabled (тип данных: bool) - необходимость установки компонента; |
||
| 7 | spec.<название_компонента>.storageClass (тип данных: string) - переопределение storageClass; |
||
| 8 | spec.airFlow.logVolumeSize (тип данных: string) - размер PV для хранения логов; |
||
| 9 | spec.mlFlow(тип данных: object) - конфигурирование компонента MlFlow; |
||
| 10 | spec.kubeRay (тип данных: object) - конфигурирование компонента KubeRay; |
||
| 11 | spec.postgreSQL (тип данных: object) - конфигурирование компонента PostgreSQL; |
||
| 12 | spec.minIO (тип данных: object) - конфигурирование компонента minIO; |
||
| 13 | spec.kserve (тип данных: object) - конфигурирование компонента kserve; |
|
При примении манифеста есть валидация, которая не позволяет установить MinIo и postgreSQL, если все компоненты используют внешние интеграции или в случае когда ни один из включенных компонентов не требует интеграции с MinIo и postgreSQL. В таких случаях необходимо указывать в манифесте |
4. Статусы установки
После применения манифестов необходимо убедиться, что установка ресурсов MLCluster или MLInfrastructure завершилась успешно. Проверить текущее состояние можно двумя способами:
4.1. С помощью CLI
Выполните следующую команду, чтобы вывести все пространства имен:
-
Команда для MlCluster:
kubectl describe mlclusters.apps.nova-platform.io nova-ml-cluster --all-namespaces -
Команда для MLInfrastructure:
kubectl describe mlinfrastructures.apps.nova-platform.io nova-ml-infrastructure --all-namespaces
Name: nova-ml-cluster
Namespace:
Labels: <none>
Annotations: <none>
API Version: apps.nova-platform.io/v1alpha1
Kind: MLCluster
Metadata:
Creation Timestamp: 2025-10-08T12:32:28Z
Finalizers:
apps.nova-platform.io/mlcluster-finalizer
Generation: 2
Resource Version: 13058667
UID: 519c37ea-65d0-41e1-b4d5-0a408f1cc4c1
Spec:
Air Flow:
Enabled: false
External Database:
Database: airflow
Enabled: true
Existing Secret Name: nova-airflow-external-psql-credentials
Host: 172.31.0.254
Port: 5432
External Git:
Enabled: false
Jupyter Hub:
Enabled: false
External Database:
Kserve:
Enabled: false
externalS3:
Kube Ray:
Enabled: false
Min IO:
Drive Count: 4
Drive Size: 10Gi
Enabled: true
Node Count: 1
Ml Base Domain: ml-ai.universe.internal
Ml Flow:
Enabled: false
External Database:
externalS3:
Replicas: 1
Postgre SQL:
Enabled: true
Ha:
Volume Size: 2Gi
Storage Class: longhorn-storage-single-replica
Status:
Components: (1)
Message: All referenced Kustomizations are in a ready state. (2)
Name: nova-ml-supplemental (3)
Reason: AllKustomizationsReady (4)
Status: true (5)
Type: ready (6)
Conditions: (7)
Last Transition Time: 2025-10-08T12:32:58Z (8)
Message: All referenced Kustomizations are in a ready state. (9)
Reason: AllKustomizationsReady (10)
Status: true (11)
Type: ready (12)
Observed Generation: 2 (13)
Phase: Ready (14)
Events: <none>
| 1 | Status.Components - статус готовности устанавливаемого компонента (применимо в случае, если phase == Ready / Error) |
| 2 | Status.Components.Message - описание состояния. Возможные значения: |
| 3 | Status.Components.Name - наименование компонента |
| 4 | Status.Components.Reason - краткая причина |
| 5 | Status.Components.Status - статус завершения этапа (условия) |
| 6 | Status.Components.Type - тип этапа (условия) |
| 7 | Status.Conditions - набор условий, описывающих текущие этапы обработки ресурса |
| 8 | Status.Conditions.Last Transition Time - время последнего изменения этого условия |
| 9 | Status.Conditions.Message - описание состояния |
| 10 | Status.Conditions.Reason - краткая причина |
| 11 | Status.Conditions.Status - статус завершения этапа (условия) |
| 12 | Status.Conditions.Type - тип этапа (условия) |
| 13 | Status.Observed Generation - номер generation ресурса, к которому относится этот статус |
| 14 | Status.Phase - фаза жизненного цикла ресурса. Возможные значения:
|
|
Жизненный цикл MLInfrastructure аналогичен жизненному циклу MlCluster. |


