使用区域托管实例组分布实例

本页面介绍了如何创建分布在单个区域中的托管实例组

与属于单个地区的地区托管实例组不同,区域托管实例组内的实例会分布在单个区域内的多个地区,从而提高应用可用性。例如,默认情况下,us-east1 区域中的区域托管实例组内的实例会均匀分布在该区域内的三个地区(us-east1-bus-east1-cus-east1-d)。

对于包含四个及以上地区的区域,区域托管实例组会从这些地区中选择要在其中创建实例的三个地区。您还可以具体选择要在其中创建实例的地区,或者选择在包含不到三个地区的区域中创建实例。例如,如需使用 GPU 加快工作负载速度,请选择支持 GPU 的地区。

与地区托管实例组一样,区域托管实例组支持自动扩缩、内部负载平衡和外部负载平衡等功能。

准备工作

限制

  • 每个区域托管实例组可包含的实例数上限为 2000 个。
  • 更新托管实例组时,可以通过单个请求指定的实例数上限为 1000 个。
  • 您不能将区域托管实例组与使用 maxRate 平衡选项的负载平衡器一起使用。

选择区域托管实例组

Google 建议您使用区域托管实例组,而非地区托管实例组,这是因为前者使您能够跨多个地区分散应用负载,而不是将应用限制在单个地区,或跨不同地区管理多个实例组。这种复制功能可避免地区性故障,或单个地区中的整个实例组发生故障等无法预料的情况。如果真的出现上述故障,则您的应用可以继续处理同一区域中其他地区运行的实例的流量。

如果某个地区发生故障,或者某个地区的一组实例停止响应,则区域托管实例组会继续通过如下方式支持您的虚拟机实例:

  • 其余地区中属于区域托管实例组的实例会继续处理流量。除此之外,系统不会添加任何新实例,也不会重新分布任何实例(除非您设置了自动扩缩功能)。

  • 待发生故障的地区恢复正常后,实例组会开始重新处理来自该地区的流量。

如果要设计可靠且可扩缩的应用,请使用区域托管实例组。

主动式实例重新分布

默认情况下,区域托管实例组内的虚拟机实例会尽量在区域内的各个地区中均匀分布,以便在出现地区级别的故障时最大限度地提高应用的可用性。

如果您对实例组中的虚拟机实例执行 deleteabandon 操作,导致各地区的分布不均匀,则实例组会主动重新分布实例以恢复到分布均匀的状态。

为了在各个地区之间重建均匀的分布,实例组会删除具有较多虚拟机实例的地区中的实例,并为具有较少虚拟机实例的地区添加新实例。实例组会自动选择要删除的实例。

主动式重新分布功能重新建立跨地区的均匀分布。
主动式重新分布的示例

例如,假设您有一个区域托管实例组,其中每个地区(us-central1-aus-central1-bus-central1-c)都有 4 个实例。如果您删除 us-central1-c 中的 3 个虚拟机实例,则实例组会尝试重新平衡,以使实例再次均匀分布在各个地区。在此示例中,实例组会删除 2 个实例(一个来自 us-central1-a,另一个来自 us-central1-b),然后在地区 us-central1-c 中创建 2 个实例;如此一来,每个地区都会有 3 个实例,从而实现了均匀分布。请注意,无法选择性地确定要删除的实例。

如需防止实例自动重新分布,您可以在创建更新区域托管实例组时关闭主动式实例重新分布功能。

在以下情况下,此操作非常有用:

  • 从组中删除或移除虚拟机而不影响其他正在运行的虚拟机实例。例如,您可以在作业完成后删除批处理工作器虚拟机实例,而不影响其他工作器。
  • 避免主动式重新分布功能意外自动删除具有有状态应用的虚拟机。
停用主动式重新分布功能可能会影响地区发生故障期间的容量。
停用主动式重新分布功能后的不均匀分布

如果关闭主动式实例重新分布功能,则托管实例组不会主动添加或移除实例以实现平衡,但在执行调整规模操作期间,托管实例组仍然会根据具体时机尽力实现平衡(通过每个调整规模操作来平衡实例组)。例如,纵向缩减时,实例组会自动从较大地区中移除实例;纵向扩容时,实例组会为较小地区添加实例。

预配合适的托管实例组规模以确保可用性

鉴于各种事件可能导致一个或多个实例不可用,您可以使用多项 GCP 服务缓解此问题:

但是,即使您使用这些服务,如果同时有太多实例不可用,您的用户仍可能会遇到问题。

为了应对在一个地区发生故障或整个实例组停止响应的极端情况,我们强烈建议您对托管实例组进行超额预配。如果某个地区或一组实例无响应,则根据您的应用需求对您的实例组进行超额预配可防止系统完全瘫痪。

