使用預留區域資源

本頁說明如何在特定 GKE 工作負載中,使用預留的 Compute Engine 可用區資源。這些容量預留項目可確保工作負載能使用特定硬體。

請確認您已熟悉 Compute Engine 預留項目的概念,例如消耗類型、共用類型和佈建類型。詳情請參閱「Compute Engine 可用區資源的預留項目」。

本頁面適用於下列人員:

  • 應用程式運算子 部署應盡快執行的工作負載,通常使用 GPU 等專用硬體。
  • 平台管理員 希望確保工作負載在最佳化硬體上執行,且符合應用程式和機構需求。

關於 GKE 中的預留項目用量

Compute Engine 容量預留項目可讓您在 Google Cloud 區域中佈建特定硬體設定,無論是立即佈建或在未來指定時間佈建都可以。接著,您可以在 GKE 中使用這項預留容量。

視 GKE 作業模式而定,您可以採用下列預留類型:

  • Autopilot 模式:特定預留項目,或使用自訂 ComputeClass 的任何相符預留項目。
  • 標準模式:特定預留項目或任何相符的預留項目。

針對 any 相符的預留項目,您可以選擇下列兩種行為:

  • 任何相符的預留項目 (含備用):嘗試使用任何相符的預留項目。如果沒有,系統會改為佈建標準隨選容量。
  • 任何不含備援的相符預留項目:嘗試使用任何相符的預留項目。如果沒有可用的容量,佈建作業就會失敗,不會改用隨選容量。

如要啟用預留項目,以便建立資源,您必須指定預留項目相依性,例如 any、any-reservation-then-fail 或 specific。

GKE 中的預留項目用量選項

GKE 可讓您在工作負載資訊清單中使用 Kubernetes nodeSelector,或建立使用預留項目的標準模式節點集區,直接在個別工作負載中使用預留項目。本頁面說明直接在個別資源中選取預留項目的方法。

您也可以使用自訂運算類別,設定 GKE 在建立新節點的擴充作業期間使用預留項目。平台管理員可透過自訂運算類別,為 GKE 定義節點設定的階層,以便在節點調度期間優先使用,確保工作負載在所選硬體上執行。

您可以在自訂運算類別設定中指定預留項目,這樣一來,任何使用該自訂 ComputeClass 的 GKE 工作負載,都會指示 GKE 使用該 ComputeClass 的指定預留項目。

詳情請參閱「關於自訂運算類別」頁面的「耗用 Compute Engine 預留項目」。

事前準備

開始之前,請務必先完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
* 建立 Autopilot 叢集。

使用 Autopilot 叢集中的預留容量

Autopilot 叢集支援取用相同專案或共用專案中 Compute Engine 容量預留項目的資源。您可以將目標預訂的消耗類型屬性設為 specific,並在資訊清單中明確選取該預訂。或者,您也可以使用自訂 ComputeClass 和 AnyBestEffort 預留項目親和性,取用任何相符的預留項目。如果您未明確指定預留項目,或設定自訂 ComputeClass 來耗用預留項目,Autopilot 叢集就不會耗用預留項目。如要進一步瞭解預留項目用量類型,請參閱「預留項目的運作方式」。

這些預留項目符合 Compute 彈性承諾使用折扣的資格。您必須使用 Performance ComputeClass 或 Pod 要求加速器,才能使用容量預留項目。

如要使用任何可用的預留項目,而不改用隨選運算資源,叢集必須執行 GKE 1.36.0-gke.3204000 以上版本。

為 Autopilot 建立運算資源預留項目

Autopilot Pod 可以使用與叢集位於同一專案的預留項目,或使用來自不同專案的共用預留項目,但這些預留項目必須具有特定用量類型屬性。您可以在資訊清單中明確參照預留硬體,也可以使用自訂 ComputeClasses 消耗任何相符的預留硬體。您可以在 Autopilot 中使用下列類型的硬體預訂:

  • 下列任一類型的 GPU:

    • nvidia-gb200:NVIDIA GB200 (預先發布版)
    • nvidia-b200:NVIDIA B200 (180 GB)
    • nvidia-h200-141gb:NVIDIA H200 (141GB)
    • nvidia-h100-mega-80gb:NVIDIA H100 Mega (80 GB)
    • nvidia-h100-80gb:NVIDIA H100 (80 GB)
    • nvidia-a100-80gb:NVIDIA A100 (80GB)
    • nvidia-tesla-a100:NVIDIA A100 (40GB)
    • nvidia-rtx-pro-6000:NVIDIA RTX PRO 6000
    • nvidia-l4:NVIDIA L4
    • nvidia-tesla-t4:NVIDIA T4

  • 下列任一類型的 TPU:

    • tpu7x:Ironwood (TPU7x)
    • tpu-v6e-slice:TPU v6e 配量
    • tpu-v5p-slice:TPU v5p 配量
    • tpu-v5-lite-podslice:TPU v5 Lite PodSlice
    • tpu-v4-lite-device:TPU v4 Lite 裝置
    • tpu-v4-podslice:TPU v4 PodSlice
    • tpu-v3-device:TPU v3 裝置
    • tpu-v3-slice:TPU v3 PodSlice

