使用和管理预留

本文档介绍如何使用和管理 Compute Engine 可用区级资源的预留。预留为获取 Compute Engine 可用区级资源的容量提供了极高保障。如需了解预留,请参阅 Compute Engine 可用区级资源的预留。如需了解如何创建预留,请参阅为单个项目创建预留创建共享预留

准备工作

使用预留实例

创建虚拟机 (VM) 实例时,请设置实例的预留亲和性标志,以选择该实例是使用任何可用的匹配预留(默认)、使用特定预留,还是根本不使用预留。 如果您希望实例使用特定预留,则必须在创建该预留时使用相应特定预留所需的标志。

在所有情况下,虚拟机实例都只能在其属性与预留的实例属性完全匹配时使用预留:

  • 可用区
  • 机器类型(机器系列、vCPU 和内存)
  • 满足最低要求的 CPU 平台
  • GPU 类型
  • GPU 数量
  • 本地 SSD 接口
  • 本地 SSD 数量

如需了解详情,请参阅预留的工作原理

使用任何匹配预留中的实例

在此模型中,如果现有实例和新实例的属性与预留实例的属性匹配,则这些实例会自动计入预留。在您创建和删除大量虚拟机且希望尽可能地使用预留时,此模型非常有用。

使用此消耗模式时,实例会先使用任何匹配的单项目预留,然后再使用任何匹配的共享预留,因为后者的使用范围更广。如需详细了解实例自动消耗方式,请参阅消耗顺序

如需使用此模型,请在创建预留时排除 --require-specific-reservation 标志,以便匹配的实例自动使用这些预留。

控制台

  1. 创建开放式预留。

    1. 在 Cloud Console 中,转到承诺使用折扣页面。

      转到“承诺使用折扣”

    2. 如需创建没有父级承诺的独立预留,请点击创建预留

    3. 为预留命名,例如 reservation-01

    4. 用于虚拟机实例下,选择自动使用预留,以便任何匹配的实例自动使用此预留。

    5. 选择您要预留资源的区域可用区

    6. 指定您要预留的虚拟机实例数量

    7. 指定您希望每个实例拥有的资源:

      • vCPU 数量
      • 满足最低要求的 CPU 平台
      • 内存量
      • GPU
      • 本地 SSD(根据需要)
    8. 点击创建按钮以创建预留。

  2. 创建一个虚拟机实例,该实例指向任何开放式预留并与 reservation-01 中的实例属性相匹配,这些属性包括可用区、机器类型(机器系列、vCPU 和内存)、满足最低要求的 CPU 平台、GPU 数量和类型,以及本地 SSD 数量和接口。

    1. 在 Cloud Console 中,转到虚拟机实例页面。

      转到虚拟机实例

    2. 选择您的项目并点击继续

    3. 点击创建实例

    4. 为您的实例指定名称

    5. 指定与 reservation-01 的属性相匹配的机器类型。例如,如果您在预留中指定了满足最低要求的 CPU 平台或 GPU,则必须自定义此实例以匹配预留,才能使用预留。

    6. 如果您的预留包含本地 SSD,请在磁盘下点击添加新磁盘添加与预留的本地 SSD 接口和容量相匹配的本地 SSD

    7. 管理部分的预留下,选择自动使用已创建的预留

    8. 点击创建

gcloud

  1. 创建一个名为 reservation-01 的开放式预留。

    gcloud compute reservations create reservation-01 \
        --machine-type=n2-standard-32 \
        --min-cpu-platform "Intel Cascade Lake" \
        --vm-count=2 \
        --zone=us-central1-a
    
  2. 创建一个虚拟机实例,该实例指向任何开放式预留并与 reservation-01 中的实例属性相匹配,这些属性包括可用区、机器类型(机器系列、vCPU 和内存)、满足最低要求的 CPU 平台、GPU 数量和类型,以及本地 SSD 数量和接口。

    gcloud compute instances create instance-1 \
        --machine-type=n2-standard-32 \
        --min-cpu-platform "Intel Cascade Lake" \
        --zone=us-central1-a \
        --reservation-affinity=any
    

API

  1. 创建一个名为 reservation-01 的开放式预留。

    POST https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/reservations
    
    {
      "name":"reservation-01",
      "specificReservation":{
        "count":"2",
        "instanceProperties":{
          "machineType":"n2-standard-32",
          "minCpuPlatform": "Intel Cascade Lake",
        }
      },
      "specificReservationRequired": false
    }
    
  2. 创建一个虚拟机实例,该实例指向任何开放式预留并与 reservation-01 中的实例属性相匹配,这些属性包括可用区、机器类型(机器系列、vCPU 和内存)、满足最低要求的 CPU 平台、GPU 数量和类型,以及本地 SSD 数量和接口。

    POST https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/instances
    
    {
      "name": "instance-1",
      "machineType": "zones/us-central1-a/machineTypes/n2-standard-32",
      "minCpuPlatform": "Intel Cascade Lake",
      "reservationAffinity":
      {
        "consumeReservationType": "ANY_RESERVATION"
      },
      ...
    }
    

使用特定预留中的实例