Google 会针对超额预配提出建议,以优先确保您的用户能够使用您的应用。这些建议将包括预配超出您的应用日常所需数量的虚拟机实例,并支付相应费用。您可以通过考虑您的应用需求和费用限制来确定超额预配。

估计建议的实例组规模

Compute Engine 建议您预配足够的实例,以便在任何一个地区中的所有实例都不可用时,您的其余实例仍然达到所需的最少实例数。

请使用下表确定实例组的最小建议规模:

地区数 额外虚拟机 建议的虚拟机总数
2 +100% 200%
3 +50% 150%
4 +33% 133%

建议的额外虚拟机数量与托管实例组所在地区的数量成反比。因此,您可以通过在更多地区中均匀分布应用来减少额外虚拟机的数量。

在三个或更多地区中预配区域托管实例组

在具有至少三个地区的区域中创建区域托管实例组时,Google 建议您将实例组超额预配至少 50%。默认情况下,区域托管实例组会在三个地区创建实例。在三个地区创建虚拟机实例已经帮助您保留了至少 2/3 的服务容量;如果其中一个地区发生故障,该区域中的另外两个地区可以继续处理流量,而不会出现中断情况。而如果将该实例组超额预配为 150%,那么您将可以确保即使失去了 1/3 的容量,其余地区也能为 100% 的流量提供支持。

例如,如果跨三个地区的托管实例组需要 20 个虚拟机实例,我们建议您至少额外增加 50% 的实例。在此示例中,20 的 50% 是 10(即增加 10 个实例),这样一来,该实例组中的实例总共会有 30 个。如果您创建规模为 30 的区域托管实例组,则实例组会在这三个地区中尽可能均匀地分布您的实例,如下所示:

地区 实例数
example-zone-1 10
example-zone-2 10
example-zone-3 10

如果其中任何一个地区发生故障,您仍然有 20 个实例可以处理流量。

在两个地区中预配区域托管实例组

如需在两个(而不是三个)地区预配实例,Google 建议您将实例数增加一倍。例如,如果您的服务需要 20 个虚拟机实例,这些实例分布在两个地区,我们建议您配置一个包含 40 个实例的区域托管实例组,以便每个地区都有 20 个实例。如果一个地区发生故障,您仍然有 20 个实例可以处理流量。

地区 实例数
example-zone-1 20
example-zone-2 20

如果实例组中的实例数很难在两个地区之间划分,Compute Engine 会尽可能均匀地划分实例,并将其余实例随机划入其中一个地区。

在一个地区中预配区域托管实例组

您可以只在一个地区创建区域托管实例组。这类似于创建地区托管实例组

我们建议您不要在一个地区创建区域托管实例组,因为它为高可用性应用提供的是最低限度的保证。如果该地区发生故障,则整个托管实例组可能都不可用,从而对您的用户造成潜在影响。

为您的实例组选择地区

区域托管实例组的默认配置是在三个地区中尽可能均匀地分布实例。但出于各种原因,您可能需要为应用选择特定地区。例如,如果您的实例需要 GPU,那么您只能选择支持 GPU 的地区。您的永久性磁盘可能只适用于特定地区,或者您可能希望仅在几个特定的地区(而不是一个区域内的三个随机地区)开始创建虚拟机实例。

如果要选择地区数或选择实例组应在其中运行的特定地区,则必须在首次创建实例组时执行此类操作。您在创建实例组的过程中选择了特定地区以后,日后将无法更改或更新这些地区。

  • 如需在一个区域内选择四个及以上地区,您必须明确指定各个地区。例如,如需选择一个区域内的所有四个地区,您必须在请求中明确提供所有四个地区。否则,Compute Engine 默认选择三个地区。

  • 如需在一个区域中选择两个或更少地区,您必须明确指定各个地区。并且,即使该区域只包含两个地区,您也必须在请求中明确指定这些地区。

无论您是选择特定地区,还是只希望选择区域并允许 Compute Engine 在区域内的所有地区中创建实例,默认情况下,这些新的虚拟机实例都将在所有地区中均匀分布。最佳做法是,确保预配足够多的虚拟机实例,从而为指定数量的地区中的应用提供支持。

创建区域托管实例组

您可以使用 gcloud 命令行工具、控制台API 创建区域托管实例组。

如果每个地区中没有足够的容量来支持实例组中的实例,则 Compute Engine 会创建尽可能多的实例,并在后续获得额外配额时继续尝试创建其余实例。

