Для улучшения работы сайта мы используем файлы 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

2.1. С помощью CLI

  1. Установите оператор nova-ml-infra-operator. Для этого сохраните представленный ниже манифест в файл, например MlInfraOperator.yaml.

    Пример манифеста для установки nova-ml-infra-operator
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: nova-ml-infra-operator
      namespace: nova-operators
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: nova-ml-infra-operator
      source: nova-catalog
      sourceNamespace: nova-operatorhub
      startingCSV: nova-ml-infra-operator.v1.0.0
  2. Установите манифест в кластер Kubernetes, выполнив команду:

     kubectl apply -f MlInfraOperator.yaml
  3. Проверьте состояние оператора после установки.

    kubectl get pods -n nova-operators
    Пример вывода:
    NAME                                             READY   STATUS    RESTARTS      AGE
    nova-ml-infra-operator-79458965d9-qxhc2          1/1     Running   1 (44h ago)   5d

    Убедитесь, что оператор находится в статусе Running. В столбце READY должно быть 1/1.

  4. Сохраните пример манифеста ниже в файл, например, MLInfrastructure.yaml.

    Пример манифеста
    apiVersion: mlinfra.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
      nvidiaNetworkOperator: (9)
        enabled: false (10)
    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 обязательны к заполнению.
    9 spec.nvidiaNetworkOperator (тип: object) - объект в котором задается конфигурация Nvidia Network Operator.
    10 spec.nvidiaNetworkOperator.enabled (тип: bool) - флаг, показывающий, устанавливать компонент или нет.
  5. Установите манифест в кластер, выполнив команду:

    kubectl apply -f MLInfrastructure.yaml
  6. Для проверки после установки выполните следующую команду, чтобы вывести все пространства имен:

    kubectl describe mlinfrastructures.apps.nova-platform.io nova-ml-infrastructure --all-namespaces

    Убедитесь, что поле Status.Phase находится в статусе Ready.

2.2. С помощью Nova Console

Установите MLInfrastructure через Nova Console OperatorHUB. Для этого выполните следующие шаги.

  1. Установите оператор Nova ML Infra Operator. В Nova Console в главном меню выберите OperatorsOperatorHUB. Выберите Nova ML Infra Operator. Нажмите кнопку Установить.

    Заполните поля формы по примеру, представленному на скриншоте.

    mlinfra 6

    Подтвердите установку, нажав Установить.

  2. Перейдите в раздел OperatorsУстановленные операторы. Выберите Nova ML Infra Operator или сразу после установки нажмите Открыть оператор.

  3. Перейдите ко вкладке MLInfrastructure и нажмите на кнопку Создать MLInfrastructure.

  4. Заполнить настройки MLInfrastructure можно двумя способами:

    • С помощью формы

      mlinfra 1
      • Имя - имя должно быть уникальным в пределах пространства имен.

      • NvidiaGpuOperator - объект в котором задается конфигурация Nvidia GPU Operator.

      • mig - конфигурация multi instance GPU. Подробнее можно ознакомиться в статье Multi-Instance GPU.

        • enabled - включение функционала

      • timeSlicing - конфигурация функционала для виртуального разделения одной физической GPU между несколькими подами на уровне рабочего узла Nvidia GPU Operator. Подробнее можно ознакомиться в статье Time-Slicing GPUs in Kubernetes.

        • enabled - включение функционала

    • С помощью манифеста:

      Пример манифеста
      apiVersion: mlinfra.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
        nvidiaNetworkOperator: (9)
          enabled: false (10)
      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 обязательны к заполнению.
      9 spec.nvidiaNetworkOperator (тип: object) - объект в котором задается конфигурация Nvidia Network Operator.
      10 spec.nvidiaNetworkOperator.enabled (тип: bool) - флаг, показывающий, устанавливать компонент или нет.
  5. Нажмите Создать. Отслеживайте статус на вкладке MLInfrastructure на странице оператора.

    mlinfra 2

3. Удаление MLInfrastructure

3.1. С помощью CLI

Для полного удаления MLInfrastructure выполниет следующую команду:

kubectl delete mlinfrastructure nova-ml-infrastructure

3.2. С помощью Nova Console

Для полного удаления MLInfrastructure из кластера Nova выполните следующие шаги.

  1. Перейдите в раздел OperatorsУстановленные операторы. Выберите Nova ML Infra Operator.

  2. Перейдите на вкладку MLInfrastructure.

  3. Выберите установленный модуль и нажмите Удалить.

    mlinfra 7

4. Установка MLCluster