在此模型中,只有按名称指定特定预留的新实例才能使用该预留,并且不会自动使用该预留。此模型非常有用(例如,在您希望保留一定容量作为备份供特殊事件使用时)。

创建预留时,请使用以下方法之一指定需要定位到特定预留的实例:

  • 在 Cloud Console 中,选中选择特定预留复选框。
  • gcloud 工具中,添加 --require-specific-reservation 标志。
  • 在 Compute Engine API 中,将 specificReservationRequired 字段设置为 true

然后,创建明确针对该预留并与其属性相匹配的虚拟机

如果您使用实例模板在区域托管实例组中创建虚拟机,请在每个适用地区创建同名的相同预留。然后,在组的实例模板中按名称针对预留。

例如,创建一个名为 reservation-02 的特定预留,然后创建一个匹配实例,该实例针对该预留并与该预留的实例属性相匹配。

根据您要使用的实例类型,请按照使用特定的单项目预留使用特定共享预留 的步骤操作。

使用特定的单项目预留

如需使用特定的单项目预留,请使用 Cloud Console、gcloud 工具或 Compute Engine API。

控制台

  1. 创建一个预留,使预留资源仅供通过名称明确指向此预留的实例使用。

    1. 在 Cloud Console 中,转到承诺使用折扣页面。

      转到“承诺使用折扣”

    2. 点击创建预留以创建没有父级承诺的独立预留。

    3. 为预留命名,例如 reservation-02

    4. 用于虚拟机实例下方,选中选择特定预订,以使此预留仅可供通过名称明确指向此预留的匹配实例使用。

    5. 选择您要预留资源的区域可用区

    6. 指定您要预留的虚拟机实例数量

    7. 指定您希望每个实例拥有的资源:

      • vCPU 数量
      • 满足最低要求的 CPU 平台
      • 内存量
      • GPU
      • 本地 SSD
    8. 点击创建

  2. 创建一个通过名称指向该特定预留的虚拟机实例。

    确保该实例的属性与该特定预留的实例属性相匹配,这些属性包括可用区、机器类型(机器系列、vCPU 和内存)、满足最低要求的 CPU 平台、GPU 数量和类型,以及本地 SSD 接口和大小。

    1. 在 Cloud Console 中,转到虚拟机实例页面。

      转到虚拟机实例

    2. 选择您的项目并点击继续

    3. 点击创建实例按钮。

    4. 为您的实例指定名称

    5. 指定与 reservation-01 的属性相匹配的机器类型。例如,如果您在预留中指定了满足最低要求的 CPU 平台,则必须自定义此实例以匹配预留,才能使用预留。

    6. 如果您的预留包含本地 SSD,请在磁盘下点击添加新磁盘添加与预留的本地 SSD 接口和容量相匹配的本地 SSD

    7. 管理部分的预留下,选择具有匹配属性的可用预留,例如:reservation-02

    8. 点击创建以创建实例。

gcloud

  1. 使用 --require-specific-reservation 标志创建一个名为 reservation-02 的预留。只有按名称明确针对此预留的实例可使用这些预留资源。

    gcloud compute reservations create reservation-02 \
        --machine-type=n2-standard-32 \
        --min-cpu-platform "Intel Cascade Lake" \
        --vm-count=10 \
        --zone=us-central1-a \
        --require-specific-reservation
    
  2. 使用 --reservation-affinity--reservation 标志创建一个按名称针对 reservation-02 的虚拟机实例。

    确保该实例的属性与该预留的实例属性相匹配,这些属性包括可用区、机器类型(机器系列、vCPU 和内存)、满足最低要求的 CPU 平台、GPU 数量和类型,以及本地 SSD 接口和大小。

    gcloud compute instances create instance-2 \
        --machine-type=n2-standard-32 \
        --min-cpu-platform "Intel Cascade Lake" \
        --zone=us-central1-a \
        --reservation-affinity=specific \
        --reservation=reservation-02
    

API

  1. 创建一个名为 reservation-02 的预留,并将 specificReservationRequired 字段设置为 true

    POST https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/reservations
    
    {
      "name":"reservation-02",
      "specificReservation":{
        "count":"10",
        "instanceProperties":{
          "machineType":"n2-standard-32",
          "minCpuPlatform": "Intel Cascade Lake",
        }
      },
      "specificReservationRequired": true
    }
  2. 使用 reservationAffinity 字段创建一个按名称针对 reservation-02 的虚拟机实例。

    确保该实例的属性与该预留的实例属性相匹配,这些属性包括可用区、机器类型(机器系列、vCPU 和内存)、满足最低要求的 CPU 平台、GPU 数量和类型,以及本地 SSD 接口和大小。

    POST https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/instances
    
    {
      "name": "instance-2",
      "machineType": "zones/us-central1-a/machineTypes/n2-standard-32",
      "minCpuPlatform": "Intel Cascade Lake",
      "reservationAffinity":
      {
        "consumeReservationType": "SPECIFIC_RESERVATION",
        "key": "compute.googleapis.com/reservation-name",
        "values":
        ["reservations/reservation-02"
        ]
      },
      ...
    }

使用特定的共享预留