由于您要创建的是区域托管实例组,因此请注意,某些资源是地区性的,例如永久性磁盘。如果您要在实例模板中指定地区资源(如额外的永久性磁盘),则必须确保所有地区中都存在该磁盘,以便将该磁盘挂接到由此区域托管实例组创建的实例。

默认情况下,如果您未在请求中明确指定各个地区,则 Compute Engine 会自动选择三个地区来创建实例。如果您需要在多于或少于三个地区中创建实例,或者您希望选择使用哪些地区,请在您的请求中提供地区列表。如需了解详情,请参阅为您的实例组选择地区

主动式实例重新分布功能默认启用。如果需要手动管理每个地区中的实例数量,您可以停用主动式实例重新分布功能,这样也就无法配置自动扩缩。如需了解详情,请参阅主动式实例重新分布

控制台

  1. 转到 GCP Console 上的实例组页面。

    转到“实例组”页面

  2. 点击创建实例组以创建一个新的实例组。
  3. 位置下,选择多个地区
  4. 选择所需的区域。
  5. 如果要选择特定地区,请点击配置地区以选择要使用的地区。
  6. 如果要停用主动式实例重新分布功能,请执行以下操作
    1. 确保将自动扩缩模式设置为关闭
    2. 实例重新分布设置为关闭
  7. 为实例组选择一个实例模板或创建一个新实例模板。
  8. 指定该组的实例数量。请务必预配足够多的实例,以便在一个地区发生故障时,您的应用可获得相应的支持。
  9. 继续执行托管实例组创建过程的其余步骤。

gcloud

所有托管实例组都需要实例模板。如果您没有实例模板,请创建一个。例如,以下命令会创建具有默认属性的基本实例模板:

gcloud compute instance-templates create example-template

接下来,使用 instance-groups managed create 子命令以及 --region 标志。例如,该命令会在 us-east1 区域内的三个地区中创建一个区域托管实例组:

gcloud compute instance-groups managed create example-rmig \
    --template example-template --base-instance-name example-instances \
    --size 30 --region us-east1

如果要选择实例组应使用的特定地区,请使用 --zones 标志:

gcloud compute instance-groups managed create example-rmig \
    --template example-template --base-instance-name example-instances \
    --size 30 --zones us-east1-b,us-east1-c

如果要停用主动式实例重新分布功能,请将 --instance-redistribution-type 标志设置为 NONE。由于此功能处于测试版阶段,因此您必须使用 gcloud beta 工具。如果启用了自动扩缩,则无法停用主动式实例重新分布功能。

gcloud beta compute instance-groups managed create example-rmig \
    --template example-template --base-instance-name example-instances \
    --size 30 --instance-redistribution-type NONE

注意:如果要停用主动式实例重新分布功能,请使用 gcloud beta 组件,因为停用主动式实例重新分布功能目前处于测试版阶段。

API

所有托管实例组都需要实例模板。如果您没有实例模板,请创建一个

在 API 中,构建一个向 regionInstanceGroupManagers.insert 方法发出的 POST 请求。在请求正文中,添加所需的组名、组大小、组中实例的基本名称以及实例模板的网址。

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers

{
  "baseInstanceName": "[BASE_INSTANCE_NAME]",
  "instanceTemplate": "global/instanceTemplates/[INSTANCE_TEMPLATE_NAME]",
  "name": "[INSTANCE_GROUP_NAME]",
  "targetSize": "[TARGET_SIZE]",
  "distributionPolicy": {
     "zones": [
       {"zone": "zones/[ZONE]"},
       {"zone": "zones/[ZONE]"}
      ]
   }
}

其中:

  • [PROJECT_ID] 是此请求的项目 ID。
  • [REGION] 是实例组所在的区域。
  • [BASE_INSTANCE_NAME] 是实例组中创建的每个实例的名称。例如,基本实例名称 example-instance 将创建名称类似于 example-instance-[RANDOM_STRING] 的实例,其中 [RANDOM_STRING] 由服务器生成。
  • [INSTANCE_TEMPLATE_NAME] 是要使用的实例模板。
  • [TARGET_SIZE] 是实例组中的实例的目标数量。

如果您要选择特定地区,或者要在包含的地区少于或多于三个的区域中创建实例,请在您的请求中添加 distributionPolicy 属性并提供地区列表。然后,将 [ZONE] 替换为要在其中创建实例的地区的名称。

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers

{
  "baseInstanceName": "[BASE_INSTANCE_NAME]",
  "instanceTemplate": "global/instanceTemplates/[INSTANCE_TEMPLATE_NAME]",
  "name": "[INSTANCE_GROUP_NAME]",
  "targetSize": "[TARGET_SIZE]",
  "distributionPolicy": {
     "zones": [
       {"zone": "zones/[ZONE]"},
       {"zone": "zones/[ZONE]"}
      ]
   }
}

