使用 DRA 為工作負載分配裝置
Kubernetes v1.34 [穩定]
(預設啟用:true)本頁面介紹如何使用動態資源分配(DRA)將裝置分配給 Pod。這些說明適用於工作負載操作員。在閱讀本頁面之前,請熟悉 DRA 的工作原理以及 DRA 術語,例如 ResourceClaims 和 ResourceClaimTemplates。有關更多資訊,請參閱 動態資源分配 (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
欄位中指定多個條目,並在不同的容器中使用特定的宣告。
檢視以下示例 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 中的裝置。container1
和container2
共享訪問shared-gpu-claim
ResourceClaim 中的裝置。
- 為容器提供名為
建立 Job
kubectl apply -f https://k8s.io/examples/dra/dra-example-job.yaml
嘗試以下故障排除步驟
- 當工作負載未按預期啟動時,從 Job 深入到 Pod,再深入到 ResourceClaims,並使用
kubectl describe
檢查每個級別的物件,檢視是否有任何狀態欄位或事件可以解釋工作負載未啟動的原因。 - 當建立 Pod 失敗並顯示
must specify one of: resourceClaimName, resourceClaimTemplateName
時,請檢查pod.spec.resourceClaims
中的所有條目是否都只設置了這兩個欄位中的一個。如果確實如此,則可能是叢集中安裝了針對 Kubernetes < 1.32 API 構建的 mutating Pod webhook。請與叢集管理員聯絡以檢查此問題。
清理
要刪除在此任務中建立的 Kubernetes 物件,請按照以下步驟操作
刪除示例 Job
kubectl delete -f https://k8s.io/examples/dra/dra-example-job.yaml
要刪除你的資源宣告,請執行以下命令之一
刪除 ResourceClaimTemplate
kubectl delete -f https://k8s.io/examples/dra/resourceclaimtemplate.yaml
刪除 ResourceClaim
kubectl delete -f https://k8s.io/examples/dra/resourceclaim.yaml