如需使用特定的单项目预留,请使用 gcloud 工具或 Compute Engine API。

gcloud

  1. 使用 --require-specific-reservation 标志创建一个名为 reservation-02 的预留。只有按名称明确针对此预留的实例可使用这些预留资源。

    gcloud compute reservations create reservation-02 \
        --machine-type=n2-standard-32 \
        --min-cpu-platform "Intel Cascade Lake" \
        --vm-count=10 \
        --zone=us-central1-a \
        --project=my-owner-project \
        --share-setting=projects \
        --share-with=project-1,project-2 \
        --require-specific-reservation
    
  2. 使用 --reservation-affinity--reservation 标志创建一个按名称针对 reservation-02 的虚拟机实例。 如需使用此预留与之共享的任何使用方项目中的预留,您还必须指定创建预留的项目 my-owner-project

    确保该实例的属性与该预留的实例属性相匹配,这些属性包括可用区、机器类型(机器系列、vCPU 和内存)、满足最低要求的 CPU 平台、GPU 数量和类型,以及本地 SSD 接口和大小。

    gcloud compute instances create instance-2 \
        --machine-type=n2-standard-32 \
        --min-cpu-platform "Intel Cascade Lake" \
        --zone=us-central1-a \
        --reservation-affinity=specific \
        --reservation=projects/my-owner-project/reservations/reservation-02
    

API

  1. 创建一个名为 reservation-02 的预留,并将 specificReservationRequired 字段设置为 true

    POST https://compute.googleapis.com/compute/v1/projects/my-owner-project/zones/us-central1-a/reservations
    
    {
      "name":"reservation-02",
      "specificReservation":{
        "count":"10",
        "instanceProperties":{
          "machineType":"n2-standard-32",
          "minCpuPlatform": "Intel Cascade Lake",
        }
      },
      "shareSettings": {
        "shareType": "SPECIFIC_PROJECTS",
        "projects": ["project-1", "project-2"],
      }
      "specificReservationRequired": true
    }
  2. 使用 reservationAffinity 字段创建一个按名称针对 reservation-02 的虚拟机实例。 如需使用此预留与之共享的任何使用方项目中的预留,您还必须指定创建预留的项目 my-owner-project

    确保该实例的属性与该预留的实例属性相匹配,这些属性包括可用区、机器类型(机器系列、vCPU 和内存)、满足最低要求的 CPU 平台、GPU 数量和类型,以及本地 SSD 接口和大小。

    POST https://compute.googleapis.com/compute/v1/projects/project-2/zones/us-central1-a/instances
    
    {
      "name": "instance-2",
      "machineType": "zones/us-central1-a/machineTypes/n2-standard-32",
      "minCpuPlatform": "Intel Cascade Lake",
      "reservationAffinity":
      {
        "consumeReservationType": "SPECIFIC_RESERVATION",
        "key": "compute.googleapis.com/reservation-name",
        "values":
        ["projects/my-owner-project/reservations/reservation-02"
        ]
      },
      ...
    }

创建实例但不使用预留

如需明确避免使用任何预留中的资源,请在创建虚拟机时将预留相似性标志设置为“none”。或者,如需隐式避免用完您的任何预留,请创建一个与您任何预留的实例属性都不匹配的实例。

控制台

  1. 创建一个明确不使用预留中资源的实例。

    1. 在 Cloud Console 中,转到虚拟机实例页面。

      转到虚拟机实例

    2. 点击创建实例

    3. 照常创建实例。

    4. 管理部分的预留下方,选择不使用以确保此实例不使用任何现有预留中的资源。

    5. 点击创建

gcloud

创建一个实例,该实例明确不使用预留中的资源。

gcloud compute instances create instance-3 --reservation-affinity=none

或者,创建一个与您任何预留中的实例属性都不匹配的实例。如需查看预留属性,请参阅列出和描述预留

API

创建一个实例,该实例明确不使用预留中的资源。

POST https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/instances

{
  "machineType": "zones/us-central1-a/machineTypes/n2-standard-16",
  "name": "instance-3",
  "reservationAffinity":
  {
    "consumeReservationType": "NO_RESERVATION"
  },
  ...
}

或者,创建一个与您任何预留中的实例属性都不匹配的实例。如需查看预留属性,请参阅列出和描述预留

确保利用预留

如果您无法使用预留资源,请确认您的预留和实例设置正确,并且您的预留仍有当前未使用的实例。为此,您需要验证预留的实例属性是否与实例的属性相匹配,并且预留是否包含当前未使用的实例。或者,创建一个特定预留,然后创建一个针对该特定预留的实例,并检查由此产生的错误。

验证预留属性