4.1. С помощью CLI

  1. Установите оператор nova-ml-platform-operator. Для этого сохраните представленный ниже манифест в файл, например MlOperator.yaml.

    Пример манифеста для установки nova-ml-platform-operator
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: nova-ml-platform-operator
      namespace: nova-operators
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: nova-ml-platform-operator
      source: nova-catalog
      sourceNamespace: nova-operatorhub
      startingCSV: nova-ml-platform-operator.v1.0.0
  2. Установите манифест в кластер Kubernetes, выполнив команду:

    kubectl apply -f MlOperator.yaml
  3. Проверьте состояние оператора после установки.

    kubectl get pods -n nova-operators
    Пример вывода:
    NAME                                             READY   STATUS    RESTARTS      AGE
    nova-ml-platform-operator-64db76c558-84g72       1/1     Running   1 (44h ago)   5d

    Убедитесь, что оператор находится в статусе Running. В столбце READY должно быть 1/1.

  4. Сохраните один из представленных ниже манифестов в файл, например, MLCluster.yaml.

    Для кластера в минимальной конфигурации
    apiVersion: mlplatform.nova-platform.io/v1alpha1
    kind: MLCluster
    metadata:
      name: nova-ml-cluster
    spec:
      mlBaseDomain: "apps.example.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: mlplatform.nova-platform.io/v1alpha1
    kind: MLCluster
    metadata:
      name: nova-ml-cluster (1)
    spec:
      mlBaseDomain: "example" (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
        ttlConfig: (5)
            enabled: true (6)
            users: true
            adminUsers: true
            timeout: 4800
            every: 60
            concurrency: 5
            maxAge: 0
        notebookProfileList:  (7)
          - displayName: "Example_Ml"
            description: "Example_Ml"
            default: false
            storageSize: 5Gi
            acceleratorType: ndidia.com/gpu
            acceleratorCount: 1
            extraNodeSelector:
                gpu-type: nvidia-a100
            extraTolerations:
                key: nvidia.com/gpu
                operator: Exists
                value: ""
                effect: NoSchedule
        externalDatabase:
            enabled: false
            host: "psql-postgresql.nova-postgresql.svc"
            port: 5432
            database: airflow
            starVaultUserSecretPath: "nova-secrets/data/credentials/ml/postgresql/new_username"
            starVaultPassSecretPath: "nova-secrets/data/credentials/ml/postgresql#new_password"
      airFlow: (8)
        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 (9)
        logVolumeSize: 40Gi (10)
        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: (11)
        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: (12)
        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: (13)
        enabled: false (6)
      minIO: (14)
        enabled: false
      kserve: (15)
        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.jupyterHub.ttlConfig (тип данных: object) - профиль конфигурации времени жизни пода.
    6 spec.<название_компонента>.enabled (тип данных: bool) - необходимость установки компонента.
    7 spec.notebookProfileList (тип данных: array of object) - профиль конфигурации ноутбука
    8 spec.airFlow (тип данных: object) - конфигурирование компонента AirFlow.
    9 spec.<название_компонента>.storageClass (тип данных: string) - переопределение storageClass.
    10 spec.airFlow.logVolumeSize (тип данных: string) - размер PV для хранения логов.
    11 spec.mlFlow(тип данных: object) - конфигурирование компонента MlFlow.
    12 spec.kubeRay (тип данных: object) - конфигурирование компонента KubeRay.
    13 spec.postgreSQL (тип данных: object) - конфигурирование компонента PostgreSQL.
    14 spec.minIO (тип данных: object) - конфигурирование компонента minIO.
    15 spec.kserve (тип данных: object) - конфигурирование компонента kserve.

    При примении манифеста есть валидация, которая не позволяет установить MinIo и postgreSQL, если все компоненты используют внешние интеграции или в случае когда ни один из включенных компонентов не требует интеграции с MinIo и postgreSQL. В таких случаях необходимо указывать в манифесте minio/postgresql.enabled = false.

  5. Для проверки после установки выполните следующую команду, чтобы вывести все пространства имен:

    kubectl describe mlclusters.apps.nova-platform.io nova-ml-cluster --all-namespaces
    Пример вывода для MlCluster:
    Name:         nova-ml-cluster
    Namespace:
    Labels:       <none>
    Annotations:  <none>
    API Version:  mlinfra.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 - произошла ошибка на каком-либо этапе.

    Убедитесь, что поле Status.Phase находится в статусе Ready.

4.2. С помощью Nova Console

Установите MLCluster через Nova Console OperatorHUB. Для этого выполните следующие шаги.

  1. Установите операторNova ML Cluster Operator. В Nova Console в главном меню выберите OperatorsOperatorHUB. Выберите Nova ML Cluster Operator. Нажмите кнопку Установить.

    Заполните поля формы по примеру, представленному на скриншоте.

    mlcluster 6

    Подтвердите установку, нажав Установить.

  2. Перейдите в раздел OperatorsУстановленные операторы. Выберите Nova ML Cluster Operator или сразу после установки нажмите Открыть оператор.

  3. Перейдите ко вкладке MLCluster и нажмите на кнопку Создать MLCluster.

  4. Заполнить настройки MLCluster можно двумя способами:

    • С помощью формы

      mlcluster 1

      Ниже перечислены обязательные поля для заполнения:

      • Имя - имя должно быть уникальным в пределах пространства имен.

      • mlBaseDomain - базовый DNS-домен для настройки и публикации служебных веб-сервисов через Ingress-контроллер.

      • jupyterHub - конфигурирование компонента JupyterHub.

        • enabled - включение компонента.

      • jupyterHub - конфигурирование компонента MlFlow.

        • enabled - включение компонента.

      • postgreSQL - конфигурирование компонента postgreSQL.

        • enabled - включение компонента.

      • airFlow - конфигурирование компонента airFlow.

        • enabled - включение компонента.

      • kubeRay - конфигурирование компонента kubeRay.

        • enabled - включение компонента.

    • С помощью манифеста:

      Для кластера в минимальной конфигурации
      apiVersion: mlplatform.nova-platform.io/v1alpha1
      kind: MLCluster
      metadata:
        name: nova-ml-cluster
      spec:
        mlBaseDomain: "apps.example.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: mlplatform.nova-platform.io/v1alpha1
      kind: MLCluster
      metadata:
        name: nova-ml-cluster (1)
      spec:
        mlBaseDomain: "example" (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
          ttlConfig: (5)
              enabled: true (6)
              users: true
              adminUsers: true
              timeout: 4800
              every: 60
              concurrency: 5
              maxAge: 0
          notebookProfileList:  (7)
            - displayName: "Example_Ml"
              description: "Example_Ml"
              default: false
              storageSize: 5Gi
              acceleratorType: ndidia.com/gpu
              acceleratorCount: 1
              extraNodeSelector:
                  gpu-type: nvidia-a100
              extraTolerations:
                  key: nvidia.com/gpu
                  operator: Exists
                  value: ""
                  effect: NoSchedule
          externalDatabase:
              enabled: false
              host: "psql-postgresql.nova-postgresql.svc"
              port: 5432
              database: airflow
              starVaultUserSecretPath: "nova-secrets/data/credentials/ml/postgresql/new_username"
              starVaultPassSecretPath: "nova-secrets/data/credentials/ml/postgresql#new_password"
        airFlow: (8)
          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 (9)
          logVolumeSize: 40Gi (10)
          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: (11)
          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: (12)
          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: (13)
          enabled: false (6)
        minIO: (14)
          enabled: false
        kserve: (15)
          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.jupyterHub.ttlConfig (тип данных: object) - профиль конфигурации времени жизни пода.
      6 spec.<название_компонента>.enabled (тип данных: bool) - необходимость установки компонента.
      7 spec.notebookProfileList (тип данных: array of object) - профиль конфигурации ноутбука
      8 spec.airFlow (тип данных: object) - конфигурирование компонента AirFlow.
      9 spec.<название_компонента>.storageClass (тип данных: string) - переопределение storageClass.
      10 spec.airFlow.logVolumeSize (тип данных: string) - размер PV для хранения логов.
      11 spec.mlFlow(тип данных: object) - конфигурирование компонента MlFlow.
      12 spec.kubeRay (тип данных: object) - конфигурирование компонента KubeRay.
      13 spec.postgreSQL (тип данных: object) - конфигурирование компонента PostgreSQL.
      14 spec.minIO (тип данных: object) - конфигурирование компонента minIO.
      15 spec.kserve (тип данных: object) - конфигурирование компонента kserve.
  5. Нажмите Создать. Отслеживайте статус на вкладке MLCluster на странице оператора.

    mlcluster 2

5. Удаление MLCluster

5.1. С помощью CLI

Для полного удаления MLCluster выполниет следующую команду:

kubectl delete mlcluster nova-ml-cluster

5.2. С помощью Nova Console

Для полного удаления MLCluster из кластера Nova выполните следующие шаги.

  1. Перейдите в раздел OperatorsУстановленные операторы. Выберите Nova ML Cluster Operator.

  2. Перейдите на вкладку MLCluster.

  3. Выберите установленный модуль и нажмите Удалить.

    mlcluster 7