例如,以下命令会创建一个名为 example-rmig 的实例组,其中的 10 个实例分布在 us-east1-bus-east1-c 地区:

POST https://www.googleapis.com/compute/v1/projects/myproject/regions/us-east1/instanceGroupManagers
{

  "baseInstanceName": "example-instance",
  "instanceTemplate": "global/instanceTemplates/example-instance",
  "name": "example-rmig",
  "targetSize": 10,
  "distributionPolicy": {
      "zones": [
        {"zone": "zones/us-east1-b"},
        {"zone": "zones/us-east1-c"}
      ]
   }
}

如果要停用主动式实例重新分布功能,请在您的请求中包含 updatePolicy 属性并将其 instanceRedistributionType 设置为 NONE。由于此功能处于测试版阶段,因此您必须使用测试版 API。如果启用了自动扩缩功能,则无法停用主动式实例重新分布功能。

POST https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers

{
  "baseInstanceName": "[BASE_INSTANCE_NAME]",
  "instanceTemplate": "global/instanceTemplates/[INSTANCE_TEMPLATE_NAME]",
  "name": "[INSTANCE_GROUP_NAME]",
  "targetSize": "[TARGET_SIZE]",
  "updatePolicy": {
     "instanceRedistributionType": "NONE"
   },
}

列出区域托管实例组中的实例

如需获取区域托管实例组的实例列表,请使用 GCP Consolegcloud 命令行工具中的 instance-groups managed list-instances 命令,或向 regionInstanceGroupManagers.listManagedInstances 方法发出请求。

控制台

  1. 转到 GCP Console 上的“实例组”页面。

    转到“实例组”页面

  2. 点击要查看其实例的区域托管实例组的名称。

此时系统会加载“实例组详情”页面,其中包含该实例组中的实例列表。

gcloud

运行 instance-groups managed list-instances 命令:

gcloud compute instance-groups managed list-instances [INSTANCE_GROUP_NAME] --region [REGION]

其中:

  • [INSTANCE_GROUP_NAME] 是实例组的名称。
  • [REGION] 是实例组所在的区域。

例如,以下命令列出了区域 us-east1 中一个名为 example-rmig 的实例组的所有实例:

gcloud compute instance-groups managed list-instances example-rmig --region us-east1

API

在 API 中,构建一个向 regionInstanceGroupManagers.listManagedInstances 方法发出的空 GET 请求。

GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers/[INSTANCE_GROUP_NAME]

例如:

GET https://www.googleapis.com/compute/v1/projects/myproject/regions/us-east1/instanceGroupManagers/example-rmig

更新区域托管实例组

您可以使用实例组更新程序功能更新区域托管实例组。利用该更新程序,您可以将组中的部分实例或所有实例更新为新的实例模板。此外,您还可以使用该更新程序执行 Canary 更新并控制更新速度。

与此相关的是,您还可以使用 gcloud 中的 set-instance-template 命令或使用 API 中的 setInstanceTemplate 方法更改实例组的实例模板,而无需更新现有实例。请注意,如果更改实例模板,则系统不会自动根据新的实例模板来更新现有实例。您必须重新创建各个实例或运行实例组更新程序以应用这些更改。但是,实例组中的新虚拟机实例将使用新的实例模板。

停用和重新启用主动式实例重新分布功能

主动式实例重新分布功能可平衡区域内选定地区中的实例数。此配置可在出现地区级别故障时最大限度地提高应用的可用性。

对于区域托管实例组,主动式实例重新分布功能默认启用,但您可以为非自动扩缩的托管实例组停用该功能。主动式实例重新分布功能停用时,实例组不会尝试主动跨地区重新分布实例。在以下情况下,此机制很有用:

  • 从实例组中手动删除或移除虚拟机实例而不影响其他正在运行的实例。
  • 在作业完成时自动删除批处理工作器实例,而不影响其他工作器。
  • 避免主动式实例重新分布功能意外自动删除具有有状态应用的实例。

如果您删除或移除实例组中的虚拟机实例,导致各地区的实例数不平衡,则在重新启用主动式重新分布功能之前,您必须手动平衡实例组。如需手动重新平衡实例组,请调整实例组规模或删除包含较多实例的地区中的实例。

当您调整已关闭主动式实例重新分布功能的托管实例组的规模时,该实例组仍然会根据具体时机尽力实现平衡,通过每个调整规模操作来平衡实例组:扩大规模时,实例组总是会尝试为包含虚拟机数最少的地区添加实例;缩减规模时,实例组总是会从包含最多实例的地区中移除实例。