预留的实例属性必须与实例创建命令中的属性相匹配。要进行验证,请执行以下操作:

  1. 描述该预留。如果该预留的所有实例当前正被其他实例使用,如果您希望该预留能够预留额外的容量,则需要调整该预留的大小。否则,请专门检查该预留的实例属性:

    • zone
    • specificReservationRequired
      • 如果设置为 true,则实例创建命令必须按名称针对此预留。
    • machineType
    • guestAccelerators.acceleratorType
    • guestAccelerators.acceleratorCount
    • minCpuPlatform
      • 如果您有一个具有 minCpuPlatform 属性的虚拟机实例,并且想要创建使用该实例的预留,请创建具有匹配属性(包括匹配的 minCpuPlatform)的预留。
      • 如果您有一个具有 minCpuPlatform 属性的预留,并且想要创建使用该预留的实例,请创建具有匹配属性(包括匹配的 minCpuPlatform)的实例。
    • localSsds.interface
      • 如果您针对具有多个本地 SSD 的虚拟机实例创建了预留,则使用该预留的虚拟机实例必须具有相同数量的本地 SSD,且每个本地 SSD 都具有匹配的 localSsds.interface
  2. 创建一个与这些属性相匹配的实例

  3. 描述实例以验证其属性与预留的实例属性相匹配。例如,通过 gcloud 工具使用 instances describe 命令。

  4. 描述您的预留以检查其 inUseCount 是否已递增。

    • 如果 inUseCount 未更改,则说明属性不匹配。
    • 如果 inUseCount 已递增,则说明实例正在使用预留。

如果您在验证预留的容量和实例属性后仍无法创建预留,则该错误可能是由资源可用性导致的。了解如何排查资源可用性问题

针对特定预留

如果您尝试创建针对特定预留的实例,则除非该实例与该预留的实例属性相匹配,否则无法创建。使用此方法可以验证实例属性是否正确。

  1. 使用 specificReservationRequired 选项创建一个预留
  2. 通过预留相似性属性创建一个明确与该预留的实例属性相匹配并且通过名称指向该预留的实例。
    • 如果实例属性不匹配,您会看到错误。
    • 如果实例属性匹配,则说明实例正在使用预留。

如果您在验证预留的容量和实例属性后仍无法创建预留,则该错误可能是由资源可用性导致的。了解如何排查资源可用性问题

列出和描述预留

使用控制台、gcloud 工具或 API 列出和查看预留的详细信息。

控制台

  1. 在 Cloud Console 中,转到承诺使用折扣页面。

    转到“承诺使用折扣”

  2. 点击预留

预留列表包含每个预留的详细信息。使用的机器数(总数)列介绍了每个预留的利用率。例如,显示 25 (50) 的预留表示已预留 50 个实例,其中 25 个实例已被使用且目前仍在使用。

gcloud

使用 gcloud compute reservations list 命令列出预留:

gcloud compute reservations list [--filter="zone:('ZONE')"]

NAME             IN_USE_COUNT   COUNT   ZONE
reservation-04   25             50      us-central1-a
reservation-05   0              100     us-central1-b

使用 gcloud compute reservations describe 命令描述预留:

gcloud compute reservations describe RESERVATION_NAME --zone=ZONE

kind: compute#reservation
name: reservation-05
selfLink: https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-east1-d/reservations/reservation-04
specificReservation:
  count: '50'
  inUseCount: '25'
  instanceProperties:
    guestAccelerators:
    - acceleratorCount: 1
      acceleratorType: nvidia-tesla-k80
    localSsds:
    - diskSizeGb: '375'
      interface: SCSI
    machineType: n1-standard-2
    minCpuPlatform: Any CPU Platform
specificReservationRequired: false
status: READY
zone: https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-east1-d    

您可以使用 countinUseCount 值确定每个预留的利用率。在本例中,预留了 50 个实例用于预留-04,其中 25 个实例已被预留使用,并且当前正在使用。

如需创建使用此预留的实例,请记得匹配预留的实例属性。例如:

gcloud compute instances create my-instance \
    --accelerator=type=nvidia-tesla-k80,count=1 \
    --maintenance-policy terminate \
    --local-ssd=size=375,interface=scsi \
    --machine-type n1-standard-2 \
    --zone us-east1-d 

API

在 API 中,通过向 reservations.list 方法发出 GET 请求来列出预留。

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME

{
  "id": "4100668622331754141",
  "creationTimestamp": "2019-09-27T08:21:14.707-07:00",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-east1-d/reservations/reservation-03",
  "zone": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-east1-d",
  "name": "reservation-03",
  "specificReservation": {
    "instanceProperties": {
      "machineType": "n1-standard-2"
    },
    "count": "100",
    "inUseCount": "0"
  },
  "specificReservationRequired": false,
  "status": "READY",
  "kind": "compute#reservation"
},
{
  "id": "2533514314332214789",
  "creationTimestamp": "2019-09-27T08:21:14.707-07:00",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-east1-d/reservations/reservation-04",
  "zone": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-east1-d",
  "name": "reservation-04",
  "specificReservation": {
    "instanceProperties": {
      "machineType": "n1-standard-2",
      "guestAccelerators": [
        {
          "acceleratorType": "nvidia-tesla-k80",
          "acceleratorCount": 1
        }
      ],
      "minCpuPlatform": "Any CPU Platform",
      "localSsds": [
        {
          "diskSizeGb": "375",
          "interface": "SCSI"
        }
      ]
    },
    "count": "50",
    "inUseCount": "25"
  },
  "specificReservationRequired": false,
  "status": "READY",
  "kind": "compute#reservation"
}