如要建立運算資源預留項目,請參閱下列資源。預訂必須符合下列規定:

  • 機器類型、加速器類型和加速器數量與工作負載消耗的資源相符。
  • 預留項目會使用「特定」消耗類型,除非您使用自訂 ComputeClass 消耗「任何」相符的預留項目。舉例來說,在 gcloud CLI 中,建立特定預訂時,您必須指定 --require-specific-reservation 旗標。

  • 為單一專案建立預留項目

  • 建立共用預留項目

GKE 會自動將所選特定預留項目的任何本機 SSD 附加至節點。您不需要在工作負載資訊清單中選取個別的本機 SSD。舉例來說,如果您選取的預留項目包含兩個本機 SSD,則 GKE 從該預留項目建立的節點會附加兩個本機 SSD。

在 Autopilot 中使用任何相符的預留項目 (可回溯)

本節說明如何設定 Autopilot 工作負載,以使用任何相符的預訂容量,並在預訂容量不足時改用隨選容量。方法是建立自訂 ComputeClass,並指定 AnyBestEffort 預留項目相似度。

  1. 將下列自訂 ComputeClass 資訊清單儲存為 any-reservation-cc.yaml:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: any-reservation
    spec:
      priorities:
      - reservations:
          affinity: AnyBestEffort
    
  2. 建立自訂 ComputeClass:

    kubectl apply -f any-reservation-cc.yaml
    
  3. 將下列 Pod 資訊清單儲存為 any-reservation-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: any-reservation-pod
    spec:
      nodeSelector:
        cloud.google.com/compute-class: any-reservation
      containers:
      - name: my-container
        image: "k8s.gcr.io/pause"
        resources:
          requests:
            cpu: 2
            memory: "4Gi"
    
  4. 部署 Pod:

    kubectl apply -f any-reservation-pod.yaml
    

在 Autopilot 中使用任何相符的預留項目,不設備用選項

本節說明如何設定 Autopilot 工作負載,以便使用任何相符的預留項目,而不會在預留項目用盡時改用隨選運算資源。方法是建立自訂 ComputeClass,指定 AnyThenFail 預留項目相似度,並將 whenUnsatisfiable 欄位的值設為 DoNotScaleUp。這項預留資源親和性功能需要 GKE 1.36.0-gke.3204000 以上版本。

  1. 將下列自訂 ComputeClass 資訊清單儲存為 any-then-fail-cc.yaml:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: any-then-fail
    spec:
      priorities:
      - reservations:
          affinity: AnyThenFail
        whenUnsatisfiable: DoNotScaleUp
    
  2. 建立自訂 ComputeClass:

    kubectl apply -f any-then-fail-cc.yaml
    
  3. 將下列 Pod 資訊清單儲存為 any-then-fail-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: any-then-fail-pod
    spec:
      nodeSelector:
        cloud.google.com/compute-class: any-then-fail
      containers:
      - name: my-container
        image: "k8s.gcr.io/pause"
        resources:
          requests:
            cpu: 2
            memory: "4Gi"
    
  4. 部署 Pod:

    kubectl apply -f any-then-fail-pod.yaml
    

在 Autopilot 中使用同一專案的特定預留項目

本節說明如何使用與叢集位於相同專案中的特定容量預留項目。您可以使用 kubectl 或 Terraform。

