适用于 GPUs 的 Alauda Build of NVIDIA DRA Driver

简介

Dynamic Resource Allocation (DRA) 是 Kubernetes 的一项特性,它提供了一种更灵活、可扩展的方式来请求和分配 GPU 等硬件资源。与传统的 device plugin 不同,后者只支持对同类资源进行简单计数,DRA 允许基于设备属性和能力进行细粒度的设备选择。

Alauda Build of NVIDIA DRA Driver for GPUs 以 cluster plugin 形式交付,可将上游 NVIDIA DRA driver 引入您的 ACP 集群,使工作负载能够通过 ResourceClaimResourceClaimTemplate 对象申请 GPU。

前提条件

  • 每个 GPU 节点上已安装 NVIDIA driver v565+
  • Kubernetes v1.32+
  • ACP v4.1+
  • 目标 ACP 集群的集群管理员访问权限
  • 底层容器运行时(例如 containerd)中已启用 CDI
  • 集群上已启用 DRA 及相应的 API groups

以下部分将说明如果尚未配置,如何启用 CDI 和 DRA。

安装

在 GPU 节点上安装 NVIDIA driver

请参阅 NVIDIA CUDA Installation Guide for Linux

安装 NVIDIA Container Toolkit

请参阅 NVIDIA Container Toolkit installation guide

在 containerd 中启用 CDI

CDI(Container Device Interface)为设备供应商提供了一种标准机制,用于描述除简单设备名称之外、访问特定资源(例如 GPU)所需的一切信息。

CDI 在 containerd 2.0 及更高版本中默认启用。在较早版本(从 1.7.0 起)中,需要手动激活。

INFO

以下步骤仅适用于运行 containerd v1.7.x 的 GPU 节点。

  1. 编辑 containerd 配置文件:

    vi /etc/containerd/config.toml

    添加或修改以下部分:

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

    仅设置 enable_cdi = true 即可。containerd 的默认 cdi_spec_dirs 已经包含 /etc/cdi/var/run/cdi,而 NVIDIA Container Toolkit 会将其 CDI 规范写入这些目录。只有当您的 toolkit 配置为将规范输出到其他位置时,才需要显式设置 cdi_spec_dirs

  2. 重启 containerd,并确认其运行正常:

    systemctl restart containerd
    systemctl status containerd
  3. 验证 CDI 是否已启用:

    journalctl -u containerd | grep "EnableCDI:true"

    如果出现匹配的日志行,则表示 CDI 已成功启用。

在 Kubernetes 中启用 DRA

DRA 在 Kubernetes 1.34 及更高版本中默认启用。在较早版本(从 1.32 起)中,需要手动激活。

INFO

以下步骤适用于 Kubernetes 1.32–1.33。请在 所有主节点 上应用控制平面更改,并在 所有节点 上应用 kubelet 更改。

  1. 编辑位于 /etc/kubernetes/manifests/kube-apiserver.yamlkube-apiserver 清单。

    对于 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. 编辑位于 /etc/kubernetes/manifests/kube-controller-manager.yamlkube-controller-manager 清单:

    spec:
      containers:
        - command:
            - kube-controller-manager
            - --feature-gates=DynamicResourceAllocation=true # required
          # ... other flags
  3. 编辑位于 /etc/kubernetes/manifests/kube-scheduler.yamlkube-scheduler 清单:

    spec:
      containers:
        - command:
            - kube-scheduler
            - --feature-gates=DynamicResourceAllocation=true
          # ... other flags
  4. 编辑所有节点上 /var/lib/kubelet/config.yaml 中的 kubelet 配置:

    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 命令行工具上架下载的软件包。详情请参阅 上架软件包

安装 Alauda Build of NVIDIA DRA Driver for GPUs

  1. 为每个 GPU 节点添加标签,以便将 nvidia-dra-driver-gpu-kubelet-plugin 调度到该节点上:

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

    在同一个节点上,您只能设置以下标签中的 一个gpu=onnvidia-device-enable=pgpunvidia-device-enable=pgpu-dra

  2. 导航到 管理员 > Marketplace > 集群插件,切换到目标集群,并部署 Alauda Build of NVIDIA DRA Driver for GPUs 集群插件。

验证 DRA 配置

  1. 检查 DRA driver 和 controller Pod:

    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 节点,输出应类似于:

    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 组件都在运行且处于 Ready 状态。下面的工作负载将验证 Alauda Build of NVIDIA DRA Driver for GPUs 是否端到端正常工作。

运行验证工作负载

  1. 创建工作负载 spec。调整选择器 expression,使其与您自己的 ResourceSlice 输出中报告的 productName 匹配:

    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. 应用该 spec:

    kubectl apply -f dra-gpu-test.yaml
  3. 查看容器日志:

    kubectl logs dra-gpu-workload -f

    输出应显示容器内部的 GPU UUID,例如:

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