通过调用 reservations.get 方法来描述预留。

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME

{
  "id": "2533514314332214789",
  "creationTimestamp": "2019-09-27T08:21:14.707-07:00",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-east1-d/reservations/reservation-04",
  "zone": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-east1-d",
  "name": "reservation-04",
  "specificReservationRequired": false,
  "status": "READY",
  "kind": "compute#reservation",
  "specificReservation": {
    "instanceProperties": {
      "machineType": "n1-standard-2",
      "guestAccelerators": [
        {
          "acceleratorType": "nvidia-tesla-k80",
          "acceleratorCount": 1
        }
      ],
      "minCpuPlatform": "Any CPU Platform",
      "localSsds": [
        {
          "diskSizeGb": "375",
          "interface": "SCSI"
        }
      ]
    },
    "count": "50",
    "inUseCount": "25"
  }
}

您可以使用 countinUseCount 值确定每个预留的利用率。在本例中,预留了 50 个实例,其中 25 个实例已被使用,并且当前正在使用

修改预留

如果要更改预留虚拟机的数量,请调整预留的大小。如果您不再需要预留,请将其删除。

如果预留未附加到承诺使用合约,则仅可调整预留的大小或删除预留。

调整预留的大小

您可以使用 gcloud 工具或 API 调整未与承诺使用合约关联的预留中的虚拟机数量。

gcloud

使用 gcloud compute reservations update 命令调整预留的大小。例如:

针对两个虚拟机实例创建一个预留:

gcloud compute reservations create reservation-01 \
    --machine-type=n2-standard-32 \
    --zone=us-central1-a \
    --vm-count=2

将预留从两个虚拟机实例调整为十个虚拟机实例:

gcloud compute reservations update reservation-01 \
    --zone=us-central1-a \
    --vm-count=10

API

在 API 中,构建一个向 reservations.resize 方法发出的 POST 请求,并在请求正文中包含新的 specificSkuCount。以下请求正文将预留的虚拟机数量更新为 10 个。

POST https://compute.googleapis.com/compute/v1/projects/<var>PROJECT_ID</var>/zones/<var>ZONE</var>/reservations/<var>RESERVATION_NAME</var>/resize

{"specificSkuCount": "10"}

如果在请求时目标地区中有足够的资源,并且目标区域中有足够的配额,则更新请求会成功。

删除预留

您可以使用控制台、gcloud 工具或 API 删除未与承诺使用合约关联的预留。

控制台

  1. 在 Cloud Console 中,转到承诺使用折扣页面。

    转到“承诺使用折扣”

  2. 点击预留查看预留列表。

  3. 选中您要删除的每个预留旁边的复选框。

  4. 点击删除预留

gcloud

您可以使用 delete 命令释放预留:

gcloud compute reservations delete <var>RESERVATION_NAME</var> --zone <var>ZONE</var>

API

在 API 中,构建对 reservation.delete 方法的 DELETE 请求。

DELETE https://compute.googleapis.com/compute/v1/projects/<var>PROJECT_ID</var>/zones/<var>ZONE</var>/reservations/<var>RESERVATION_NAME</var>

删除命令成功完成后,您无需再为预留付费,系统也不再为您预留资源。删除预留不会影响与该预留关联的任何正在运行的实例;您仍然需要为这些实例付费。

将预留与承诺使用折扣相结合

承诺使用折扣提供 1 年或 3 年期折扣价格协议,但不在特定地区预留容量。即使预留的虚拟机未运行,预留也可确保特定地区中保留有容量。通过将预留与承诺使用合约相结合,您可按折扣价使用预留资源。

默认情况下,创建预留时,核心和内存适用的任何承诺使用折扣都会自动应用于虚拟机实例。但是,若要获得 GPU 和本地 SSD 的承诺使用折扣费率,则必须在购买承诺使用合约时为这些资源创建预留。

承诺一旦购买便无法取消。如需了解详情,请参阅承诺使用折扣

对 GPU 或本地 SSD 购买承诺使用合约

如需为 GPU 或本地 SSD 购买承诺使用合约,请注意以下几点:

  • 您必须购买通用 N1 承诺。GPU 仅受 N1 机器类型支持(A100 GPU 除外)。
  • 在购买承诺时创建包含 GPU 或本地 SSD 的预留
  • 您无需在承诺中包含 vCPU 或内存。

您必须为特定的 GPU 类型购买承诺。例如,您可以购买 NVIDIA P100 或 NVIDIA V100,但不能在为 NVIDIA P100 GPU 购买承诺后,期望将该承诺应用于其他 GPU 类型。

您预留的 GPU 和本地 SSD 的数量必须与您承诺中的数量相同。例如,如果要预留 4 个 V100 GPU,那么您的承诺也必须包含 4 个 V100 GPU。但是,您预留的 vCPU 和内存的数量可能多于或少于您承诺中的数量。

如果您只想在承诺中包含 GPU 或本地 SSD,则可以为 vCPU 和内存承诺指定 0。但是,您附加到承诺的预留必须包含与承诺相同的 GPU 和本地 SSD,以及要保留的机器类型(包含 vCPU 和内存)。