kubectl

  1. 將下列資訊清單儲存為 specific-autopilot.yaml。這個資訊清單具有節點選取器,可使用特定預留項目。您可以使用 VM 執行個體或加速器。

    VM 執行個體

      apiVersion: v1
      kind: Pod
      metadata:
        name: specific-same-project-pod
      spec:
        nodeSelector:
          cloud.google.com/compute-class: Performance
          cloud.google.com/machine-family: MACHINE_SERIES
          cloud.google.com/reservation-name: RESERVATION_NAME
          cloud.google.com/reservation-affinity: "specific"
        containers:
        - name: my-container
          image: "k8s.gcr.io/pause"
          resources:
            requests:
              cpu: 2
              memory: "4Gi"
    

    更改下列內容:

    • MACHINE_SERIES:機器系列,包含特定預留容量中 VM 的機型。舉例來說,如果預留項目是 c3-standard-4 機型,請在 MACHINE_SERIES 欄位中指定 c3。
    • RESERVATION_NAME:Compute Engine 容量預留項目的名稱。

    GPU 加速器

      apiVersion: v1
      kind: Pod
      metadata:
        name: specific-same-project-pod
      spec:
        nodeSelector:
          cloud.google.com/gke-accelerator: ACCELERATOR
          cloud.google.com/reservation-name: RESERVATION_NAME
          cloud.google.com/reservation-affinity: "specific"
        containers:
        - name: my-container
          image: "k8s.gcr.io/pause"
          resources:
            requests:
              cpu: 12
              memory: "50Gi"
              ephemeral-storage: "200Gi"
            limits:
              nvidia.com/gpu: QUANTITY
    

    更改下列內容:

    • ACCELERATOR:您在 Compute Engine 容量預留中預留的加速器。必須是下列其中一個值:
      • nvidia-gb200:NVIDIA GB200 (預先發布版)
      • nvidia-b200:NVIDIA B200 (180 GB)
      • nvidia-h200-141gb:NVIDIA H200 (141GB)
      • nvidia-h100-mega-80gb:NVIDIA H100 Mega (80 GB)
      • nvidia-h100-80gb:NVIDIA H100 (80 GB)
      • nvidia-a100-80gb:NVIDIA A100 (80GB)
      • nvidia-tesla-a100:NVIDIA A100 (40GB)
      • nvidia-rtx-pro-6000:NVIDIA RTX PRO 6000
      • nvidia-l4:NVIDIA L4
      • nvidia-tesla-t4:NVIDIA T4
    • RESERVATION_NAME:Compute Engine 容量預留項目的名稱。
    • QUANTITY:要附加至容器的 GPU 數量。必須是指定 GPU 支援的數量,詳情請參閱「支援的 GPU 數量」。

    TPU 加速器

      apiVersion: v1
      kind: Pod
      metadata:
        name: specific-same-project-pod
      spec:
        nodeSelector:
          cloud.google.com/gke-tpu-accelerator: ACCELERATOR
          cloud.google.com/gke-tpu-topology: TOPOLOGY
          cloud.google.com/reservation-name: RESERVATION_NAME
          cloud.google.com/reservation-affinity: "specific"
        containers:
        - name: my-container
          image: "k8s.gcr.io/pause"
          resources:
            requests:
              cpu: 12
              memory: "50Gi"
              ephemeral-storage: "200Gi"
            limits:
              google.com/tpu: QUANTITY
    

    更改下列內容:

    • ACCELERATOR:您在 Compute Engine 容量預留中預留的加速器。必須是下列其中一個值:
      • tpu7x:Ironwood (TPU7x)
      • tpu-v6e-slice:TPU v6e 配量
      • tpu-v5p-slice:TPU v5p 配量
      • tpu-v5-lite-podslice:TPU v5 Lite PodSlice
      • tpu-v4-lite-device:TPU v4 Lite 裝置
      • tpu-v4-podslice:TPU v4 PodSlice
      • tpu-v3-device:TPU v3 裝置
      • tpu-v3-slice:TPU v3 PodSlice
    • TOPOLOGY:TPU 拓撲。
    • RESERVATION_NAME:Compute Engine 預留容量的名稱。
    • QUANTITY:要附加至容器的 TPU 數量。必須與 TPU 拓撲一致。
  2. 部署 Pod:

    kubectl apply -f specific-autopilot.yaml
    

Autopilot 會使用指定預留項目中的預留容量,佈建新節點來放置 Pod。

Terraform

如要使用 Terraform 透過 VM 執行個體使用同一專案中的特定預留項目,請參考下列範例:

resource "kubernetes_pod_v1" "default_pod" {
  metadata {
    name = "specific-same-project-pod"
  }

  spec {
    node_selector = {
      "cloud.google.com/compute-class"        = "Performance"
      "cloud.google.com/machine-family"       = "c3"
      "cloud.google.com/reservation-name"     = google_compute_reservation.specific_pod.name
      "cloud.google.com/reservation-affinity" = "specific"
    }

    container {
      name  = "my-container"
      image = "registry.k8s.io/pause"

      resources {
        requests = {
          cpu               = 2
          memory            = "8Gi"
          ephemeral-storage = "1Gi"
        }
      }

      security_context {
        allow_privilege_escalation = false
        run_as_non_root            = false

        capabilities {
          add  = []
          drop = ["NET_RAW"]
        }
      }
    }

    security_context {
      run_as_non_root     = false
      supplemental_groups = []

      seccomp_profile {
        type = "RuntimeDefault"
      }
    }
  }

  depends_on = [
    google_compute_reservation.specific_pod
  ]
}

如要使用 Terraform 消耗相同專案中的特定預留項目,請參閱下列範例:

resource "kubernetes_pod_v1" "default_accelerator" {
  metadata {
    name = "specific-same-project-accelerator"
  }

  spec {
    node_selector = {
      "cloud.google.com/compute-class"        = "Accelerator"
      "cloud.google.com/gke-accelerator"      = "nvidia-l4"
      "cloud.google.com/reservation-name"     = google_compute_reservation.specific_accelerator.name
      "cloud.google.com/reservation-affinity" = "specific"
    }

    container {
      name  = "my-container"
      image = "registry.k8s.io/pause"

      resources {
        requests = {
          cpu               = 2
          memory            = "7Gi"
          ephemeral-storage = "1Gi"
          "nvidia.com/gpu"  = 1

        }
        limits = {
          "nvidia.com/gpu" = 1
        }
      }

      security_context {
        allow_privilege_escalation = false
        run_as_non_root            = false

        capabilities {
          add  = []
          drop = ["NET_RAW"]
        }
      }
    }

    security_context {
      run_as_non_root     = false
      supplemental_groups = []

      seccomp_profile {
        type = "RuntimeDefault"
      }
    }
  }

  depends_on = [
    google_compute_reservation.specific_accelerator
  ]
}

如要進一步瞭解如何使用 Terraform,請參閱「GKE 的 Terraform 支援」。

在 Autopilot 中耗用特定共用預留項目

本節使用下列詞彙:

  • 擁有者專案:擁有預留項目並與其他專案共用該項目的專案。
  • 消費者專案:執行工作負載的專案,這些工作負載會耗用共用預留項目。

