關於 GKE 中的動態資源分配


本頁面提供 Google Kubernetes Engine (GKE) 中動態資源分配 (DRA) 的相關資訊。本頁面將說明 DRA 的基本概念、在 GKE 中的運作方式,以及使用 DRA 分配 GPU 和 TPU 等硬體的優點。

本頁面適用於下列角色:

閱讀本頁面之前,請先熟悉下列資源:

DRA 簡介

DRA 是 Kubernetes 內建功能,可讓您在叢集中,彈性地要求、分配及共用 Pod 和容器之間的硬體。DRA 可讓裝置供應商和平台管理員宣告可要求和分配的裝置類別,藉此改善附加硬體 (例如加速器) 的分配體驗。應用程式運算子可以在這些類別中要求特定裝置設定,然後在工作負載中要求這些設定。Kubernetes 和 GKE 會根據工作負載要求,管理 Pod 排程、節點指派和裝置分配作業。

舉例來說,平台管理員可以定義只含 NVIDIA A100 GPU 的裝置類別。應用程式營運商接著可以根據工作負載需求篩選該裝置類別中的裝置,例如篩選出 GPU 記憶體至少有 80 GB 的裝置。應用程式運算子部署要求經過篩選設定的工作負載時,GKE 會將 Pod 放置在符合所選條件的節點上。在本範例中,GKE 會找出具有可用 A100 (80 GB) GPU 的節點。應用程式運算子不需要在工作負載資訊清單中選取特定節點或裝置設定。

DRA 的優點

如果沒有 DRA,Kubernetes 中硬體裝置的分配作業會依賴裝置外掛程式。如要使用裝置外掛程式將硬體資源附加至 Pod,請使用節點標籤將 Pod 放置在特定節點上。此外,如要將整個節點的資源專用於單一 Pod,請要求與節點連結的確切裝置數量。

使用 DRA 時,將裝置分配給 Pod 的體驗與分配儲存空間磁碟區類似。您可以定義裝置類別、要求這些類別中的裝置,然後將要求的裝置指派給工作負載。DRA 提供更具擴充性的介面,可根據工作負載和業務需求篩選裝置。使用運算式和範本聲明硬體並排定 Pod 時間的 DRA 方法具有下列優點:

  • 宣告式裝置分配:平台管理員可以為特定類型的工作負載或團隊定義裝置設定。
  • 降低跨團隊的複雜度:平台管理員佈建具有專用硬體設定的節點時,應用程式運算子不需要知道哪些節點具有特定設定。平台管理員不需要標記節點,也不必向作業人員傳達特定節點和裝置的相關資訊。
  • 降低開發人員的複雜度:Kubernetes 會根據參照的裝置設定排定 Pod。應用程式運算子不需要在工作負載中選取特定節點,也不需要確保每個 Pod 要求的裝置數量與這些節點附加的裝置數量完全相同。
  • 集中式基礎架構管理:平台管理員可以集中定義符合特定業務需求的硬體設定。舉例來說,平台管理員可以宣告搭載 H100 GPU 的高效能設定,以及搭載 Tesla T4 GPU 的小型推論設定。
  • 彈性選擇硬體:DRA 可讓您使用 CEL 運算式,篩選出具有特定屬性的裝置。使用運算式可彈性篩選出最適合特定工作負載的裝置。

何時使用 DRA

在預先發布版期間,在 GKE 中使用 DRA 的主要原因,是您可彈性地為工作負載要求裝置。您只需編寫一次資訊清單,即可將工作負載部署到不同叢集,且不必變更資訊清單。這種彈性非常適合下列用途:

  • 提升 GPU 取得率:對於需要存取 GPU 硬體的工作負載,您可以使用 DRA 要求叢集中任何可用的 GPU,不必指定 GPU 型號。如果這些工作負載有特定的 GPU 記憶體 (VRAM) 需求,您可以要求叢集中記憶體容量至少達到最低要求的任何 GPU。這類彈性要求會擴展工作負載可執行的 GPU 節點集,降低工作負載因資源不足而無法排程的風險。
  • 在調度資源期間,盡量提供 GPU 節點:工作負載所需的附加 GPU 數量可能會因 GPU 類型而異。您可以透過 GKE 運算類別,根據 GPU 可用性、配額或容量預留項目佈建節點。然後,您可以在工作負載中使用 DRA,將 Pod 設定為在 GKE 為運算類別佈建的任何節點上執行。搭配使用 DRA 與運算類別,可盡量減少非預期工作負載的風險,同時確保工作負載在最佳化硬體上執行。

術語

開放原始碼 Kubernetes 和 GKE 等代管 Kubernetes 供應商會使用下列 DRA 術語:

