使用预留地区级资源


您可以预留特定地区中的 Compute Engine 实例,确保资源在需要时可供工作负载使用。如需详细了解如何管理预留,请参阅预留 Compute Engine 可用区资源

创建预留后,您可以在 GKE 中使用预留资源。GKE 支持与 Compute Engine 相同的使用模式:

  • 使用任何预留中的资源:仅限标准
  • 使用特定预留中的资源:标准和 Autopilot
  • 创建节点而不使用任何预留:标准和 Autopilot

准备工作

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

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

在 Autopilot 集群中使用容量预留

Autopilot 集群支持使用同一项目或共享项目中特定 Compute Engine 容量预留的资源。除非明确指定,否则 Autopilot 集群不使用预留。这些预留符合 Autopilot 承诺使用折扣的条件。您必须使用 Accelerator 计算类或 Performance 计算类才能使用容量预留。

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

    • 通过加速器计算类使用预留加速器:1.28.6-gke.1095000 或更高版本
    • 使用 Performance 计算类:1.28.6-gke.1369000 及更高版本或 1.29.1-gke.1575000 及更高版本。

为 Autopilot 创建容量预留

Autopilot Pod 可以使用集群所在项目中的特定预留,或来自其他项目的共享预留中的预留。您可以通过在清单中显式引用预留来使用预留的硬件。您可以在 Autopilot 中为以下类型的硬件使用预留:

  • 以下任一种类型的 GPU:
    • 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

如需创建容量预留,请参阅以下资源。确保机器类型、加速器类型和加速器数量与您的工作负载将使用的容量相匹配。

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

本部分介绍如何使用与集群位于同一项目中的特定容量预留。

  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: "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/compute-class: "Accelerator"
        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: "200Gi"
          limits:
            nvidia.com/gpu: QUANTITY
    

    替换以下内容:

    • ACCELERATOR:您在 Compute Engine 容量预留中预留的加速器。必须是以下值之一:
      • 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。

在 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 compute reservations add-iam-policy-binding RESERVATION_NAME \
        --project=OWNER_PROJECT_ID \
        --zone=ZONE \
        --member=service-CONSUMER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --role='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: "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/compute-class: "Accelerator"
        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: "200Gi"
          limits:
            nvidia.com/gpu: QUANTITY
    

    替换以下内容:

    • ACCELERATOR:您在 Compute Engine 容量预留中预留的加速器。必须是以下值之一:
      • 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。

在 GKE Standard 中使用预留实例

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

使用任何匹配的预留

如需自动使用任何匹配的预留中的资源,请将预留相似性标志设置为 --reservation-affinity=any

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
    

    RESERVATION_NAME 替换为您刚刚创建的预留的名称。

  3. 创建包含一个节点的集群以使用任何匹配的预留

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

    替换以下内容:

    • CLUSTER_NAME:要创建的集群的名称。
    • MACHINE_TYPE:用于集群的机器类型(仅含名称)。例如:n1-standard-2
  4. 创建包含三个节点的节点池以使用任何匹配的预留:

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

    替换以下内容:

    • NODEPOOL_NAME:要创建的节点池的名称。
    • CLUSTER_NAME:您之前创建的集群的名称。
    • MACHINE_TYPE:用于节点池的机器类型(仅含名称)。例如:n1-standard-2

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

使用特定的单项目预留

如需使用特定预留,请将预留相似性标志设置为 --reservation-affinity=specific 并提供具体预留名称。在这种模式下,实例必须使用地区中指定预留的容量。如果此预留的资源容量不足,请求就会失败。

如需创建预留和实例以使用特定预留,请执行以下步骤:

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

    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:您创建的集群的名称。
    • MACHINE_TYPE:用于集群的机器类型(仅含名称)。例如:n1-standard-2
    • RESERVATION_NAME:要使用的预留的名称。

使用特定的共享预留

如需创建特定的共享预留并使用该共享预留,请执行以下步骤:

  1. 按照允许和限制项目创建和修改共享预留中的步骤操作。

  2. 创建特定的共享预留:

    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,因为它默认可以使用此预留。
  3. 使用共享预留:

     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:您创建的集群的名称。
    • MACHINE_TYPE:用于集群的机器类型的名称。例如 n1-standard-2
    • OWNER_PROJECT_ID:要在其中创建共享预留的项目的 ID。
    • RESERVATION_NAME:要使用的特定共享预留的名称。

使用特定预留的其他考虑事项

如果所创建的节点池具有特定预留相似度,包括创建集群时的默认节点池,其大小将限制为特定预留在节点池整个生命周期内的容量。这会影响到如下 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:要创建的节点池的名称。
    • CLUSTER_NAME:您之前创建的集群的名称。

以下可用区之间的可用预留

使用在多个可用区中运行的节点池,并且预留之间的可用区不相等时,您可以使用 --location_policy=ANY 标志。这样可确保在向集群添加新节点时,在仍具有未使用预留的可用区中创建这些节点。

TPU 预留

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

  • 使用 GKE 中的 TPU 时,SPECIFICgcloud container node-pools create--reservation-affinity 标志唯一支持的值。
  • TPU 预留无法在项目之间共享。

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

清理

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

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

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

    gcloud compute reservations delete RESERVATION_NAME
    

后续步骤