您可以使用 Cloud Console、gcloud 工具或 API 购买附加预留的承诺。

控制台

  1. 在 Google Cloud Console 中,转到承诺使用折扣页面。

    转到“承诺使用折扣”

  2. 如需购买新的承诺,请点击购买使用承诺

  3. 为您的承诺命名,并选择您希望应用该承诺的区域。

  4. 对于承诺类型,请选择通用

  5. 选择承诺的持续时间(1 年或 3 年)。

  6. 输入您要购买的核心数量和内存量。如果您只想在承诺中包含并预留 GPU 或本地 SSD,而不包含 vCPU 和内存,请为 vCPU 和内存承诺数量指定 0。

  7. 点击添加 GPU,然后选择您要在承诺中包含的 GPU 类型GPU 数量

  8. 点击添加本地 SSD 并指定要承诺使用的磁盘数量。

  9. 点击添加新预留,为将要使用 GPU 和本地 SSD 的实例创建一个或多个预留。

    1. 为预留命名。
    2. 用于虚拟机实例下,执行以下操作:
      • 如果您只想在创建按名称明确指定此预留的匹配实例时使用此预留的资源,请选中选择特定预订
      • 如果您希望匹配实例自动使用此预留,请选择自动使用预订
    3. 选择您要预留资源的地区
    4. 指定您要预留的虚拟机实例数量
    5. 指定您要为每个实例预留的资源:
      • 如果您有实例模板,请点击使用实例模板,然后从列表中选择一个实例模板。
      • 否则,请点击指定机器类型
        1. 点击自定义,使用滑块为您的机器类型选择核心数量和内存量。
        2. 指定 CPU 平台
        3. 如需添加 GPU,请输入 GPU 数量GPU 类型
        4. (可选)指定要添加到每个实例的本地 SSD 数量,并指定要使用的接口类型
    6. 点击完成按钮以创建预留。
  10. 点击购买按钮以购买承诺。

  11. 阅读购买条款,并在准备好购买承诺时点击购买

gcloud

使用 gcloud compute commmitments create 命令购买承诺,并添加用于创建附属预留的标志。

例如,以下承诺包括 4 个 GPU 和 1 个相关的新预留,以便在 us-central1-a 的 2 个 n1-standard-32 实例中使用这些 GPU。

gcloud compute commitments create commitment-01 \
    --region=us-central1 \
    --resources=vcpu=96,memory=624GB \
    --resources-accelerator=type=nvidia-tesla-v100,count=4 \
    --plan 12-month \
    --reservation=reservation-01 \
    --reservation-zone=us-central1-a \
    --machine-type=n1-standard-16 \
    --accelerator=type=nvidia-tesla-v100,count=2 \
    --vm-count=2

如果您想在承诺中包含并预留 GPU 或本地 SSD,而不包含 vCPU 和内存,请为 vCPU 和内存承诺数量指定 0。

gcloud compute commitments create commitment-01 \
    --region=us-west2 \
    --resources=vcpu=0,memory=0 \
    --resources-accelerator=type=nvidia-tesla-p4,count=1 \
    --plan 12-month \
    --reservation=reservation-01 \
    --reservation-zone=us-west2-b \
    --machine-type=n1-standard-2 \
    --accelerator=type=nvidia-tesla-p4,count=1 \
    --vm-count=1

如需在购买承诺时创建多个预留,请使用包含预留属性的 YAML 文件。例如:

gcloud compute commitments create commitment-01 \
    --region=us-central1 \
    --resources=vcpu=96,memory=624,local-ssd=750 \
    --resources-accelerator=type=nvidia-tesla-v100,count=1 \
    --plan 12-month \
    --reservations-from-file=YAML_FILE

例如,以下 YAML 文件包含 2 个预留。第一个预留 res-01 包含 1 个 n1-standard-2 实例,该实例挂接了 1 个 GPU;这是一个目标预留,表示您必须明确指定其名称才能使用其预留的实例。第二个预留 res-02 包含 1 个 n1-standard-2 虚拟机实例,该实例挂接了 2 种本地 SSD。

- reservation: res-01
  reservation_zone: us-central1-a
  require_specific_reservation: true
  vm_count: 1
  machine_type: n1-standard-2
  accelerator:
  - count: 1
    type: nvidia-tesla-v100
- reservation: res-02
  reservation_zone: us-central1-a
  vm_count: 1
  machine_type: n1-standard-2
  local_ssd:
  - interface: scsi
    size: 375
  - interface: nvme
    size: 375

API

使用 regionCommitments.insert 方法并添加 reservations 字段来定义预留的属性。例如,以下承诺包括 4 个 GPU 和 1 个相关的预留,以便在 us-central1-a 的 2 个实例中使用这些 GPU。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/commitments

