使用 DRA 為工作負載分配裝置

特性狀態: Kubernetes v1.34 [穩定] (預設啟用:true)

本頁面介紹如何使用動態資源分配(DRA)將裝置分配給 Pod。這些說明適用於工作負載操作員。在閱讀本頁面之前,請熟悉 DRA 的工作原理以及 DRA 術語,例如 ResourceClaimsResourceClaimTemplates。有關更多資訊,請參閱 動態資源分配 (DRA)

關於使用 DRA 分配裝置

作為工作負載操作員,你可以透過建立 ResourceClaims 或 ResourceClaimTemplates 為你的工作負載宣告裝置。當你部署工作負載時,Kubernetes 和裝置驅動程式會查詢可用的裝置,將它們分配給你的 Pod,並將 Pod 放置在可以訪問這些裝置的節點上。

準備工作

你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在至少有兩個節點(不充當控制平面主機)的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用以下 Kubernetes 演練場之一

你的 Kubernetes 伺服器版本必須是 v1.34。

要檢查版本,請輸入 kubectl version

  • 確保你的叢集管理員已設定 DRA、連線裝置並安裝驅動程式。有關更多資訊,請參閱 在叢集中設定 DRA

識別要宣告的裝置

你的叢集管理員或裝置驅動程式建立DeviceClasses,用於定義裝置的類別。你可以使用 通用表示式語言 過濾特定裝置屬性來宣告裝置。

獲取叢集中的 DeviceClass 列表

kubectl get deviceclasses

輸出類似於以下內容

NAME                 AGE
driver.example.com   16m

如果你遇到許可權錯誤,可能無法訪問 DeviceClass。請諮詢你的叢集管理員或驅動程式提供商以獲取可用裝置屬性。

宣告資源

你可以使用 ResourceClaims 從 DeviceClass 請求資源。要建立 ResourceClaim,請執行以下操作之一

  • 如果你希望多個 Pod 共享訪問同一裝置,或者希望宣告在 Pod 生命週期之外存在,請手動建立 ResourceClaim。
  • 使用 ResourceClaimTemplate 讓 Kubernetes 生成和管理每個 Pod 的 ResourceClaims。如果你希望每個 Pod 都能訪問具有相似配置的獨立裝置,請建立 ResourceClaimTemplate。例如,你可能希望在使用 並行執行 的 Job 中的 Pod 同時訪問裝置。

如果你在 Pod 中直接引用了特定的 ResourceClaim,則該 ResourceClaim 必須已經存在於叢集中。如果引用的 ResourceClaim 不存在,則 Pod 將保持掛起狀態,直到建立 ResourceClaim。你可以在 Pod 中引用自動生成的 ResourceClaim,但由於自動生成的 ResourceClaims 繫結到觸發生成的 Pod 的生命週期,因此不建議這樣做。

要建立宣告資源的工作負載,請選擇以下選項之一

檢視以下示例清單

apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: example-resource-claim-template
spec:
  spec:
    devices:
      requests:
      - name: gpu-claim
        exactly:
          deviceClassName: example-device-class
          selectors:
          - cel:
            expression: |-
                device.attributes["driver.example.com"].type == "gpu" &&
                device.capacity["driver.example.com"].memory == quantity("64Gi")                

此清單建立了一個 ResourceClaimTemplate,它請求 example-device-class DeviceClass 中與以下兩個引數都匹配的裝置

  • 具有 driver.example.com/type 屬性且值為 gpu 的裝置。
  • 具有 64Gi 容量的裝置。

要建立 ResourceClaimTemplate,請執行以下命令

kubectl apply -f https://k8s.io/examples/dra/resourceclaimtemplate.yaml

檢視以下示例清單

apiVersion: resource.k8s.io/v1
kind: ResourceClaim
metadata:
  name: example-resource-claim
spec:
  devices:
    requests:
    - name: single-gpu-claim
      exactly:
        deviceClassName: example-device-class
        allocationMode: All
        selectors:
        - cel:
          expression: |-
              device.attributes["driver.example.com"].type == "gpu" &&
              device.capacity["driver.example.com"].memory == quantity("64Gi")              

此清單建立 ResourceClaim,它請求 example-device-class DeviceClass 中與以下兩個引數都匹配的裝置

  • 具有 driver.example.com/type 屬性且值為 gpu 的裝置。
  • 具有 64Gi 容量的裝置。

要建立 ResourceClaim,請執行以下命令

kubectl apply -f https://k8s.io/examples/dra/resourceclaim.yaml

使用 DRA 在工作負載中請求裝置

要請求裝置分配,請在 Pod 規範的 resourceClaims 欄位中指定 ResourceClaim 或 ResourceClaimTemplate。然後,在 Pod 中容器的 resources.claims 欄位中按名稱請求特定宣告。你可以在 resourceClaims 欄位中指定多個條目,並在不同的容器中使用特定的宣告。

  1. 檢視以下示例 Job

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: example-dra-job
    spec:
      completions: 10
      parallelism: 2
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: container0
            image: ubuntu:24.04
            command: ["sleep", "9999"]
            resources:
              claims:
              - name: separate-gpu-claim
          - name: container1
            image: ubuntu:24.04
            command: ["sleep", "9999"]
            resources:
              claims:
              - name: shared-gpu-claim
          - name: container2
            image: ubuntu:24.04
            command: ["sleep", "9999"]
            resources:
              claims:
              - name: shared-gpu-claim
          resourceClaims:
          - name: separate-gpu-claim
            resourceClaimTemplateName: example-resource-claim-template
          - name: shared-gpu-claim
            resourceClaimName: example-resource-claim
    

    此 Job 中的每個 Pod 都具有以下屬性

    • 為容器提供名為 separate-gpu-claim 的 ResourceClaimTemplate 和名為 shared-gpu-claim 的 ResourceClaim。
    • 執行以下容器
      • container0 請求 separate-gpu-claim ResourceClaimTemplate 中的裝置。
      • container1container2 共享訪問 shared-gpu-claim ResourceClaim 中的裝置。
  2. 建立 Job

    kubectl apply -f https://k8s.io/examples/dra/dra-example-job.yaml
    

嘗試以下故障排除步驟

  1. 當工作負載未按預期啟動時,從 Job 深入到 Pod,再深入到 ResourceClaims,並使用 kubectl describe 檢查每個級別的物件,檢視是否有任何狀態欄位或事件可以解釋工作負載未啟動的原因。
  2. 當建立 Pod 失敗並顯示 must specify one of: resourceClaimName, resourceClaimTemplateName 時,請檢查 pod.spec.resourceClaims 中的所有條目是否都只設置了這兩個欄位中的一個。如果確實如此,則可能是叢集中安裝了針對 Kubernetes < 1.32 API 構建的 mutating Pod webhook。請與叢集管理員聯絡以檢查此問題。

清理

要刪除在此任務中建立的 Kubernetes 物件,請按照以下步驟操作

  1. 刪除示例 Job

    kubectl delete -f https://k8s.io/examples/dra/dra-example-job.yaml
    
  2. 要刪除你的資源宣告,請執行以下命令之一

    • 刪除 ResourceClaimTemplate

      kubectl delete -f https://k8s.io/examples/dra/resourceclaimtemplate.yaml
      
    • 刪除 ResourceClaim

      kubectl delete -f https://k8s.io/examples/dra/resourceclaim.yaml
      

下一步

上次修改時間為太平洋標準時間 2025 年 7 月 2 日下午 6:43:DRA:1.34 版核心更新 (36162b1107)