如要使用特定共用預留資源,請設定 Identity and Access Management (IAM) 權限,允許用戶專案的 GKE 服務代理存取擁有者專案中的預留資源。

在擁有共用預留項目的專案中,完成下列步驟:

  1. 在擁有者專案中建立包含 compute.reservations.list 權限的自訂 IAM 角色:

    gcloud iam roles create ROLE_NAME \
        --project=OWNER_PROJECT_ID \
        --permissions='compute.reservations.list'
    

    更改下列內容:

    • ROLE_NAME:新角色的名稱。
    • OWNER_PROJECT_ID:擁有運算資源預留項目的專案 ID。
  2. 授予用戶專案中的 GKE 服務代理權限,以便列出擁有者專案中的共用預留項目:

    gcloud projects add-iam-policy-binding OWNER_PROJECT_ID \
        --project=OWNER_PROJECT_ID \
        --member=serviceAccount:service-CONSUMER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --role='projects/OWNER_PROJECT_ID/roles/ROLE_NAME'
    

    將 CONSUMER_PROJECT_NUMBER 替換為用戶專案的數字編號。如要尋找這個號碼,請參閱 Resource Manager 說明文件中的「識別專案」。

  3. 將下列資訊清單儲存為 shared-autopilot.yaml。這個資訊清單含有 nodeSelector,可告知 GKE 要使用特定共用預留空間。

    VM 執行個體

    apiVersion: v1
    kind: Pod
    metadata:
      name: performance-pod
    spec:
      nodeSelector:
        cloud.google.com/compute-class: Performance
        cloud.google.com/machine-family: MACHINE_SERIES
        cloud.google.com/reservation-name: RESERVATION_NAME
        cloud.google.com/reservation-project: OWNER_PROJECT_ID
        cloud.google.com/reservation-affinity: "specific"
      containers:
      - name: my-container
        image: "k8s.gcr.io/pause"
        resources:
          requests:
            cpu: 2
            memory: "4Gi"
    

    更改下列內容:

    • MACHINE_SERIES:機器系列,包含特定容量預留項目中 VM 的機型。舉例來說,如果預留項目適用於 c3-standard-4 機型,請在 MACHINE_SERIES 欄位中指定 c3。
    • RESERVATION_NAME:Compute Engine 預留容量的名稱。
    • OWNER_PROJECT_ID:擁有容量預留項目的專案 ID。

    GPU 加速器

    apiVersion: v1
    kind: Pod
    metadata:
      name: specific-same-project-pod
    spec:
      nodeSelector:
        cloud.google.com/gke-accelerator: ACCELERATOR
        cloud.google.com/reservation-name: RESERVATION_NAME
        cloud.google.com/reservation-project: OWNER_PROJECT_ID
        cloud.google.com/reservation-affinity: "specific"
      containers:
      - name: my-container
        image: "k8s.gcr.io/pause"
        resources:
          requests:
            cpu: 12
            memory: "50Gi"
            ephemeral-storage: "200Gi"
          limits:
            nvidia.com/gpu: QUANTITY
    

    更改下列內容:

    • ACCELERATOR:您在 Compute Engine 預留容量中預留的加速器。必須是下列其中一個值:
      • nvidia-gb200:NVIDIA GB200 (預先發布版)
      • nvidia-b200:NVIDIA B200 (180 GB)
      • nvidia-h200-141gb:NVIDIA H200 (141GB)
      • nvidia-h100-mega-80gb:NVIDIA H100 Mega (80 GB)
      • nvidia-h100-80gb:NVIDIA H100 (80 GB)
      • nvidia-a100-80gb:NVIDIA A100 (80GB)
      • nvidia-tesla-a100:NVIDIA A100 (40GB)
      • nvidia-rtx-pro-6000:NVIDIA RTX PRO 6000
      • nvidia-l4:NVIDIA L4
      • nvidia-tesla-t4:NVIDIA T4
    • RESERVATION_NAME:Compute Engine 容量預留的名稱。
    • OWNER_PROJECT_ID:擁有容量預留項目的專案 ID。
    • QUANTITY:要附加至容器的 GPU 數量。必須是指定 GPU 支援的數量,詳情請參閱「支援的 GPU 數量」。

    TPU 加速器

    apiVersion: v1
    kind: Pod
    metadata:
      name: specific-shared-project-pod
    spec:
      nodeSelector:
        cloud.google.com/gke-tpu-accelerator: ACCELERATOR
        cloud.google.com/gke-tpu-topology: TOPOLOGY
        cloud.google.com/reservation-name: RESERVATION_NAME
        cloud.google.com/reservation-project: OWNER_PROJECT_ID
        cloud.google.com/reservation-affinity: "specific"
      containers:
      - name: my-container
        image: "k8s.gcr.io/pause"
        resources:
          requests:
            cpu: 12
            memory: "50Gi"
            ephemeral-storage: "200Gi"
          limits:
            google.com/tpu: QUANTITY
    

    更改下列內容:

    • ACCELERATOR:您在 Compute Engine 容量預留中預留的加速器。必須是下列其中一個值:
      • tpu7x:Ironwood (TPU7x)
      • tpu-v6e-slice:TPU v6e 配量
      • tpu-v5p-slice:TPU v5p 配量
      • tpu-v5-lite-podslice:TPU v5 Lite PodSlice
      • tpu-v4-lite-device:TPU v4 Lite 裝置
      • tpu-v4-podslice:TPU v4 PodSlice
      • tpu-v3-device:TPU v3 裝置
      • tpu-v3-slice:TPU v3 PodSlice
    • TOPOLOGY:TPU 拓撲。
    • RESERVATION_NAME:Compute Engine 容量預留項目的名稱。
    • OWNER_PROJECT_ID:擁有容量預留項目的專案 ID。
    • QUANTITY:要附加至容器的 TPU 數量。必須與 TPU 拓撲一致。
  4. 部署 Pod:

    kubectl apply -f shared-autopilot.yaml
    

