使用 DRA 将现有设备分配给工作负载

您可以使用动态资源分配 (DRA) 为 Google Kubernetes Engine (GKE) 工作负载灵活请求设备。本文档将向您展示如何创建 ResourceClaimTemplate 以请求集群中节点池中的现有设备,然后创建工作负载以观察 Kubernetes 如何灵活地将设备分配给 Pod。

本文档内容面向需要运行 AI/机器学习或高性能计算 (HPC) 等工作负载的 应用运维人员数据工程师

使用 DRA 请求设备简介

为 DRA 设置 GKE 基础设施时,节点上的 DRA 驱动程序会在集群中创建 DeviceClass 对象。 DeviceClass 定义了可供工作负载请求的设备类别,例如 GPU。 平台管理员可以选择性地部署其他 DeviceClass,以限制您可以在特定工作负载中请求哪些设备。

如需请求 DeviceClass 中的设备,请创建以下对象之一:

  • ResourceClaim:ResourceClaim 可让 Pod 或用户通过在 DeviceClass 中过滤特定参数来请求硬件资源。
  • ResourceClaimTemplate: ResourceClaimTemplate 定义了一个模板,Pod 可使用该模板自动为每个 Pod 创建新的 ResourceClaim。

如需详细了解 ResourceClaim 和 ResourceClaimTemplate, 请参阅 何时使用 ResourceClaim 和 ResourceClaimTemplate

本文档中的示例使用基本的 ResourceClaimTemplate 来请求指定的设备配置。如需详细了解您可以指定的所有字段 ,请参阅 ResourceClaimTemplate API 参考文档

限制

存在以下限制:

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。

声明设备和部署工作负载

如要请求每个 Pod 的设备分配,您需要创建一个 ResourceClaimTemplate,其中包含您请求的设备配置,例如特定类型的 GPU。当您部署引用 ResourceClaimTemplate 的工作负载时,Kubernetes 会根据 ResourceClaimTemplate 为工作负载中的每个 Pod 创建 ResourceClaim。Kubernetes 会分配所请求的资源,并将 Pod 调度到相应的节点上。

如需在具有 DRA 的工作负载中请求 GPU,请按以下步骤操作:

  1. 将以下清单保存为 gpu-claim-template.yaml

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: gpu-claim-template
    spec:
      spec:
        devices:
          requests:
          - name: single-gpu
            exactly:
              deviceClassName: gpu.nvidia.com
              allocationMode: ExactCount
              count: 1
    
  2. 创建 ResourceClaimTemplate:

    kubectl create -f gpu-claim-template.yaml
    
  3. 如需创建引用 ResourceClaimTemplate 的工作负载,请将以下清单保存为 dra-gpu-example.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dra-gpu-example
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: dra-gpu-example
      template:
        metadata:
          labels:
            app: dra-gpu-example
        spec:
          containers:
          - name: ctr
            image: ubuntu:22.04
            command: ["bash", "-c"]
            args: ["echo $(nvidia-smi -L || echo Waiting...); sleep infinity"]
            resources:
              claims:
              - name: single-gpu
          resourceClaims:
          - name: single-gpu
            resourceClaimTemplateName: gpu-claim-template
          tolerations:
          - key: "nvidia.com/gpu"
            operator: "Exists"
            effect: "NoSchedule"
    
  4. 部署工作负载:

    kubectl create -f dra-gpu-example.yaml
    

验证硬件分配

您可以通过检查 ResourceClaim 或查看 Pod 的日志来验证您的工作负载是否已分配了相应硬件。如需验证分配,请按以下步骤操作:

  1. 获取与您部署的工作负载相关联的 ResourceClaim:

    kubectl get resourceclaims
    

    输出类似于以下内容:

    NAME                                               STATE                AGE
    dra-gpu-example-64b75dc6b-x8bd6-single-gpu-jwwdh   allocated,reserved   9s
    
  2. 详细了解分配给 Pod 的硬件:

    kubectl describe resourceclaims RESOURCECLAIM
    

    RESOURCECLAIM 替换为从上一步的输出中获得的 ResourceClaim 的全名。

    输出类似于以下内容:

    Name:         dra-gpu-example-68f595d7dc-prv27-single-gpu-qgjq5
    Namespace:    default
    Labels:       <none>
    Annotations:  resource.kubernetes.io/pod-claim-name: single-gpu
    API Version:  resource.k8s.io/v1
    Kind:         ResourceClaim
    Metadata:
    # Multiple lines are omitted here.
    Spec:
      Devices:
        Requests:
          Exactly:
            Allocation Mode:    ExactCount
            Count:              1
            Device Class Name:  gpu.nvidia.com
          Name:                 single-gpu
    Status:
      Allocation:
        Devices:
          Results:
            Device:   gpu-0
            Driver:   gpu.nvidia.com
            Pool:     gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
            Request:  single-gpu
        Node Selector:
          Node Selector Terms:
            Match Fields:
              Key:       metadata.name
              Operator:  In
              Values:
                gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
      Reserved For:
        Name:      dra-gpu-example-68f595d7dc-prv27
        Resource:  pods
        UID:       e16c2813-08ef-411b-8d92-a72f27ebf5ef
    Events:        <none>
    
  3. 获取您部署的工作负载的日志:

    kubectl logs deployment/dra-gpu-example --all-pods=true
    

    输出类似于以下内容:

    [pod/dra-gpu-example-64b75dc6b-x8bd6/ctr] GPU 0: Tesla T4 (UUID: GPU-2087ac7a-f781-8cd7-eb6b-b00943cc13ef)
    

    此输出表明 GKE 为容器分配了一个 GPU。

后续步骤