• Русский
  • Alauda Build of NVIDIA DRA Driver for GPUs

    Введение

    Dynamic Resource Allocation (DRA) — это функция Kubernetes, которая предоставляет более гибкий и расширяемый способ запроса и выделения аппаратных ресурсов, таких как GPU. В отличие от традиционных device plugin, которые поддерживают только простое подсчитывание одинаковых ресурсов, DRA обеспечивает точный выбор устройств на основе их атрибутов и возможностей.

    Alauda Build of NVIDIA DRA Driver for GPUs поставляется как плагин кластера, который добавляет upstream NVIDIA DRA driver в ваш кластер ACP, позволяя workloads запрашивать GPU через объекты ResourceClaim и ResourceClaimTemplate.

    Предварительные требования

    • NVIDIA driver v565+ установлен на каждом GPU node.
    • Kubernetes v1.32+.
    • ACP v4.1+.
    • Доступ администратора кластера к целевому кластеру ACP.
    • CDI включен в базовой container runtime, такой как containerd.
    • DRA и соответствующие API groups включены в кластере.

    В разделах ниже описано, как включить CDI и DRA, если они еще не настроены.

    Установка

    Установите NVIDIA driver на GPU nodes

    См. NVIDIA CUDA Installation Guide for Linux.

    Установите NVIDIA Container Toolkit

    См. NVIDIA Container Toolkit installation guide.

    Включите CDI в containerd

    CDI (Container Device Interface) предоставляет стандартный механизм, с помощью которого производители устройств могут описать все, что требуется для предоставления доступа к конкретному ресурсу — например, GPU — помимо простого имени устройства.

    CDI включен по умолчанию в containerd 2.0 и более поздних версиях. Для более ранних версий (начиная с 1.7.0) его необходимо активировать вручную.

    INFO

    Следующие шаги требуются только на GPU nodes, где работает containerd v1.7.x.

    1. Отредактируйте файл конфигурации containerd:

      vi /etc/containerd/config.toml

      Добавьте или измените следующий раздел:

      [plugins."io.containerd.grpc.v1.cri"]
        enable_cdi = true
      NOTE

      Достаточно установить enable_cdi = true. Значения cdi_spec_dirs по умолчанию в containerd уже включают /etc/cdi и /var/run/cdi, куда NVIDIA Container Toolkit записывает свои CDI specs. Указывайте cdi_spec_dirs явно только в том случае, если toolkit настроен на запись specs в другое место.

    2. Перезапустите containerd и убедитесь, что он работает корректно:

      systemctl restart containerd
      systemctl status containerd
    3. Проверьте, что CDI включен:

      journalctl -u containerd | grep "EnableCDI:true"

      Если появляются соответствующие строки журнала, CDI был успешно включен.

    Включите DRA в Kubernetes

    DRA включен по умолчанию в Kubernetes 1.34 и более поздних версиях. Для более ранних версий (начиная с 1.32) его необходимо активировать вручную.

    INFO

    Следующие шаги применимы к Kubernetes 1.32–1.33. Примените изменения control plane на всех master nodes, а изменение kubelet — на всех nodes.

    1. Отредактируйте манифест kube-apiserver в /etc/kubernetes/manifests/kube-apiserver.yaml.

      Для Kubernetes 1.32:

      spec:
        containers:
          - command:
              - kube-apiserver
              - --feature-gates=DynamicResourceAllocation=true # required
              - --runtime-config=resource.k8s.io/v1beta1=true # required
            # ... other flags

      Для Kubernetes 1.33:

      spec:
        containers:
          - command:
              - kube-apiserver
              - --feature-gates=DynamicResourceAllocation=true # required
              - --runtime-config=resource.k8s.io/v1beta1=true,resource.k8s.io/v1beta2=true # required
            # ... other flags
    2. Отредактируйте манифест kube-controller-manager в /etc/kubernetes/manifests/kube-controller-manager.yaml:

      spec:
        containers:
          - command:
              - kube-controller-manager
              - --feature-gates=DynamicResourceAllocation=true # required
            # ... other flags
    3. Отредактируйте манифест kube-scheduler в /etc/kubernetes/manifests/kube-scheduler.yaml:

      spec:
        containers:
          - command:
              - kube-scheduler
              - --feature-gates=DynamicResourceAllocation=true
            # ... other flags
    4. Отредактируйте конфигурацию kubelet в /var/lib/kubelet/config.yaml на всех nodes:

      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      featureGates:
        DynamicResourceAllocation: true

      Перезапустите kubelet:

      sudo systemctl restart kubelet

    Скачайте плагин кластера

    Плагин кластера Alauda Build of NVIDIA DRA Driver for GPUs можно получить в Customer Portal. Для получения дополнительной информации обратитесь в Customer Support.

    Загрузите плагин кластера

    Загрузите скачанный пакет с помощью командной строки violet. Подробнее см. Upload Packages.

    Установите Alauda Build of NVIDIA DRA Driver for GPUs

    1. Добавьте метку каждому GPU node, чтобы на него был запланирован nvidia-dra-driver-gpu-kubelet-plugin:

      kubectl label nodes {node-name} nvidia-device-enable=pgpu-dra
      WARNING

      На одном и том же node можно задать только одну из следующих меток: gpu=on, nvidia-device-enable=pgpu или nvidia-device-enable=pgpu-dra.

    2. Перейдите в Administrator > Marketplace > Cluster Plugins, переключитесь на целевой кластер и разверните плагин кластера Alauda Build of NVIDIA DRA Driver for GPUs.

    Проверьте настройку DRA

    1. Проверьте pods драйвера DRA и controller:

      kubectl get pods -n kube-system | grep "nvidia-dra-driver-gpu"

      Вывод должен быть похож на следующий:

      nvidia-dra-driver-gpu-controller-675644bfb5-c2hq4   1/1     Running   0              18h
      nvidia-dra-driver-gpu-kubelet-plugin-65fjt          2/2     Running   0              18h
    2. Проверьте объекты ResourceSlice:

      kubectl get resourceslices -o yaml

      Для GPU node вывод должен быть похож на следующий:

      apiVersion: resource.k8s.io/v1beta1
      kind: ResourceSlice
      metadata:
        generateName: 192.168.140.59-gpu.nvidia.com-
        name: 192.168.140.59-gpu.nvidia.com-gbl46
        ownerReferences:
          - apiVersion: v1
            controller: true
            kind: Node
            name: 192.168.140.59
            uid: 4ab2c24c-fc35-4c75-bcaf-db038356575c
      spec:
        devices:
          - basic:
              attributes:
                architecture:
                  string: Pascal
                brand:
                  string: Tesla
                cudaComputeCapability:
                  version: 6.0.0
                cudaDriverVersion:
                  version: 12.8.0
                driverVersion:
                  version: 570.124.6
                pcieBusID:
                  string: 0000:00:0b.0
                productName:
                  string: Tesla P100-PCIE-16GB
                resource.kubernetes.io/pcieRoot:
                  string: pci0000:00
                type:
                  string: gpu
                uuid:
                  string: GPU-b87512d7-c8a6-5f4b-8d3f-68183df62d66
              capacity:
                memory:
                  value: 16Gi
            name: gpu-0
        driver: gpu.nvidia.com
        nodeName: 192.168.140.59
        pool:
          generation: 1
          name: 192.168.140.59
          resourceSliceCount: 1

    Проверьте установку

    В этом разделе предполагается, что вы выполнили все шаги установки выше и что все соответствующие GPU components работают и находятся в состоянии Ready. Следующий workload подтверждает, что Alauda Build of NVIDIA DRA Driver for GPUs работает end to end.

    Запустите workload для проверки

    1. Создайте спецификацию workload. Настройте селектор expression так, чтобы он соответствовал productName, указанному в вашем собственном выводе ResourceSlice:

      cat <<EOF > dra-gpu-test.yaml
      ---
      apiVersion: resource.k8s.io/v1beta1
      kind: ResourceClaimTemplate
      metadata:
        name: gpu-template
      spec:
        spec:
          devices:
            requests:
            - name: gpu
              deviceClassName: gpu.nvidia.com
              selectors:
              - cel:
                  expression: "device.attributes['gpu.nvidia.com'].productName == 'Tesla P100-PCIE-16GB'"
      ---
      apiVersion: v1
      kind: Pod
      metadata:
        name: dra-gpu-workload
      spec:
        tolerations:
        - key: "nvidia.com/gpu"
          operator: "Exists"
          effect: "NoSchedule"
        restartPolicy: OnFailure
        resourceClaims:
        - name: gpu-claim
          resourceClaimTemplateName: gpu-template
        containers:
        - name: cuda-container
          image: "ubuntu:22.04"
          command: ["bash", "-c"]
          args: ["nvidia-smi -L; trap 'exit 0' TERM; sleep 9999 & wait"]
          resources:
            claims:
            - name: gpu-claim
      EOF
    2. Примените спецификацию:

      kubectl apply -f dra-gpu-test.yaml
    3. Просмотрите журналы контейнера:

      kubectl logs dra-gpu-workload -f

      В выводе должен отображаться UUID GPU изнутри контейнера, например:

      GPU 0: Tesla P100-PCIE-16GB (UUID: GPU-b87512d7-c8a6-5f4b-8d3f-68183df62d66)