使用预留地区级资源


本页介绍了如何在特定 GKE 工作负载中使用预留的 Compute Engine 可用区级资源。这些容量预留可让您高度确信,特定硬件可供您的工作负载使用。

请确保您已熟悉 Compute Engine 预订的概念,例如消耗类型、共享类型和预配类型。如需了解详情,请参阅 Compute Engine 可用区级资源的预留

本页面适用于以下人员:

  • 应用运维人员:部署应尽快运行的工作负载,通常使用 GPU 等专用硬件。
  • 平台管理员:希望获得高级别保证,确保工作负载在满足应用和组织要求的经过优化的硬件上运行。

GKE 中的预留使用情况简介

借助 Compute Engine 容量预留功能,您可以在 Google Cloud 区域中立即或在指定的未来时间预配特定硬件配置。然后,您可以在 GKE 中使用此预留容量。

根据您的 GKE 操作模式,您可以使用以下预留类型:

  • AutoPilot 模式:仅限特定预留。
  • 标准模式:特定预留或任何匹配的预留。

如需使用预留来创建资源,您必须指定预留相似性,例如 anyspecific

GKE 中的预留使用选项

借助 GKE,您可以在单个工作负载中直接使用预留,方法是使用工作负载清单中的 Kubernetes nodeSelector,或创建使用预留的标准模式节点池。本页介绍了在各个资源中直接选择预订的方法。

您还可以使用自定义计算类配置 GKE,以便在创建新节点的伸缩操作期间消耗预留。借助自定义计算类,平台管理员可以定义节点配置的层次结构,供 GKE 在节点伸缩期间确定优先级,以便工作负载在您选择的硬件上运行。

您可以在自定义计算类配置中指定预留,以便使用该自定义计算类的任何 GKE 工作负载都向 GKE 指明要使用该计算类的指定预留。

如需了解详情,请参阅“自定义计算类简介”页面中的消耗 Compute Engine 预留部分。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

在 Autopilot 集群中使用容量预留

Autopilot 集群支持使用同一项目或共享项目中的 Compute Engine 容量预留中的资源。您必须将目标预订的消耗类型属性设置为特定,并且必须在清单中明确选择该预订。如果您未明确指定预留,Autopilot 集群将不会使用预留。如需详细了解预留用量类型,请参阅预留的工作原理

这些预留符合 Compute 灵活承诺使用折扣的条件。您必须使用 Accelerator 计算类或 Performance 计算类才能使用容量预留。

  • 在开始之前,请先创建运行以下版本的 Autopilot 集群

    • 如需使用预留的加速器(例如 GPU),请使用 1.28.6-gke.1095000 或更高版本
    • 如需在特定机器系列上运行 Pod,并让每个 Pod 都在自己的节点上运行:1.28.6-gke.1369000 及更高版本或 1.29.1-gke.1575000 及更高版本。

为 Autopilot 创建容量预留

Autopilot Pod 可以使用与集群位于同一项目中的具有特定使用类型属性的预留,也可以使用来自其他项目的共享预留。您可以通过在清单中显式引用预留来使用预留的硬件。您可以在 Autopilot 中为以下类型的硬件使用预留:

  • 以下任一种类型的 GPU:
    • nvidia-h100-mega-80gb:NVIDIA H100 Mega (80GB)
    • nvidia-h100-80gb:NVIDIA H100 (80GB)
    • nvidia-a100-80gb:NVIDIA A100 (80GB)
    • nvidia-tesla-a100:NVIDIA A100 (40GB)
    • nvidia-l4:NVIDIA L4
    • nvidia-tesla-t4:NVIDIA T4

如需创建容量预留,请参阅以下资源。预订必须满足以下要求:

  • 机器类型、加速器类型和加速器数量与您的工作负载将使用的容量相匹配。
  • 预留使用特定使用类型。例如,在 gcloud CLI 中,您必须在创建预留时指定 --require-specific-reservation 标志。

  • 为单个项目创建预留

  • 创建共享预留

在 Autopilot 中使用同一项目中的特定预留

本部分介绍了如何使用与集群位于同一项目中的特定容量预留。您可以使用 kubectl 或 Terraform。

kubectl

  1. 将以下清单保存为 specific-autopilot.yaml。此清单具有使用特定预留的节点选择器。您可以使用虚拟机实例或加速器。

    虚拟机实例

      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: 12
              memory: "50Gi"
              ephemeral-storage: "200Gi"
    

    替换以下内容:

    • MACHINE_SERIES:包含您特定容量预订中的虚拟机的机器类型的机器系列。例如,如果您的预留适用于 c3-standard-4 机器类型,请在 MACHINE_SERIES 字段中指定 C3
    • RESERVATION_NAME:Compute Engine 容量预留的名称。

    加速器

      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-h100-mega-80gb:NVIDIA H100 Mega (80GB)
      • nvidia-h100-80gb:NVIDIA H100 (80GB)
      • nvidia-a100-80gb:NVIDIA A100 (80GB)
      • nvidia-tesla-a100:NVIDIA A100 (40GB)
      • nvidia-l4:NVIDIA L4
      • nvidia-tesla-t4:NVIDIA T4
    • RESERVATION_NAME:Compute Engine 容量预留的名称。
    • QUANTITY:要挂接到容器的 GPU 数量。必须是指定 GPU 支持的数量,如支持的 GPU 数量中所述。
  2. 部署 Pod:

    kubectl apply -f specific-autopilot.yaml
    

