您可以预留特定地区中的 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 L4nvidia-tesla-t4
:NVIDIA T4
如需创建容量预留,请参阅以下资源。确保机器类型、加速器类型和加速器数量与您的工作负载将使用的容量相匹配。
在 Autopilot 中使用同一项目中的特定预留
本部分介绍如何使用与集群位于同一项目中的特定容量预留。
将以下清单保存为
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 L4nvidia-tesla-t4
:NVIDIA T4
RESERVATION_NAME
:Compute Engine 容量预留的名称。QUANTITY
:要挂接到容器的 GPU 数量。必须是指定 GPU 支持的数量,如支持的 GPU 数量中所述。
部署 Pod:
kubectl apply -f specific-autopilot.yaml
Autopilot 使用指定预留中的预留容量来预配新节点以放置 Pod。
在 Autopilot 中使用特定共享预留
本部分使用以下术语:
- 所有者项目:拥有预留并与其他项目共享的项目。
- 使用方项目:运行使用共享预留的工作负载的项目。
如需使用共享预留,您必须向 GKE 服务代理授予对拥有该预留的项目中预留的访问权限。执行以下操作:
创建一个包含所有者项目中
compute.reservations.list
权限的自定义 IAM 角色:gcloud iam roles create ROLE_NAME \ --project=OWNER_PROJECT_ID \ --permissions='compute.reservations.list'
替换以下内容:
ROLE_NAME
:新角色的名称。OWNER_PROJECT_ID
:拥有容量预留的项目的项目 ID。
为使用方项目中的 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 文档中的识别项目。将以下清单保存为
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 L4nvidia-tesla-t4
:NVIDIA T4
RESERVATION_NAME
:Compute Engine 容量预留的名称。OWNER_PROJECT_ID
:拥有容量预留的项目的项目 ID。QUANTITY
:要挂接到容器的 GPU 数量。必须是指定 GPU 支持的数量,如支持的 GPU 数量中所述。
部署 Pod:
kubectl apply -f shared-autopilot.yaml
Autopilot 使用指定预留中的预留容量来预配新节点以放置 Pod。
在 GKE Standard 中使用预留实例
在创建集群或节点池时,您可以通过指定 --reservation-affinity
标志来指明预留使用模式。
使用任何匹配的预留
如需自动使用任何匹配的预留中的资源,请将预留相似性标志设置为 --reservation-affinity=any
。
在 any
预留使用模式下,节点首先从所有单项目预留中获取容量,然后再使用任何共享预留,因为共享预留可供其他项目使用。如需详细了解实例自动使用方式,请参阅使用顺序。
如需创建预留和实例以使用任何预留,请执行以下步骤:
创建包含三个虚拟机实例的预留:
gcloud compute reservations create RESERVATION_NAME \ --machine-type=MACHINE_TYPE --vm-count=3
替换以下内容:
RESERVATION_NAME
:要创建的预留的名称。MACHINE_TYPE
:用于预留的机器类型(仅含名称)。例如n1-standard-2
。
验证预留创建成功:
gcloud compute reservations describe RESERVATION_NAME
将
RESERVATION_NAME
替换为您刚刚创建的预留的名称。创建包含一个节点的集群以使用任何匹配的预留:
gcloud container clusters create CLUSTER_NAME \ --machine-type=MACHINE_TYPE --num-nodes=1 \ --reservation-affinity=any
替换以下内容:
CLUSTER_NAME
:要创建的集群的名称。MACHINE_TYPE
:用于集群的机器类型(仅含名称)。例如:n1-standard-2
。
创建包含三个节点的节点池以使用任何匹配的预留:
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
并提供具体预留名称。在这种模式下,实例必须使用地区中指定预留的容量。如果此预留的资源容量不足,请求就会失败。
如需创建预留和实例以使用特定预留,请执行以下步骤:
创建包含 3 个虚拟机实例的特定预留:
gcloud compute reservations create RESERVATION_NAME \ --machine-type=MACHINE_TYPE --vm-count=3 \ --require-specific-reservation
替换以下内容:
RESERVATION_NAME
:要创建的预留的名称。MACHINE_TYPE
:用于预留的机器类型(仅含名称)。例如n1-standard-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
:要使用的预留的名称。
使用特定的共享预留
如需创建特定的共享预留并使用该共享预留,请执行以下步骤:
按照允许和限制项目创建和修改共享预留中的步骤操作。
创建特定的共享预留:
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
替换以下内容:
使用共享预留:
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
。
创建一个不使用任何预留的集群:
gcloud container clusters create CLUSTER_NAME --reservation-affinity=none
将
CLUSTER_NAME
替换为要创建的集群的名称。创建一个不使用任何预留的节点池:
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 时,
SPECIFIC
是gcloud container node-pools create
的--reservation-affinity
标志唯一支持的值。 - TPU 预留无法在项目之间共享。
如需了解详情,请参阅 TPU 预留。
清理
为避免因本页中使用的资源导致您的 Cloud Billing 账号产生费用,请执行以下操作:
通过对每个集群运行以下命令来删除您创建的集群:
gcloud container clusters delete CLUSTER_NAME
通过为每个预留运行以下命令来删除您创建的预留:
gcloud compute reservations delete RESERVATION_NAME