Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

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 могут устанавливаться независимо друг от друга в зависимости от требований.

  • MLCluster можно развернуть в кластере, даже без GPU и сетевых оптимизаций (например, для CPU-only задач или разработки)

  • MLInfrastructure можно использовать отдельно, если требуется только управление аппаратными ресурсами и их оптимизация для высоконагруженных приложений.

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)) - в данное поле вы можете подставить одну из перечисленных ниже стратегий:
  • single - все GPU будут настроены одинаково, один и тот же MIG-профиль на всех устройствах;

  • mixed - разные GPU могут иметь разные MIG профили.

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. В таких случаях необходимо указывать в манифесте minio/postgresql.enabled = false.

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
Пример вывода для MlCluster:
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 - фаза жизненного цикла ресурса. Возможные значения:
  • Pending - ресурс создан, ожидает начала reconciler;

  • Reconciling - оператор выполняет действия (патчинг, ожидание);

  • Ready - все необходимые Kustomization применены и в состоянии Ready;

  • Error - произошла ошибка на каком-либо этапе.

Жизненный цикл MLInfrastructure аналогичен жизненному циклу MlCluster.

4.2. С помощью веб-интерфейса:

  1. Перейдите на вкладку АдминистрированиеCustomResourceDefinitions. С помощью поиска найдите свой MLCluser.

    mlcluster

  2. Перейдите на вкладку Инстансы и нажмите на инстанс.

    ml instances

  3. Перейдите на вкладку YAML. Поле status.phase показывает фазу жизненного цикла ресурса.

    ml inst yaml