Autopilot 會使用指定預留項目中的預留容量,佈建新節點來放置 Pod。

在 Autopilot 中使用特定預留項目模塊

本節說明如何使用與叢集位於相同專案或共用專案中的特定容量預留項目區塊。這項功能僅適用於特定加速器。您可以使用 kubectl,將 Pod 設為使用預留區塊。

  1. 將下列資訊清單儲存為 reservation-block-autopilot.yaml。這個資訊清單具有節點選取器,可使用特定預留項目。

    Local Project

    apiVersion: v1
    kind: Pod
    metadata:
      name: specific-same-project-pod
    spec:
      nodeSelector:
        cloud.google.com/gke-accelerator: ACCELERATOR
        cloud.google.com/reservation-name: RESERVATION_NAME
        cloud.google.com/reservation-affinity: "specific"
        cloud.google.com/reservation-blocks: RESERVATION_BLOCKS_NAME
      
      containers:
      - name: my-container
        image: "k8s.gcr.io/pause"
        resources:
          requests:
            cpu: 12
            memory: "50Gi"
            ephemeral-storage: "200Gi"
          limits:
            nvidia.com/gpu: QUANTITY
    

    更改下列內容:

    • ACCELERATOR:您在 Compute Engine 容量預留中預留的加速器。必須是下列其中一個值:
      • nvidia-b200:NVIDIA B200 (180 GB)
      • nvidia-h200-141gb:NVIDIA H200 (141 GB)
    • RESERVATION_NAME:Compute Engine 容量預留項目的名稱。
    • RESERVATION_BLOCKS_NAME:Compute Engine 容量預留區塊的名稱。
    • QUANTITY:要附加至容器的 GPU 數量。必須是指定 GPU 支援的數量,詳情請參閱「支援的 GPU 數量」。

    如果是其他專案擁有的預留項目,請在 spec.nodeSelector 欄位中新增 cloud.google.com/reservation-project: OWNER_PROJECT_ID。將 OWNER_PROJECT_ID 替換為擁有容量預留項目的專案 ID。

  2. 部署 Pod:

    kubectl apply -f reservation-block-autopilot.yaml
    

    Autopilot 會使用指定預留區塊中的預留容量,佈建新節點來放置 Pod。

在 Autopilot 中耗用特定預留子區塊

本節說明如何使用與叢集位於相同專案或共用專案中的特定容量預留子區塊。

  1. 將下列 ComputeClass 資訊清單儲存為 reservation-sub-block-computeclass.yaml:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: specific-reservation-subblock
    spec:
      nodePoolAutoCreation:
        enabled: true
      priorities:
      - gpu:
          type: ACCELERATOR_TYPE
          count: ACCELERATOR_COUNT
        reservations:
          affinity: Specific
          specific:
          - name: RESERVATION_NAME
            project: RESERVATION_PROJECT_ID
            reservationBlock:
              name: RESERVATION_BLOCK_NAME
              reservationSubBlock:
                name: RESERVATION_SUB_BLOCK_NAME
    

    更改下列內容:

    • ACCELERATOR_TYPE:您在 Compute Engine 預留容量中預留的加速器。這個值必須是 nvidia-gb200。
    • ACCELERATOR_COUNT:要附加至每個節點的加速器數量。這個值必須是指定加速器類型支援的數量。詳情請參閱「支援的 GPU 數量」。
    • RESERVATION_NAME:Compute Engine 預留容量的名稱。
    • RESERVATION_PROJECT_ID:擁有容量預留項目的專案 ID。
    • RESERVATION_BLOCK_NAME:Compute Engine 容量預留區塊的名稱。
    • RESERVATION_SUB_BLOCK_NAME:Compute Engine 容量預留子區塊的名稱。
  2. 將下列 Pod 資訊清單儲存為 reservation-sub-block-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: reservation-sub-block-pod
    spec:
      nodeSelector:
        cloud.google.com/compute-class: specific-reservation-subblock
      containers:
      - name: my-container
        image: "k8s.gcr.io/pause"
        resources:
          requests:
            cpu: 12
            memory: "50Gi"
            ephemeral-storage: "200Gi"
          limits:
            nvidia.com/gpu: CONTAINER_GPU_COUNT
    

    將 CONTAINER_GPU_COUNT 替換為要分配給容器的 GPU 數量。這個值必須小於或等於運算類別附加至各節點的加速器數量。

  3. 部署 Pod:

    kubectl apply -f reservation-sub-block-pod.yaml
    

    Autopilot 會使用指定預留子區塊中的預留容量,佈建新節點來執行 Pod。

