使用 DRA 將現有裝置分配給工作負載

您可以使用動態資源分配 (DRA),彈性要求 Google Kubernetes Engine (GKE) 工作負載的裝置。本文說明如何建立 ResourceClaimTemplate,要求叢集節點集區中的現有裝置,然後建立工作負載,觀察 Kubernetes 如何彈性地將裝置分配給 Pod。

本文適用於應用程式運算子資料工程師,這些使用者會執行 AI/機器學習或高效能運算 (HPC) 等工作負載。

關於使用 DRA 要求裝置

為 DRA 設定 GKE 基礎架構時,節點上的 DRA 驅動程式會在叢集中建立 DeviceClass 物件。DeviceClass 定義可供工作負載要求的裝置類別,例如 GPU。平台管理員可以視需要部署其他 DeviceClass,限制您在特定工作負載中可要求的裝置。

如要在 DeviceClass 中要求裝置,請建立下列其中一個物件:

  • ResourceClaim: Pod 或使用者可透過 ResourceClaim,在 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 分配給容器。

後續步驟