手动调整实例组规模以实现均匀重新分布的示例

您可以使用控制台、gcloud 工具或 API 创建启用主动式实例重新分布功能的实例组,或为现有实例组关闭或启用主动式实例重新分布功能。

创建停用了主动式重新分布功能的实例组

控制台

  1. 转到 GCP Console 上的“实例组”页面。

    转到“实例组”页面

  2. 点击创建实例组以创建一个新的实例组。
  3. 位置下,选择多个地区
  4. 选择所需的区域。
  5. 如果要选择特定地区,请点击配置地区以选择要使用的地区。
  6. 如需停用主动式实例重新分布功能,请执行以下操作:
    1. 确保将自动扩缩模式设置为关闭
    2. 实例重新分布设置为关闭
  7. 为实例组选择一个实例模板或创建一个新实例模板。
  8. 指定该组的实例数量。请务必预配足够多的实例,以便在一个地区发生故障时,您的应用可获得相应的支持。
  9. 继续执行托管实例组创建过程的其余步骤。

gcloud

如需创建不具备主动式实例重新分布功能的新的区域托管实例组,请使用 gcloud beta compute instance-groups managed create 命令,并将 --instance-redistribution-type 标志设置为 NONE

gcloud beta compute instance-groups managed create [INSTANCE_GROUP_NAME] \
    --template [TEMPLATE] \
    --size [SIZE] \
    --zones [ZONES] \
    --instance-redistribution-type NONE

其中:

  • [INSTANCE_GROUP_NAME] 是实例组的名称。
  • [TEMPLATE] 是要用于实例组的实例模板的名称。
  • [SIZE] 是实例组的目标规模
  • [ZONES] 是您需要部署虚拟机实例的区域的地区列表。

例如:

gcloud beta compute instance-groups managed create example-rmig \
    --template example-template \
    --size 30 \
    --zones us-east1-b,us-east1-c \
    --instance-redistribution-type NONE

API

如需创建不具备主动式实例重新分布功能的非自动扩缩区域托管实例组,请构建一个 POST 请求以调用 regionInstanceGroupManagers.insert 方法。在请求正文中,包含 updatePolicy 属性并将其 instanceRedistributionType 字段设置为 NONE

POST
https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers/[INSTANCE_GROUP_NAME]
{
    "name": "[INSTANCE_GROUP_NAME]",
    "baseInstanceName": "[BASE_INSTANCE_NAME]",
    "instanceTemplate": "global/instanceTemplates/[TEMPLATE]",
    "targetSize": "[TARGET_SIZE]",
    "distributionPolicy": {
        "zones": [
            {"zone": "zones/[ZONE]"},
            {"zone": "zones/[ZONE]"}
        ]
    },
    "updatePolicy": {
        "instanceRedistributionType": "NONE"
    }
}

其中:

  • [PROJECT_ID] 是此请求的项目 ID。
  • [REGION] 是实例组所在的区域。
  • [INSTANCE_GROUP_NAME] 是实例组的名称。
  • [BASE_INSTANCE_NAME] 是每个实例的名称前缀。实例名称后缀是自动生成的。
  • [TEMPLATE] 是要用于实例组的实例模板的名称。
  • [TARGET_SIZE] 是实例组的目标规模。
  • [ZONE] 是您需要部署虚拟机实例的区域中一个地区的名称。

关闭主动式实例重新分布功能

您必须先关闭自动扩缩功能,然后才能关闭主动式实例重新分布功能。

控制台

  1. 转到 GCP Console 上的“实例组”页面。

    转到“实例组”页面

  2. 选择要更新的实例组,然后点击修改组
  3. 确保将自动扩缩模式设置为关闭
  4. 实例重新分布设置为关闭以停用自动重新分布功能。
  5. 点击保存

gcloud

如需为非自动扩缩的区域托管实例组停用主动式实例重新分布功能,请使用 compute instance-groups managed update 命令,并将 --instance-redistribution-type 标志设置为 NONE

 gcloud beta compute instance-groups managed update [INSTANCE_GROUP_NAME]
    --instance-redistribution-type NONE \
    --region [REGION]

其中:

  • [INSTANCE_GROUP_NAME] 是实例组的名称。
  • [REGION] 是实例组所在的区域。

注意:如果要停用主动式实例重新分布功能,请使用 gcloud beta 组件,因为停用实例重新分布功能目前处于测试版阶段。

API

在 API 中,构建一个向 regionInstanceGroupManagers.patch 方法发出的 PATCH 请求。在请求正文中,包含 updatePolicy 属性并将其 instanceRedistributionType 字段设置为 NONE