排解 Autopilot 中預留資源的消耗問題

  • 請確保機型、加速器類型、本機 SSD 設定和加速器數量,與工作負載使用的資源相符。如需必須相符的屬性完整清單,請參閱「Compute Engine 容量預留屬性」。
  • 請務必建立具有特定親和性的預留項目,除非您使用自訂 ComputeClass 來耗用任何相符的預留項目。
  • 如果您使用 AnyBestEffort 預留項目親和性,但預留項目未耗用,GKE 可能會在區域內的其他可用區佈建隨選容量。為確保預留容量能順利使用,請使用特定預留項目。
  • 使用共用預留項目時,請確保用戶專案中的 GKE 服務代理有權列出擁有者專案中的共用預留項目。

在 GKE Standard 中使用預留執行個體

建立叢集或節點集區時,您可以指定 --reservation-affinity 旗標,指出預留項目消耗模式。

使用任何相符的預留項目 (含備援)

您可以使用 gcloud CLI 或 Terraform 建立預留項目和執行個體,以使用任何預留項目,並回退至隨選容量。

gcloud

如要自動使用任何相符的預留項目,請將預留項目相似度旗標設為 --reservation-affinity=any。由於 any 是 Compute Engine 中定義的預設值,因此您可以完全省略預留項目親和性標記。

在any預留項目消耗模式中,節點會先從所有單一專案預留項目取得容量,再從任何共用預留項目取得容量,因為共用預留項目可供其他專案使用。如要進一步瞭解系統如何自動消耗執行個體,請參閱「消耗順序」。

  1. 建立三個 VM 執行個體的預留項目:

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE --vm-count=3
    

    更改下列內容:

    • RESERVATION_NAME:要建立的預訂名稱。
    • MACHINE_TYPE:要用於預留的機器類型 (僅限名稱)。例如:n1-standard-2。
  2. 確認預留項目已建立:

    gcloud compute reservations describe RESERVATION_NAME
    
  3. 建立具有一個節點的叢集,以使用任何相符的預留項目:

    gcloud container clusters create CLUSTER_NAME \
        --machine-type=MACHINE_TYPE --num-nodes=1 \
        --reservation-affinity=any
    

    將 CLUSTER_NAME 替換為要建立的叢集名稱。

  4. 建立含有三個節點的節點集區,以使用任何相符的預留項目:

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster CLUSTER_NAME --num-nodes=3 \
        --machine-type=MACHINE_TYPE --reservation-affinity=any
    

    將 NODEPOOL_NAME 替換為要建立的節點集區名稱。

節點總數為四個,超過預訂容量。其中三個節點會耗用預留項目,最後一個節點則會從一般 Compute Engine 資源集區取得容量。

Terraform

如要使用 Terraform 建立三個 VM 執行個體的預留項目,請參閱下列範例:

resource "google_compute_reservation" "any_reservation" {
  name = "any-reservation"
  zone = "us-central1-a"

  specific_reservation {
    count = 3

    instance_properties {
      machine_type = "e2-medium"
    }
  }
}

如要建立具有一個節點的叢集,以使用 任何相符的預留項目,請參閱下列 Terraform 範例:

resource "google_container_cluster" "default" {
  name     = "gke-standard-zonal-cluster"
  location = "us-central1-a"

  initial_node_count = 1

  node_config {
    machine_type = "e2-medium"

    reservation_affinity {
      consume_reservation_type = "ANY_RESERVATION"
    }
  }

  depends_on = [
    google_compute_reservation.any_reservation
  ]
}

如要使用 Terraform 建立含有三個節點的節點集區,以使用任何相符的預留項目,請參閱下列範例:

resource "google_container_node_pool" "any_node_pool" {
  name     = "gke-standard-zonal-any-node-pool"
  cluster  = google_container_cluster.default.name
  location = google_container_cluster.default.location

  initial_node_count = 3
  node_config {
    machine_type = "e2-medium"

    reservation_affinity {
      consume_reservation_type = "ANY_RESERVATION"
    }
  }
}

如要進一步瞭解如何使用 Terraform,請參閱「GKE 的 Terraform 支援」。

使用任何相符的預留項目,不採用備用方案

如要使用任何相符的預留項目,且在預留項目用盡時不改用隨選容量,請將預留項目相依性旗標設為 --reservation-affinity=any-reservation-then-fail。如要使用這項預留資源親和性功能,必須使用 GKE 1.36.0-gke.3204000 以上版本。*

  1. 建立三個 VM 執行個體的預留項目:

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE --vm-count=3
    

    更改下列內容:

    • RESERVATION_NAME:要建立的預訂名稱。
    • MACHINE_TYPE:要用於預留的機器類型 (僅限名稱),例如 n1-standard-2。
  2. 確認預留項目已成功建立:

    gcloud compute reservations describe RESERVATION_NAME
    
  3. 建立具有一個節點的叢集,並將節點設為使用任何相符的預留項目,不使用備用項目:

    gcloud container clusters create CLUSTER_NAME \
        --machine-type=MACHINE_TYPE --num-nodes=1 \
        --reservation-affinity=any-reservation-then-fail
    

    將 CLUSTER_NAME 替換為要建立的叢集名稱。

  4. 建立含有三個節點的節點集區,並將這些節點設定為取用任何相符的預留項目,而不使用備援:

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster CLUSTER_NAME --num-nodes=3 \
        --machine-type=MACHINE_TYPE \
        --reservation-affinity=any-reservation-then-fail
    

    將 NODEPOOL_NAME 替換為要建立的節點集區名稱。