ResourceSlice
ResourceSlice 會列出叢集中節點可存取的一或多個硬體裝置。 舉例來說,在可存取單一 GPU 的節點中,ResourceSlice 會列出 GPU 和節點名稱。每個節點上的 DRA 裝置驅動程式都會建立 ResourceSlice。Kubernetes 排程器會使用 ResourceSlice 決定要分配哪些裝置,以滿足工作負載要求。
DeviceClass
DeviceClass 定義裝置類別,例如可供工作負載要求的 GPU。 部分裝置驅動程式提供內建的 DeviceClass,例如 NVIDIA GPU 的 gpu.nvidia.com DeviceClass。平台管理員也可以建立自訂 DeviceClass,定義特定裝置設定。
ResourceClaim

Pod 或使用者可透過 ResourceClaim,依據 DeviceClass 內的特定參數篩選硬體資源。工作負載參照 ResourceClaim 時,Kubernetes 會將符合指定參數的裝置指派給該 ResourceClaim。

舉例來說,假設您為一個 A100 (40 GB) GPU 建立 ResourceClaim,然後部署選取該 ResourceClaim 的工作負載。Kubernetes 會將可用的 A100 (40 GB) GPU 指派給 ResourceClaim,並在可存取該 GPU 的節點上排定 Pod。

ResourceClaimTemplate

ResourceClaimTemplate 定義 Pod 可用來自動建立每個 Pod 的新 ResourceClaim 的範本。當多個工作負載需要存取類似的裝置設定時,ResourceClaimTemplate 就非常實用,特別是使用 Deployment 或 StatefulSet 等工作負載控制器時。

應用程式運算子會部署 ResourceClaimTemplates,然後在工作負載中參照範本。Kubernetes 會根據指定的範本為每個 Pod 建立 ResourceClaim,並分配裝置和排程 Pod。Pod 終止時,Kubernetes 會清除對應的 ResourceClaim。

動態再行銷廣告的運作方式

在叢集和工作負載中使用 DRA 的體驗,與使用 StorageClass、PersistentVolumeClaim 和 PersistentVolume 為 Pod 動態佈建磁碟區類似。

下圖顯示叢集管理員和應用程式運算子使用 DRA 分配裝置的步驟:

在這個圖表中,叢集管理員和應用程式運算子會執行下列操作:

  1. 叢集管理員會在節點中安裝支援 DRA 的裝置驅動程式。
  2. 叢集管理員會建立 DeviceClass,篩選出符合特定需求的硬體,例如記憶體超過 40 GB 的所有 GPU。部分裝置也可能內建 DeviceClass。
  3. 應用程式運算子會建立 ResourceClaimTemplates 或 ResourceClaims,要求裝置設定。各類型聲明的主要用途如下:
    • ResourceClaim 可讓多個 Pod 共用同一個裝置的存取權。
    • ResourceClaimTemplate 會自動為每個 Pod 生成 ResourceClaim,讓多個 Pod 存取不同的類似裝置。
  4. 應用程式運算子會將 ResourceClaimTemplates 或 ResourceClaims 新增至工作負載資訊清單。
  5. 應用程式運算子會部署工作負載。

部署參照 ResourceClaimTemplate 或 ResourceClaim 的工作負載時,Kubernetes 會執行下列排程步驟:

  1. 如果工作負載參照 ResourceClaimTemplate,Kubernetes 會為工作負載的每個執行個體建立新的 ResourceClaim 物件 (例如 Deployment 中的每個副本)。
  2. Kubernetes 排程器會使用叢集中的 ResourceSlice,將符合資格的可用裝置分配給每個 Pod 的 ResourceClaim。
  3. 排程器會將每個 Pod 放在可存取裝置的節點上,這些裝置已分配給 Pod 的 ResourceClaim。
  4. 目的地節點上的 kubelet 會呼叫節點上的 DRA 驅動程式,將已分配的硬體附加至 Pod,以滿足其資源要求。

使用 ResourceClaim 和 ResourceClaimTemplate 的時機

ResourceClaim 和 ResourceClaimTemplate 都可讓您向 Kubernetes 指出,您需要符合特定需求的裝置。在 Pod 中參照 ResourceClaim 時,Kubernetes 會在 Kubernetes API 伺服器中,將裝置分配給對應的 ResourceClaim API 資源。無論您是否已建立 ResourceClaim,或 Kubernetes 是否從 ResourceClaimTemplate 建立 ResourceClaim,都會發生這種分配情形。

如果您建立 ResourceClaim,然後在多個 Pod 中參照該項目,所有這些 Pod 都可以存取 Kubernetes 為該 ResourceClaim 分配的裝置。舉例來說,如果您在具有多個副本的 Deployment 資訊清單中參照特定 ResourceClaim,就可能會發生這種共用存取權的情況。不過,如果分配的裝置未設定為可供多個程序共用,跨 Pod 共用裝置存取權可能會導致非預期的行為。