{
  "name": "commitment-01",
  "plan": "TWELVE_MONTH",
  "resources":
  [
    {
      "amount": "96",
      "type": "VCPU"
    },
    {
      "amount": "638976",
      "type": "MEMORY"
    },
    {
      "acceleratorType": "nvidia-tesla-v100",
      "amount": "4",
      "type": "ACCELERATOR"
    }
  ],
  "reservations":
  [
    {
      "name": "reservation-01",
      "specificReservation":
      {
        "count": "2",
        "instanceProperties":
        {
          "guestAccelerators":
          [
            {
              "acceleratorCount": 2,
              "acceleratorType": "nvidia-tesla-v100"
            }
          ],
          "machineType": "n1-standard-8"
        }
      },
      "specificReservationRequired": false,
      "zone": "us-central1-a"
    }
  ]
}

如果您只想在承诺中包含并预留 GPU 或本地 SSD,而不包含 vCPU 和内存,请为 vCPU 和内存承诺数量指定 0。例如:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/commitments

{
  "name": "commitment-01",
  "plan": "TWELVE_MONTH",
  "resources":
  [
    {
      "amount": "0",
      "type": "VCPU"
    },
    {
      "amount": "0",
      "type": "MEMORY"
    },
    {
      "acceleratorType": "nvidia-tesla-v100",
      "amount": "4",
      "type": "ACCELERATOR"
    }
  ],
  "reservations":
  [
    {
      "name": "reservation-01",
      "specificReservation":
      {
        "count": "2",
        "instanceProperties":
        {
          "guestAccelerators":
          [
            {
              "acceleratorCount": 2,
              "acceleratorType": "nvidia-tesla-v100"
            }
          ],
          "machineType": "n1-standard-8"
        }
      },
      "specificReservationRequired": false,
      "zone": "us-central1-a"
    }
  ]
}

仅当在请求时有足够配额并且目标地区中有足够资源的情况下,才能成功创建承诺。

如果您创建的承诺附加了预留,则无法在承诺期间删除该预留。承诺使用合约到期时,Compute Engine 会自动删除所有附加预留。

如果您需要跨承诺使用合约中的预留转移 GPU 或本地 SSD,请参阅修改附加到承诺使用合约的预留

修改附加到承诺使用合约的预留

如果承诺使用合约具有一个或多个带 GPU/本地 SSD 的预留,可以使用 gcloud 工具或 API 在这些预留中转移 GPU 或本地 SSD。例如,您可以将 GPU 从一个预留移动到另一个新预留。

限制:

  • 只能在两个预留之间移动资源,其中一个是源预留,另一个是目标预留。源预留必须已经存在;目标预留可以是现有预留,也可以是新预留。
  • 源预留和目标预留必须位于同一地区。
  • 无法修改现有预留中的资源属性,只能将现有资源从一个预留转移到另一个预留。
  • GPU 和本地 SSD 的总数必须保持不变。
  • 每个请求只能更改 100 个虚拟机。如果想要更新更多虚拟机,请多次调用 API 或联系 Google Cloud 支持团队。
  • 您无法转移 vCPU 或内存,也无法修改附属预留的其他属性。

gcloud

使用 gcloud beta compute commitments update-reservations 命令。

创建一个承诺使用合约,其中包含一个预留:

  • res-1 具有 4 个 n1-standard-2 实例,每个实例具有 1 个 P100 GPU(4 个 vCPU 和 4 个 P100 GPU)。预留资源共包括 4 个 P100 GPU。
gcloud beta compute commitments create my-commitment-with-reservations \
    --region=asia-east1 \
    --resources=vcpu=10,memory=32GB \
    --resources-accelerator=type=nvidia-tesla-p100,count=4 \
    --plan 12-month \
    --reservations-from-file=one-reservation.yaml

one-reservation.yaml 文件包含:

- reservation: res-1
  reservation_zone: asia-east1-a
  require_specific_reservation: true
  vm_count: 4
  machine_type: n1-standard-2
  accelerator:
  - count: 1
    type: nvidia-tesla-p100

更新承诺使用合约,将 res-1 中的部分资源转移到另一个新预留 res-2。在此示例中:

  • 修改 res-1,使其具有 2 个 n1-standard-2 实例,每个实例具有 2 个 P100 GPU(2 个 vCPU 和 2 个 P100 GPU)。
  • 添加 res-2,使其具有 2 个 n1-standard-2 实例,每个实例具有 1 个 P100 GPU(4 个 vCPU 和 2 个 P100 GPU)。

承诺使用合约中预留 GPU 的总数保持不变,仍然是 4 个。

gcloud beta compute commitments update-reservations my-commitment-with-reservations \
    --region=us-central1 \
    --reservations-from-file=two-reservations.yaml

two-reservations.yaml 文件包含:

- reservation: res-1
  reservation_zone: asia-east1-a
  require_specific_reservation: true
  vm_count: 2
  machine_type: n1-standard-2
  accelerator:
  - count: 1
    type: nvidia-tesla-p100
- reservation: res-2
  reservation_zone: asia-east1-a
  require_specific_reservation: true
  vm_count: 2
  machine_type: n1-standard-2
  accelerator:
  - count: 1
    type: nvidia-tesla-p100

API

使用 regionCommitments.updateReservations 方法。

例如,您可以创建一个包含以下预留的承诺使用合约:

  • res-1 具有 4 个 n1-standard-2 实例,每个实例具有 1 个 nvidia-tesla-p100 GPU(4 个 vCPU 和 4 个 P100 GPU)。