節點總數為四個,超過預訂容量。其中三個節點會耗用預訂項目,但最後一個節點無法佈建。GKE 會協調節點集區,佈建最後一個節點,直到出現新的預留容量或現有容量釋出。

使用特定單一專案預留項目

如要使用特定預留項目,請將預留項目親和性旗標設為 --reservation-affinity=specific,並提供特定預留項目名稱。在這種模式下,執行個體必須從可用區中的指定預留項目取得容量。如果預留項目容量不足,要求就會失敗。

如要建立預留項目和執行個體,以使用特定預留項目,請執行下列步驟。您可以使用 gcloud CLI 或 Terraform。

gcloud

  1. 為三個 VM 執行個體建立特定預留項目:

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE --vm-count=3 \
        --require-specific-reservation
    

    更改下列內容:

    • RESERVATION_NAME:要建立的預訂名稱。
    • MACHINE_TYPE:要用於預留的機器類型 (僅限名稱)。例如:n1-standard-2。
  2. 建立含有單一節點的節點集區,以使用特定的單一專案預留項目:

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster CLUSTER_NAME \
        --machine-type=MACHINE_TYPE --num-nodes=1 \
        --reservation-affinity=specific --reservation=RESERVATION_NAME
    

    更改下列內容:

    • NODEPOOL_NAME:要建立的節點集區名稱。
    • CLUSTER_NAME:您建立的叢集名稱。

Terraform

如要使用 Terraform 建立特定預留項目,請參閱下列範例:

resource "google_compute_reservation" "specific_reservation" {
  name = "specific-reservation"
  zone = "us-central1-a"

  specific_reservation {
    count = 1

    instance_properties {
      machine_type = "e2-medium"
    }
  }

  specific_reservation_required = true
}

如要使用 Terraform 建立具有單一節點的節點集區,以使用特定單一專案預留項目,請參考下列範例:

resource "google_container_node_pool" "specific_node_pool" {
  name     = "gke-standard-zonal-specific-node-pool"
  cluster  = google_container_cluster.default.name
  location = google_container_cluster.default.location

  initial_node_count = 1
  node_config {
    machine_type = "e2-medium"

    reservation_affinity {
      consume_reservation_type = "SPECIFIC_RESERVATION"
      key                      = "compute.googleapis.com/reservation-name"
      values                   = [google_compute_reservation.specific_reservation.name]
    }
  }

  depends_on = [
    google_compute_reservation.specific_reservation
  ]
}

如要進一步瞭解如何使用 Terraform,請參閱「GKE 的 Terraform 支援」。

使用特定共用預留項目

如要使用特定共用預留資源,請設定 Identity and Access Management (IAM) 權限,允許用戶專案的 GKE 服務代理存取擁有者專案中的預留資源。

在擁有共用預留項目的專案中,完成下列步驟:

  1. 在擁有者專案中建立包含 compute.reservations.list 權限的自訂 IAM 角色:

    gcloud iam roles create ROLE_NAME \
        --project=OWNER_PROJECT_ID \
        --permissions='compute.reservations.list'
    

    更改下列內容:

    • ROLE_NAME:新角色的名稱。
    • OWNER_PROJECT_ID:擁有運算資源預留項目的專案 ID。
  2. 授予用戶專案中的 GKE 服務代理權限,以便列出擁有者專案中的共用預留項目:

    gcloud projects add-iam-policy-binding OWNER_PROJECT_ID \
        --project=OWNER_PROJECT_ID \
        --member=serviceAccount:service-CONSUMER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --role='projects/OWNER_PROJECT_ID/roles/ROLE_NAME'
    

    將 CONSUMER_PROJECT_NUMBER 替換為消費者專案的數字專案編號。如要找出這個號碼,請參閱「識別專案」。

如要建立特定共用預留項目並使用該項目,請按照下列步驟操作。您可以使用 gcloud CLI 或 Terraform。

  1. 請按照「管理共用預留項目建立作業」一文中的步驟操作。