PATCH
https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers/[INSTANCE_GROUP]

{
    "updatePolicy": {
         "instanceRedistributionType": "NONE"
    }
}

其中:

  • [PROJECT_ID] 是此请求的项目 ID。
  • [REGION] 是实例组所在的区域。
  • [INSTANCE_GROUP] 是非自动扩缩托管实例组的名称。

注意:如果要停用主动式实例重新分布功能,请使用测试版 API,因为关闭实例重新分布功能目前处于测试版阶段。

启用主动式实例分布功能

如需启用主动式实例分布功能,请使用与停用主动式实例重新分布功能类似的命令,但将实例重新分布类型设置为 PROACTIVE

如果您手动删除或移除某些实例,导致区域内实例分布不均匀,则必须先手动重新平衡组,然后才能重新启用主动式实例重新分布功能。任意两个地区的虚拟机实例数量差不应超过 1 个虚拟机。

您可以手动删除具有较多实例的地区中的虚拟机,或者调大实例组规模以填充具有较少实例的地区,从而使各个地区的实例均匀分布。

当各个地区中的实例分布不均匀(两个地区的虚拟机实例数量差为 2 个或以上虚拟机)时,区域托管实例组不允许启用主动式实例重新分布功能。这是为了防止意外自动删除具有较多实例的地区中的虚拟机,该操作会为了实现均匀分布而触发。

自动扩缩区域托管实例组

Compute Engine 为托管实例组提供了自动扩缩功能,因此您的实例组能够根据负载的增减自动添加或移除实例。

如果您为区域托管实例组启用了自动扩缩功能,则该功能将按照如下方式运作:

  • 自动扩缩政策将应用于整个组(而不是单个地区)。例如,如果您启用了自动扩缩程序,目标是实现 66% 的 CPU 利用率,则自动扩缩程序会跟踪实例组中的所有实例,以使所有地区中的所有实例保持 66% 的平均利用率。

  • 自动扩缩功能会尽可能尝试在可用地区之间均匀分布实例。通常,自动扩缩程序保持各地区大小平衡的方法是增加实例较少地区的实例数量,预期负载会从实例较多的地区重定向(例如,通过负载平衡器的作用)。我们建议不要配置偏好一个地区的自定义负载平衡器,因为这可能会导致意外行为。

  • 如果您的工作流在 3 个地区均匀使用实例,并且某个地区发生故障,或者某个地区内的一组实例发生故障,则可能会失去 1/3 的容量,但 2/3 的容量会保留在其他地区。我们建议您超额预配自动扩缩的区域托管实例组,以避免在某个地区发生故障期间,仍在继续运行的服务器过载。

  • 如果某个地区的资源(例如抢占式实例)暂时不可用,则实例组会继续尝试在该地区创建这些托管实例。资源再次可用后,实例组会获取所需数量的运行实例。

  • 如果启用了负载平衡功能并且某个地区的资源不可用,导致该地区现有资源的利用率较高,则系统可能会在利用率较低的地区创建新实例,从而可能导致分布暂时不均匀。

自动扩缩程序向一个地区添加的实例数量不会超过为实例组指定的实例数上限的 1/n,其中 n 是预配地区的数量。例如,如果您使用的是默认设置(3 个地区),并且为自动扩缩功能配置的 maxNumReplicas 是 15,则自动扩缩程序最多只能在每个地区为实例组添加 5 (1/3 * 15 = 5) 个实例。如果一个地区发生故障,则自动扩缩程序只会将剩下两个地区中总共的实例数量扩大为 maxNumReplicas 的 2/3。

预配自动扩缩程序配置

与超额预配托管实例组的建议类似,您应该超额预配自动扩缩程序配置,以便:

  • 自动扩缩的利用率目标是预计利用率目标的 2/3。
  • 为了适应利用率目标降低的情况,自动扩缩程序将添加更多的实例,因此您应该增大 maxNumReplicas 的值,使其比您设置的数量超出 50%,而不考虑超额预配。

例如,如果您预计 20 个实例可以处理峰值负载,并且目标利用率为 80%,请对自动扩缩程序进行如下设置:

  • 将目标利用率设置为 2/3 * 0.8 = 0.53 或 53%,而不是 80%
  • 将实例数上限设置为 3/2 * 20 = 30,而不是 20

此设置可确保在单个地区发生故障时,您的实例组不会耗尽容量,因为剩余的 2/3 实例应该能够处理因某个地区发生故障而增加的负载(这是因为您已将目标利用率降到其容量以下)。此外,自动扩缩程序还会添加新实例,以使实例数量达到您为了维持 2/3 的利用率目标而指定的实例数上限。