在本例中,预留资源共包括 4 个 P100 GPU。

POST https://compute.googleapis.com/compute/beta/projects/my-project/regions/asia-east1/commitments/my-commitment-with-reservation/updateReservations

{
  "name": "my-commitment-with-reservation",
  "plan": "TWELVE_MONTH",
  "reservations":
  [
    {
      "name": "res-1",
      "specificReservation":
      {
        "count": "4",
        "instanceProperties":
        {
          "guestAccelerators":
          [
            {
              "acceleratorCount": 1,
              "acceleratorType": "nvidia-tesla-p100"
            }
          ],
          "machineType": "n1-standard-2"
        }
      },
      "specificReservationRequired": true,
      "zone": "asia-east1-a"
    }
  ],
  "resources":
  [
    {
      "amount": "10",
      "type": "VCPU"
    },
    {
      "amount": "32768",
      "type": "MEMORY"
    },
    {
      "acceleratorType": "nvidia-tesla-p100",
      "amount": "4",
      "type": "ACCELERATOR"
    }
  ]
}

更新承诺使用合约,将 res-1 中的部分资源转移到另一个新预留 res-2。在此示例中:

  • 修改 res-1,使其具有 2 个 n1-standard-2 实例,每个实例具有 2 个 P100 GPU(2 个 vCPU 和 2 个 P100 GPU)。
  • 添加 res-2,使其具有 2 个 n1-standard-2 实例,每个实例具有 1 个 P100 GPU(4 个 vCPU 和 2 个 P100 GPU)。

承诺使用合约中预留 GPU 的总数保持不变,仍然是 4 个。

POST https://compute.googleapis.com/compute/beta/projects/my-project/regions/asia-east1/commitments/my-commitment-with-reservation/updateReservations

{
  "reservations":
  [
    {
      "name": "res-1",
      "specificReservation":
      {
        "count": "2",
        "instanceProperties":
        {
          "guestAccelerators":
          [
            {
              "acceleratorCount": 1,
              "acceleratorType": "nvidia-tesla-p100"
            }
          ],
          "machineType": "n1-standard-2"
        }
      },
      "specificReservationRequired": true,
      "zone": "asia-east1-a"
    },
    {
      "name": "res-2",
      "specificReservation":
      {
        "count": "2",
        "instanceProperties":
        {
          "guestAccelerators":
          [
            {
              "acceleratorCount": 1,
              "acceleratorType": "nvidia-tesla-p100"
            }
          ],
          "machineType": "n1-standard-2"
        }
      },
      "specificReservationRequired": true,
      "zone": "asia-east1-a"
    }
  ]
}

查看预留使用情况报告

您可以通过使用情况导出功能将 Compute Engine 使用情况的详细报告导出到 Cloud Storage 存储分区。如需了解相关说明,请参阅查看使用情况报告

使用情况报告会显示以下信息:

  • 正在使用的预留资源。相应的条目显示为普通的 vCPU、内存、GPU 和本地 SSD 资源。
  • 未使用的预留资源。相应条目具有普通的 SKU 名称和预留资源 URI。
  • 总体预留资源。相应条目具有预留 SKU 名称和预留资源 URI。这些条目不会产生任何相关费用。 您可以使用这些条目计算您正在使用的预留数量。
计量项 MeasurementId 格式 Resource URI 格式
正在使用的预留资源 com.google.cloud/services/compute-engine/SKU_NAME https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/RESOURCE_TYPE/RESOURCE_NAME.

例如 https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/instances/my-instance
未使用的预留资源 com.google.cloud/services/compute-engine/SKU_NAME https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME.

例如 https://compute.googleapis.com/compute/v1/projects/my-project/zones/europe-west1-a/reservations/my-reservation
总体预留资源 com.google.cloud/services/compute-engine/ReservationSKU_NAME https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME.

例如 https://compute.googleapis.com/compute/v1/projects/my-project/zones/europe-west1-a/reservations/my-reservation

例如,在名为 my-reservation 的预留使用情况报告的以下代码段中:

  • 第 1 行显示当前正在使用的预留 RAM。该行的 ResourceId 显示此 RAM 由名为 my-instance 的实例使用。
  • 第 2 行显示未使用的预留 RAM。该行的 ResourceId 显示此预留 RAM 由 my-reservation 保留;还没有任何实例使用它。
  • 第 3 行显示预留中的总体预留 RAM。
Report Date,MeasurementId,Quantity,Unit,Resource URI,ResourceId,Location
2019-06-06,com.google.cloud/services/compute-engine/VmimageN2StandardRam,166970074857472,byte-seconds,https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-central2-a/instances/my-instance,1775485842510981624,us-central2-a
2019-06-06,com.google.cloud/services/compute-engine/VmimageN2StandardRam,166970074857472,byte-seconds,https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-central2-a/reservations/my-reservation,7.58809E+17,us-central2-a
2019-06-06,com.google.cloud/services/compute-engine/ReservationN2StandardRam,333940149714944,byte-seconds,https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-central2-a/reservations/my-reservation,7.58809E+17,us-central2-a
...

后续步骤