gcloud

  1. 建立特定共用預留項目:

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE --vm-count=3 \
        --zone=ZONE \
        --require-specific-reservation \
        --project=OWNER_PROJECT_ID \
        --share-setting=projects \
        --share-with=CONSUMER_PROJECT_IDS
    

    更改下列內容:

    • RESERVATION_NAME:要建立的預訂名稱。
    • MACHINE_TYPE:要用於預留項目的機型名稱。例如:n1-standard-2。
    • OWNER_PROJECT_ID:您要建立這項共用預留資源的專案 ID。如果省略 --project 旗標,GKE 預設會將目前專案視為擁有者專案。
    • CONSUMER_PROJECT_IDS:以半形逗號分隔的專案 ID 清單,列出要共用這項預留項目的專案。例如:project-1,project-2。最多可加入 100 個消費者專案。 這些專案必須與擁有者專案位於同一個機構。 請勿加入 OWNER_PROJECT_ID,因為預設情況下,該項目會耗用這項預留項目。
  2. 使用共用預留項目:

      gcloud container node-pools create NODEPOOL_NAME \
          --cluster CLUSTER_NAME \
          --machine-type=MACHINE_TYPE --num-nodes=1 \
          --reservation-affinity=specific \
          --reservation=projects/OWNER_PROJECT_ID/reservations/RESERVATION_NAME
    

    更改下列內容:

    • NODEPOOL_NAME:要建立的節點集區名稱。
    • CLUSTER_NAME:您建立的叢集名稱。

Terraform

如要使用 Terraform 建立特定共用預留項目,請參閱下列範例:

resource "google_compute_reservation" "specific_reservation" {
  name = "specific-reservation"
  zone = "us-central1-a"

  specific_reservation {
    count = 1

    instance_properties {
      machine_type = "e2-medium"
    }
  }

  specific_reservation_required = true
}

如要使用 Terraform 消耗特定共用預留項目,請參閱下列範例:

resource "google_container_node_pool" "specific_node_pool" {
  name     = "gke-standard-zonal-specific-node-pool"
  cluster  = google_container_cluster.default.name
  location = google_container_cluster.default.location

  initial_node_count = 1
  node_config {
    machine_type = "e2-medium"

    reservation_affinity {
      consume_reservation_type = "SPECIFIC_RESERVATION"
      key                      = "compute.googleapis.com/reservation-name"
      values                   = [google_compute_reservation.specific_reservation.name]
    }
  }

  depends_on = [
    google_compute_reservation.specific_reservation
  ]
}

如要進一步瞭解如何使用 Terraform,請參閱「GKE 的 Terraform 支援」。

從特定預留項目取用資源的其他注意事項

建立節點集區時,如果指定了特定預留項目相似度 (包括在建立叢集時建立的預設節點集區),則在節點集區的整個生命週期中,其大小會受限於特定預留項目的容量。這會影響下列 GKE 功能:

  • 多可用區叢集:在區域或多可用區叢集中,節點集區的節點可以跨越多個可用區。由於預留項目是單一可用區,因此需要多個預留項目。如要在這些叢集中建立節點集區,並使用特定預留項目,您必須在節點集區的每個可用區中,建立名稱和機器屬性完全相同的特定預留項目。
  • 叢集自動調度資源和節點集區升級:如果特定預留資源沒有額外容量,節點集區升級或自動調度資源可能會失敗,因為這兩項作業都需要建立額外執行個體。如要解決這個問題,您可以變更預留項目的大小,或釋出部分繫結資源。

使用 GPU 預留項目

如要建立會耗用 GPU 預留資源的標準節點集區,或是耗用容量位於單一可用區的任何預留資源,您必須在新增節點集區時指定 --node-locations 旗標。建立區域標準叢集或多可用區標準叢集時,指定節點位置有助於確保 GKE 只在您預留 GPU 容量的可用區中建立節點。

如需建立使用 GPU 的節點集區詳細操作說明,請參閱「建立 GPU 節點集區」。

使用 TPU 預留項目

如要建立使用 TPU 預留項目的 Standard 節點集區,請務必在新增節點集區時指定 --node-locations 旗標。建立區域性 Standard 叢集或多可用區 Standard 叢集時,指定節點位置有助於確保 GKE 只在您預留 TPU 容量的可用區建立節點。

TPU 預留項目與其他機型不同。建立 TPU 預留項目時,請考量下列 TPU 專屬事項:

  • 在 GKE 中使用 TPU 時,SPECIFIC 是 --reservation-affinity 標記唯一支援的值。

如需建立使用 TPU 的節點集區詳細操作說明,請參閱「建立 TPU 節點集區」。

建立節點,但不消耗預留項目

如要明確避免使用任何預留資源,請將親和性設為 --reservation-affinity=none。

  1. 建立不會耗用任何預留項目的叢集:

    gcloud container clusters create CLUSTER_NAME --reservation-affinity=none
    

    將 CLUSTER_NAME 替換為要建立的叢集名稱。

  2. 建立不會使用任何預留項目的節點集區:

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster CLUSTER_NAME \
        --reservation-affinity=none
    

    將 NODEPOOL_NAME 替換為要建立的節點集區名稱。

可用區之間的預留項目如下

如果使用在多個可用區執行的節點集區,且各可用區的預留項目不相等,可以使用 --location_policy=ANY 標記。這種做法可確保在叢集中新增節點時,系統會在仍有未用預留項目的可用區建立節點。

清除所用資源

如要避免系統向您的 Cloud Billing 帳戶收取本頁面所用資源的費用,請按照下列步驟操作:

  1. 針對每個叢集執行下列指令,刪除您建立的叢集:

    gcloud container clusters delete CLUSTER_NAME
    
  2. 執行下列指令,刪除您建立的各個預留項目:

    gcloud compute reservations delete RESERVATION_NAME
    

後續步驟