但是,您不应该仅依靠超额预配托管实例组来处理增加的负载。Google 建议的最佳做法是定期对应用进行负载测试,以确保应用可以处理可能因某个地区发生服务中断(因而使 1/3 的实例被移除)而导致的利用率升高情况。

启用自动扩缩

控制台

  1. 转到 GCP Console 上的“实例组”页面。

    转到“实例组”页面

  2. 如果您没有实例组,请创建一个。否则,点击列表中现有区域托管实例组的名称。
  3. 在实例组详情页面上,点击修改组按钮。
  4. 在“自动扩缩”下方,选中开启
  5. 填写自动扩缩配置的属性。
  6. 保存更改。

gcloud

依次使用 gcloud 命令行工具和set-autoscaling 子命令启用区域自动扩缩,然后添加 --region 标志。如需详细了解如何创建自动扩缩程序,请参阅自动扩缩文档

例如,以下代码段为名为 example-rmig 的示例实例组设置了自动扩缩程序。您需要将 us-east1 替换为您的托管实例组所在的区域,将 example-autoscaler 替换为期望的自动扩缩程序名称,然后将 example-rmig 替换为区域托管实例的名称:

gcloud compute instance-groups managed set-autoscaling example-rmig \
    --target-cpu-utilization 0.8 --max-num-replicas 5 --region us-east1

API

如需在 API 中设置区域自动扩缩,请对以下网址发出 POST 请求(其中包含您自己的项目 ID 和托管实例组所在的区域):

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/regionAutoscalers/

您的请求正文必须包含 nametargetautoscalingPolicy 字段。并且 autoscalingPolicy 必须定义 cpuUtilizationmaxNumReplicas

{
 "name": "[AUTOSCALER_NAME]",
 "target": "regions/us-east1/instanceGroupManagers/[INSTANCE_GROUP_NAME]",
 "autoscalingPolicy": {
    "maxNumReplicas": [MAX_NUM_INSTANCES],
    "cpuUtilization": {
       "utilizationTarget": [TARGET_UTILIZATION]
     },
    "coolDownPeriodSec": [SECONDS]
  }
}

例如:

{
 "name": "example-autoscaler",
 "target": "regions/us-east1/instanceGroupManagers/example-rmig",
 "autoscalingPolicy": {
    "maxNumReplicas": 10,
    "cpuUtilization": {
       "utilizationTarget": 0.8
     },
    "coolDownPeriodSec": 30
  }
}

更新自动扩缩程序

您可以更新区域自动扩缩程序,就像更新地区自动扩缩程序一样。请参阅关于更新自动扩缩程序的文档。

将区域托管实例组添加到负载平衡器

Google Cloud Platform 负载平衡使用实例组来处理流量。您可以将实例组添加到目标池或后端服务中,具体取决于您使用的负载平衡器类型。如需详细了解托管实例组和负载平衡,请参阅实例组概览

您可以将区域托管实例组指定为用于外部负载平衡内部负载平衡的后端服务的目标,或者将其指定为用于网络负载平衡的目标池的一部分。

对于 HTTP(S) 负载平衡,区域托管实例组仅支持 maxRatePerInstancemaxUtilization

将区域托管实例组添加到后端服务

创建 HTTP(S)、SSL 代理、TCP 代理或内部负载平衡器需要后端服务。后端服务包含多个单独的后端,每个后端包含一个实例组(托管或非托管)。实例组中的实例响应来自负载平衡器的流量,后端服务可借此了解可以使用哪些实例、可以处理多少流量,以及当前正在处理多少流量。此外,后端服务会监控运行状况检查,并且不会向运行状况不佳的实例发送新连接。

有关将实例组添加到后端服务的说明,请参阅将实例组添加到后端服务

将区域托管实例组添加到目标池

目标池是包含一个或多个虚拟机实例的对象。目标池可用于网络负载平衡操作,由网络负载平衡器将用户请求转发到附加的目标池。属于该目标池的实例会处理这些请求并返回响应。您可以将托管实例组添加到目标池,这样一来,当您在实例组中添加或移除实例时,目标池也会自动更新并应用这些更改。

目标池必须存在,这样您才能将托管实例组添加到目标池。如需了解详情,请参阅关于添加目标池的文档。

如需将现有托管实例组添加到目标池,请按照以下说明操作。完成该操作后,属于托管实例组的所有虚拟机实例都会被添加到目标池。

控制台

  1. 转到 GCP Console 中的“目标池”页面。

    转到“目标池”页面

  2. 点击您要向其中添加实例组的目标池。
  3. 点击修改按钮。
  4. 向下滚动到虚拟机实例部分,然后点击选择实例组
  5. 从下拉菜单中选择一个实例组。
  6. 保存更改。