Autopilot 会使用指定预留中的预留容量来预配用于放置 Pod 的新节点。

Terraform

如需使用 Terraform 在同一项目中使用虚拟机实例消耗特定预留,请参阅以下示例:

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 中使用特定共享预留

本部分使用以下术语:

  • 所有者项目:拥有预留并与其他项目共享的项目。
  • 使用方项目:运行使用共享预留的工作负载的项目。

如需使用共享预留,您必须向 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 使用特定的共享预留。

    虚拟机实例

    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: 12
            memory: "50Gi"
            ephemeral-storage: "200Gi"
    

    替换以下内容:

    • MACHINE_SERIES:包含您特定容量预留中的虚拟机的机器类型的机器系列。例如,如果您的预订适用于 c3-standard-4 机器类型,请在 MACHINE_SERIES 字段中指定 C3
    • RESERVATION_NAME:Compute Engine 容量预留的名称。
    • OWNER_PROJECT_ID:拥有容量预留的项目的项目 ID。

    加速器

    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-h100-mega-80gb:NVIDIA H100 Mega (80GB)
      • nvidia-h100-80gb:NVIDIA H100 (80GB)
      • nvidia-a100-80gb:NVIDIA A100 (80GB)
      • nvidia-tesla-a100:NVIDIA A100 (40GB)
      • nvidia-l4:NVIDIA L4
      • nvidia-tesla-t4:NVIDIA T4
    • RESERVATION_NAME:Compute Engine 容量预留的名称。
    • OWNER_PROJECT_ID:拥有容量预留的项目的项目 ID。
    • QUANTITY:要挂接到容器的 GPU 数量。必须是指定 GPU 支持的数量,如支持的 GPU 数量中所述。
  4. 部署 Pod:

    kubectl apply -f shared-autopilot.yaml
    

Autopilot 会使用指定预留中的预留容量来预配用于放置 Pod 的新节点。

排查 Autopilot 中预留使用问题

  • 确保机器类型、加速器类型、本地 SSD 配置和加速器数量与您的工作负载将使用的容量相匹配。如需查看必须匹配的属性的完整列表,请参阅 Compute Engine 容量预留属性
  • 确保使用特定亲和性创建预订。
  • 使用共享预留时,请确保使用方项目中的 GKE 服务代理有权在所有者项目中列出共享预留。

在 GKE Standard 中使用预留实例

在创建集群或节点池时,您可以通过指定 --reservation-affinity 标志来指明预留使用模式。

使用任何匹配的预留

您可以使用 gcloud CLI 或 Terraform 创建预留和实例,以使用任何预留。

gcloud

如需自动使用任何匹配的预留中的资源,请将预留相似性标志设置为 --reservation-affinity=any。由于 any 是在 Compute Engine 中定义的默认值,因此您可以完全忽略预留相似性标志。

any 预留使用模式下,节点首先从所有单项目预留中获取容量,然后再使用任何共享预留,因为共享预留可供其他项目使用。如需详细了解实例自动使用方式,请参阅使用顺序

  1. 创建包含三个虚拟机实例的预留:

    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 替换为要创建的节点池的名称。

总节点数为 4,超过了预留的容量。有 3 个节点使用预留资源,而最后一个节点则使用常规 Compute Engine 资源池中的容量。

Terraform

如需使用 Terraform 创建包含三个虚拟机实例的预留,请参阅以下示例:

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
  ]

  # Set `deletion_protection` to `true` will ensure that one cannot
  # accidentally delete this instance by use of Terraform.
  deletion_protection = false
}

如需使用 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=specific 并提供具体预留名称。在这种模式下,实例必须使用地区中指定预留的容量。如果此预留的资源容量不足,请求就会失败。

如需创建预留和实例以使用特定预留,请执行以下步骤。您可以使用 gcloud CLI 或 Terraform。

gcloud

  1. 为三个虚拟机实例创建特定预留:

    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 支持

使用特定的共享预留

如需创建特定的共享预留并使用该共享预留,请执行以下步骤。您可以使用 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。您可以添加 1 到 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 功能:

  • 包含多个可用区的集群:在区域级集群或多可用区集群中,一个节点池内的不同节点可能分布在不同的可用区。由于预留是单可用区式的,因此需要多个预留。如需在这些集群中创建使用特定预留的节点池,您必须在节点池的每个可用区中创建具有完全相同的名称和机器属性的特定预留。
  • 集群自动扩缩和节点池升级:如果特定预留中没有额外的容量,节点池升级或自动扩缩可能会失败,因为这两种操作都需要创建额外的实例。若要解决此问题,您可以更改预留的大小,或者释放其部分受限资源。

创建节点但不使用预留

如需明确避免使用任何预留中的资源,请将相似性设置为 --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 标志。这样可确保在向集群添加新节点时,在仍具有未使用预留的可用区中创建这些节点。

TPU 预留

TPU 预留与其他机器类型不同。以下是创建 TPU 预留时应考虑的特定于 TPU 的事项:

  • 使用 GKE 中的 TPU 时,SPECIFICgcloud container node-pools create--reservation-affinity 标志唯一支持的值。

如需了解详情,请参阅 TPU 预留

清理

为避免因本页中使用的资源导致您的 Cloud Billing 账号产生费用,请执行以下操作:

  1. 通过对每个集群运行以下命令来删除您创建的集群:

    gcloud container clusters delete CLUSTER_NAME
    
  2. 通过为每个预留运行以下命令来删除您创建的预留:

    gcloud compute reservations delete RESERVATION_NAME
    

后续步骤