ResourceClaimTemplate 可讓您定義 Kubernetes 用來自動為 Pod 建立個別 ResourceClaim 的範本。舉例來說,如果您在具有多個副本的 Deployment 中參照 ResourceClaimTemplate,Kubernetes 會為每個複製的 Pod 建立個別的 ResourceClaim。因此,每個 Pod 都會取得自己的專屬裝置,而不是與其他 Pod 共用裝置存取權。這些自動產生的 ResourceClaim 會繫結至對應 Pod 的生命週期,並在 Pod 終止時刪除。如果您有需要存取類似裝置設定的獨立 Pod,請使用 ResourceClaimTemplate 將裝置分別分配給每個 Pod。

下表說明手動建立 ResourceClaim,以及讓 Kubernetes 從 ResourceClaimTemplate 建立 ResourceClaim 之間的一些差異:

手動建立的 ResourceClaim 自動建立的 ResourceClaim
由您管理 由 Kubernetes 管理
從多個 Pod 存取相同裝置 從單一 Pod 存取裝置
獨立於 Pod 存在於叢集中 與對應 Pod 的生命週期繫結
適合需要共用特定裝置的多個工作負載 適合需要獨立存取裝置的多個工作負載

比較 DRA 與手動裝置分配

DRA 可讓附加裝置的分配體驗,與動態佈建 PersistentVolume 類似。Kubernetes 也支援使用裝置外掛程式分配裝置。這個方法包含下列步驟:

  1. 叢集管理員會建立已連結裝置 (例如 GPU) 的節點。
  2. 叢集管理員會將特定節點及其附加裝置的相關資訊,提供給工作負載運算子。
  3. 工作負載運算子會依下列方式,在工作負載資訊清單中要求裝置:
    • 使用 nodeSelector 欄位選取具有所需裝置設定的節點,例如 GPU 型號或 TPU 類型和拓撲。
    • 在 Pod 規格中使用 resources 欄位,為容器指定要使用的確切裝置數量。

這種手動分配方法需要應用程式運算子和叢集管理員溝通,瞭解哪些特定節點或節點集區具有特定裝置設定。他們必須協調工作負載要求,以符合節點上的裝置,否則部署作業會失敗。相較之下,DRA 可讓您使用運算式,根據屬性彈性篩選裝置,且不需要工作負載運算子瞭解叢集中節點的確切設定。

下表比較 DRA 與裝置外掛程式:

DRA 手動分配
使用 CEL 運算式彈性選取裝置 使用選取器和資源要求選取特定節點
Kubernetes 採取的排程決策 使用節點選取器排定運算子做出的排程決策
裝置篩選與工作負載建立作業是分開進行 裝置篩選作業必須在工作負載資訊清單中完成
平台管理員集中管理裝置篩選和需求導向課程 應用程式運算子篩選隔離裝置
應用程式運算子不需要知道節點容量、節點標籤資訊,或每個節點的附加裝置型號 應用程式運算子必須知道哪些節點有特定模型,以及所連裝置的數量。

支援 DRA 的 GKE 裝置

您可以使用 DRA 將 GPU 或 TPU 分配給 GKE 工作負載。您可以分配 GKE 支援的任何 GPU 和 TPU 模型。如要進一步瞭解 GKE 支援的 GPU 和 TPU,請參閱下列資源:

GKE 中 DRA 的限制

在 GKE 叢集中,DRA 有下列限制:

  • 您無法將 DRA 與節點自動佈建功能搭配使用。
  • 您無法將 DRA 與下列 GPU 共用功能搭配使用:
    • 分時共用 GPU。
    • 多執行個體 GPU。
    • 多程序服務 (MPS)。
  • 您無法在 Autopilot 叢集中使用 DRA。
  • 您必須使用 GKE 1.32.1-gke.1489001 以上版本。

本節提供平台管理員或應用程式運算子相關建議,協助他們使用 DRA 將裝置分配給工作負載。DRA 大幅改變了要求附加裝置的方法,無論是在 GKE 還是 Kubernetes 中都是如此。如要使用更進階的用途,例如跨裝置備援或精細的裝置篩選和選取,請參閱下列指南:

在資源調度期間提高節點可用性

在 GKE 中,您可以透過 ComputeClass 定義 GKE 在叢集中建立新節點時,遵循的優先順序式備援行為。您可以使用 ComputeClass 設定節點和裝置配置的優先順序,GKE 會在建立節點以執行工作負載時使用這些設定。接著,您可以使用 DRA 確保工作負載可在 ComputeClass 內的任何節點上執行,不必依標籤手動選取節點。

舉例來說,工作負載可能需要兩個 NVIDIA L4 GPU 或一個 NVIDIA A100 (40 GB) GPU,才能以最佳狀態執行。您可以建立 ComputeClass,優先建立搭載一個 A100 (40 GB) GPU 的節點,但可改為建立每個節點搭載兩個 L4 GPU 的節點。然後使用 DRA 為工作負載要求任何可用的 GPU。部署工作負載並選取該 ComputeClass 時,GKE 會建立具有指定 GPU 設定的節點。有了 DRA,GKE 就能將工作負載放置在第一個可用節點上,無論 GPU 型號、節點標籤或 GPU 數量為何。

詳情請參閱以下頁面:

後續步驟