gcloud

gcloud 命令行工具中,使用 set-target-pools 命令:

gcloud beta compute instance-groups managed set-target-pools [INSTANCE_GROUP] \
    --target-pools [TARGET_POOL,..] [--region REGION]

其中:

  • [INSTANCE_GROUP] 是实例组的名称。
  • [TARGET_POOL] 是要向其中添加此实例组的一个或多个目标池的名称。
  • [REGION] 是实例组所在的区域。

API

在 API 中,向以下 URI 发出 POST 请求:

POST https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/regions/[REGION]/regionInstanceGroupManagers/[INSTANCE_GROUP]/setTargetPools

其中:

  • [PROJECT_ID] 是此请求的项目 ID。
  • [REGION] 是实例组所在的区域。
  • [INSTANCE_GROUP] 是实例组的名称。

请求正文应包含您要向其中添加此组的目标池的 URI 列表。例如:

{
  "targetPools": [
    "regions/us-central1/targetPools/example-targetpool-1",
    "regions/us-central1/targetPools/example-targetpool-2"
  ]
}

模拟区域托管实例组在一个地区发生服务中断的情况

如需测试您的区域托管实例组的超额预配是否足够,能否在发生地区服务中断后继续运行,您可以使用以下示例来模拟一个地区发生的故障。

默认情况下,此脚本会停止并启动 Apache。如果这不适用于您的应用,请将停止和启动 Apache 的命令替换为您遇到的故障和恢复情况下的命令。

  1. 在实例组中的每个虚拟机实例中连续部署并运行此脚本。您可以通过以下方式完成此操作:将此脚本添加到实例模板,或将此脚本包含在自定义映像中,并在实例模板中使用该映像。

    #!/usr/bin/env bash
    
    # Copyright 2016 Google Inc. All Rights Reserved.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    set -o nounset
    set -o errexit
    set -o pipefail
    
    function GetMetadata() {
      curl -s "$1" -H "Metadata-Flavor: Google"
    }
    
    PROJECT_METADATA_URL="http://metadata.google.internal/computeMetadata/v1/project/attributes"
    INSTANCE_METADATA_URL="http://metadata.google.internal/computeMetadata/v1/instance"
    ZONE=$(GetMetadata "$INSTANCE_METADATA_URL/zone" | cut -d '/' -f 4)
    INSTANCE_NAME=$(hostname)
    
    # We keep track of the state to make sure failure and recovery is triggered only once.
    STATE="healthy"
    while true; do
      if [[ "$ZONE" = "$(GetMetadata $PROJECT_METADATA_URL/failed_zone)" ]] && \
         [[ "$INSTANCE_NAME" = *"$(GetMetadata $PROJECT_METADATA_URL/failed_instance_names)"* ]]; then
        if [[ "$STATE" = "healthy" ]]; then
          STATE="failure"
          # Do something to simulate failure here.
          echo "STARTING A FAILURE"
          /etc/init.d/apache2 stop
        fi
      else
        if [[ "$STATE" = "failure" ]] ; then
          STATE="healthy"
          # Do something to recover here.
          echo "RECOVERING FROM FAILURE"
          /etc/init.d/apache2 start
        fi
      fi
      sleep 5
    done
    
    
  2. 通过设置以下两个项目元数据字段来模拟在一个地区发生的故障:

    • failed_zone:设置您要模拟其中的服务中断情况的地区(假定只有一个地区发生了故障)。
    • failed_instance_names:按名称选择发生故障的实例(假定只有名称包含此字符串的实例发生了故障)。

    您可以使用 gcloud 命令行工具设置此元数据。例如,以下命令会将发生服务中断情况的地区设置为 europe-west1-b 地区,并影响名称以 instance-base-name 开头的实例:

    gcloud compute project-info add-metadata --metadata failed_zone='europe-west1-b',failed_instance_names='instance-base-name-'
    
  3. 模拟完服务中断情况后,通过移除元数据键来进行故障恢复:

    gcloud compute project-info remove-metadata --keys failed_zone,failed_instance_names
    

以下是一些针对您可以使用此脚本运行的故障场景的提示:

  • 完全停止应用以查看托管实例组的响应方式。
  • 在进行负载平衡运行状况检查时,使您的实例返回“运行状况不佳”。
  • 修改 iptables 以阻止一部分流量进出实例。
  • 关闭虚拟机实例。默认情况下,区域托管实例组很快就会重新创建实例,但只要设置了元数据值,新的实例将在脚本运行后立即自行关闭。这会导致崩溃循环。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档