将非代管式虚拟机组合在一起


非托管式实例组是位于同一项目、可用区、VPC 网络和子网中的虚拟机 (VM) 实例的集合。非托管式实例组有助于将需要个别配置设置或调整的虚拟机分组在一起。您可以在负载均衡器的后端服务中使用非托管式实例组。

对于需要一致的配置设置的虚拟机,您可以使用基于实例模板代管式实例组 (MIG)。我们建议尽可能使用代管式实例组,而不是非代管式实例组。如需创建代管式实例组,请参阅创建 MIG

您可以将任一类型的实例组作为后端添加到 Google Cloud 负载均衡器。如需了解详情,请参阅 Cloud Load Balancing 概览。如需了解 Cloud Load Balancing 支持的每个实例组的虚拟机数,请参阅每个实例组的虚拟机数

如需详细了解实例组,请参阅实例组概览

准备工作

  • 如需了解托管实例组和非托管实例组之间的区别,请参阅相关文档。
  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

使用非代管实例组

创建实例组

代管式实例组不同,非代管式实例组是不共用公共实例模板的不同虚拟机的集合。您只需创建一个组,然后向其逐个添加虚拟机。

控制台

  1. 在 Google Cloud 控制台中,转到实例组页面。

    转到“实例组”页面

  2. 点击创建实例组
  3. 点击新建非代管式实例组
  4. 为该非托管实例组输入名称。
  5. 位置下,选择区域和地区。
  6. 选择网络子网
  7. 虚拟机实例下,选择要添加到该实例组的虚拟机。
  8. 点击创建

gcloud

如需创建新的非代管实例组,请使用 instance-groups unmanaged create 命令:

gcloud compute instance-groups unmanaged create instance-group-name \
    --zone=zone

替换以下内容:

  • instance-group-name:您要创建的实例组的名称。
  • zone:您要修改已命名端口的实例组的地区。

REST

如需使用 REST 创建非代管式实例组,请使用 instanceGroups.insert 方法发送 POST 请求:

POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instanceGroups

{
   "name": "instance-group-name"
}

替换以下内容:

  • instance-group-name:您要创建的实例组的名称。
  • zone:您要创建实例组的区域。
  • project-id:该实例组所属项目的 ID。

当您使用 Google Cloud CLI 或 REST 创建新的非代管式实例组时,系统不会自动向其添加任何虚拟机。您可以手动将虚拟机添加到非代管式实例组

列出和描述实例组

检索现有非托管实例组的列表。

控制台

在 Google Cloud 控制台中,实例组页面列出了现有的非代管式和代管式实例组

转到“实例组”页面

gcloud

如需使用 Google Cloud CLI 列出项目中的所有非代管式实例组,请使用 instance-groups unmanaged list 命令:

gcloud compute instance-groups unmanaged list

如需查看特定非代管实例组的相关信息,请使用 instance-groups unmanaged describe 命令:

gcloud compute instance-groups unmanaged describe instance-group-name \
   --zone=zone

替换以下内容:

  • instance-group-name:要描述的实例组的名称。
  • zone:实例组的区域。

REST

如需使用 REST 列出实例组,请使用 instanceGroups.list 方法发送 GET 请求:

GET https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instanceGroups

如需使用 API 获取特定非代管实例组的相关信息,请使用 instanceGroups.get 方法发送 GET 请求:

GET https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instanceGroups/instance-group-name

替换以下内容:

  • instance-group-name:要描述的实例组的名称。
  • zone:实例组的区域。
  • project-id:该实例组所属项目的 ID。

删除实例组

与代管实例组不同,删除非代管实例组不会删除该实例组内的任何虚拟机,而只会移除虚拟机的逻辑分组。

如果实例组是 Google Cloud 负载平衡器的后端,您无法将其删除。您必须先从后端服务移除该后端

控制台

  1. 在 Google Cloud 控制台中,转到实例组页面。

    转到“实例组”页面

  2. 从列表中选择一个或多个非托管实例组。
  3. 点击删除,移除这些实例组。系统会移除实例组,但不会删除实例组中的虚拟机。

gcloud

如需删除非代管实例组,请使用 instance-groups unmanaged delete 命令:

gcloud compute instance-groups unmanaged delete instance-group-name \
    --zone=zone

替换以下内容:

  • instance-group-name:您要删除的实例组的名称。
  • zone:实例组的区域。

REST

如需使用 REST 删除非代管式实例组,请使用 instanceGroups.delete 方法发送 DELETE 请求:

DELETE https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instanceGroups/instance-group-name

替换以下内容:

  • instance-group-name:您要删除的实例组的名称。
  • zone:实例组的区域。
  • project-id:该实例组所属项目的 ID。

实例组成员资格

添加虚拟机

创建非代管实例组后,您可以向该实例组添加虚拟机。 但是,只有在每个虚拟机的第一个或唯一网络接口 (nic0) 连接到同一 VPC 网络时,您才能将这些虚拟机分组在一起。 您最多可以向非托管式实例组添加 2,000 个虚拟机。如果要向实例组添加 2,000 个以上的虚拟机,请与支持团队联系

控制台

  1. 在 Google Cloud 控制台中,转到实例组页面。

    转到“实例组”页面

  2. 在列表的名称列下,点击要添加虚拟机的实例组的名称。随即打开的页面中会显示实例组属性以及其中所含的虚拟机列表。
  3. 点击修改以修改此非代管式实例组。
  4. 虚拟机实例下,选择要添加到该实例组中的一个或多个现有虚拟机。您只能选择与现有虚拟机属于同一区域、VPC 网络和子网的虚拟机。
  5. 点击保存,将新虚拟机添加到该实例组中。

gcloud

如需向非代管实例组添加实例,请使用 instance-groups unmanaged add-instances 命令:

gcloud compute instance-groups unmanaged add-instances instance-group-name \
    --zone=zone \
    --instances=list-of-VM-names

替换以下内容:

  • instance-group-name:您要向其中添加虚拟机的实例组的名称。
  • zone:实例组的区域。
  • list-of-VM-names:属于同一区域、VPC 网络和子网的虚拟机列表(以英文逗号分隔)。

REST

如需向非代管式实例组添加虚拟机,请使用 instanceGroups.addInstances 方法发送 POST 请求:

POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instanceGroups/instance-group-name/addInstances

   {
      "instances": [
         {
         "instance": "https://www.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance-1-name",
         "instance": "https://www.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance-2-name",
         ....
         }
      ]
   }

替换以下内容:

  • instance-group-name:您要向其中添加虚拟机的实例组的名称。
  • zone:实例组的区域。
  • project-id:该实例组所属项目的 ID。
  • instance-1-nameinstance-2-name:这些是要添加到该实例组中且属于同一区域、VPC 网络和子网的虚拟机的名称。

列出虚拟机

您可以检索非托管实例组中的成员虚拟机列表。

控制台

  1. 在 Google Cloud 控制台中,转到实例组页面。

    转到“实例组”页面

  2. 在列表的名称列下,点击您要查看的非代管实例组的名称。随即出现的页面中会以列表形式提供该实例组所包含的实例。

gcloud

如需列出非代管实例组中的虚拟机,请使用 instance-groups unmanaged list-instances 命令:

gcloud compute instance-groups unmanaged list-instances instance-group-name \
   --zone=zone

替换以下内容:

  • instance-group-name:您要列出其成员的实例组的名称。
  • zone:实例组的区域。

REST

如需列出非代管式实例组中的虚拟机,请使用 instanceGroups.listInstances 方法发送 POST 请求:

POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instanceGroups/instance-group-name/listInstances

替换以下内容:

  • instance-group-name:您要列出其成员的实例组的名称。
  • zone:实例组的区域。
  • project-id:该实例组所属项目的 ID。

移除虚拟机

您可以从非代管实例组中移除虚拟机。从实例组中移除某个虚拟机并不会删除该虚拟机。

控制台

  1. 在 Google Cloud 控制台中,转到实例组页面。

    转到“实例组”页面

  2. 在列表的名称列下,点击要从中移除虚拟机的实例组的名称。随即打开的页面中会显示实例组属性以及其中所含的虚拟机列表。
  3. 在此列表中,选择要从该实例组中移除的一个或多个虚拟机。
  4. 点击从组中移除。从非代管实例组中移除的虚拟机会继续留存并运行,除非您停止或删除这些虚拟机。

gcloud

如需从非代管实例组中移除虚拟机,请使用instance-groups unmanaged remove-instances 命令:

gcloud compute instance-groups unmanaged remove-instances instance-group-name \
    --zone=zone \
    --instances=list-of-VM-names

替换以下内容:

  • instance-group-name:包含要移除的实例的实例组的名称。
  • zone:实例组的区域。
  • list-of-VM-names:您要从该实例组中移除的虚拟机列表(以英文逗号分隔)。

REST

如需从非代管式实例组中移除虚拟机,请使用 instanceGroups.removeInstances 方法发送 POST 请求。您可以同时移除多个虚拟机,如下所示:

POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instanceGroups/instance-group-name/removeInstances
{
    "instances": [
        {
        "instance": "https://www.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance-1-name",
        "instance": "https://www.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance-2-name",
        ....
        }
    ]
}

替换以下内容:

  • instance-group-name:包含要移除的实例的实例组的名称。
  • zone:实例组的区域。
  • project-id:该实例组所属项目的 ID。
  • instance-1-nameinstance-2-name:这些是您想要与该实例组取消关联的虚拟机的名称。

使用已命名的端口

已命名的端口是表示端口名称和编号的键值对。端口名称表示服务或应用的名称。端口号表示服务或应用运行的端口。

Cloud Load Balancing 会使用已命名的端口。充当代理的负载均衡器会订阅其后端服务配置中的一个已命名的端口。系统会根据每个实例组后端的已命名端口映射,将该端口的名称转换为端口号。

例如,后端服务可以订阅一个名为 http-port 的端口。后端实例组可以有一个名为 http-port:80 的端口。后端实例组指示负载均衡器在 80 端口上使用 TCP 等协议向该实例组中的虚拟机发送流量。该协议在负载均衡器的后端服务中定义。

已命名的端口是代理负载均衡器使用的简单元数据。但是,已命名的端口不控制 Compute Engine 中的网络或防火墙资源。

一个已命名的端口有多个端口号

您可以为每个服务名称分配多个端口。您还可以为每个端口分配多个服务名称。

请注意以下几点:

  • 流量在具有相同端口名称的所有端口之间保持平衡。
  • 给定的后端服务一次只能将流量转发到一个已命名的端口。
  • 如果您对已命名的端口使用多个端口号,则这些端口必须全部用于同一应用。

    例如,http:80,http:8080 有效,但 http:80,http:443 无效,因为端口 80 通常不支持 TLS。

您可以在实例组中分配多个已命名的端口。为了说明这一点,我们提供了一个示例后端服务,该服务订阅已命名的端口 http-port 且具有两个后端实例组:

  • instance-group-a 实例组(已命名的端口为 http-port:80
  • instance-group-b 实例组(已命名的端口为 http-port:79

此后端服务向 instance-group-a 中虚拟机的端口 80 和 instance-group-b 中虚拟机的端口 79 发送流量。

当您将同一实例组添加到多个后端服务(针对多个负载均衡器)并且该实例组在每个负载均衡器上为不同端口提供服务时,请勿将所有端口号添加到单个已命名的端口。而应创建一个唯一的已命名端口,并将其映射到每个后端服务应提供服务的一组端口。

例如,假设您有三个应用,每个应用都有自己的负载均衡器。每个应用都有自己的端口号:app1 为 81,app2 为 82,app3 为 83。假设所有三个后端服务都使用一个通用实例组,请将该实例组的已命名端口指定为 [app1:81, app2:82, app3:83]

已命名的端口和健康检查

如需让在一个后端服务上具有多个端口号的已命名端口在外部应用负载均衡器或内部应用负载均衡器中工作,健康检查必须具有 --use-serving-port 标志,而不是特定端口号。Google Cloud 控制台中不提供此选项。如需设置 --use-serving-port,您必须使用 Google Cloud CLI 或 API。

例如,假设您有一个使用单个实例组且在同一后端服务上的不同端口(81、82、83)上进行流量负载均衡的应用。您可以将此实例组的端口指定为 [app:81, 82, 83]。此场景中的健康检查必须具有 --use-serving-port 标志。

如需了解详情,请参阅负载均衡健康检查文档

已命名的端口和防火墙规则

已命名的端口不会创建或修改 Google Cloud 防火墙规则。如需允许流量进入后端虚拟机,您仍需创建必要的防火墙规则。

已命名的端口和后端服务

除了实例组配置之外,您还必须配置后端服务。例如,假设您在实例组上设置名称为 my-service-name 且端口为 8888 的已命名端口:

gcloud compute instance-groups set-named-ports my-unmanaged-ig \
    --named-ports=my-service-name:8888

然后,您必须引用后端服务配置中已命名的端口,并将 --port-name 上的后端服务设置为 my-service-name

gcloud compute backend-services update my-backend-service \
    --port-name=my-service-name

创建已命名的端口

控制台

  1. 在 Google Cloud 控制台中,转到实例组页面。

    转到“实例组”

  2. 在列表的名称列下方,点击您要指定已命名端口的实例组的名称。显示实例组属性的页面即会打开。
  3. 点击修改以修改此非代管式实例组。
  4. 端口映射部分,点击添加端口,然后输入端口名称和端口号。根据需要添加或移除其他已命名的端口。
  5. 点击保存,更新非代管实例组的已命名端口列表。

gcloud

如需将已命名的端口添加到非托管实例组,请使用 instance-groups unmanaged set-named-ports 命令

gcloud compute instance-groups unmanaged set-named-ports instance-group-name \
    --zone=zone \
    --named-ports=port-name:port-number,...

如需列出非代管实例组中的已命名的端口,请使用 instance-groups unmanaged get-named-ports 命令

使用 set-named-ports 命令设置一个或多个已命名端口:

gcloud compute instance-groups unmanaged set-named-ports INSTANCE_GROUP \
      --named-ports PORT_NAME:PORT,PORT_NAME:PORT

例如:

gcloud compute instance-groups unmanaged set-named-ports INSTANCE_GROUP \
      --named-ports name1:80,name2:8080

要向每个服务名称分配多个端口或为每个服务分配多个名称,请为每个名称或端口创建多个条目。例如,如果端口 102080 用于同一应用,您可以将 name1 分配给所有这些端口。此外,您还可以为端口 8080 分配两个名称 name2name3。最后,您可以将端口 9000 分配给 name4,如以下示例所示:

gcloud compute instance-groups unmanaged set-named-ports INSTANCE_GROUP \
      --named-ports name1:10,name1:20,name1:80,\
                    name2:8080,name3:8080,\
                    name4:9000

如需使用 Google Cloud CLI 移除非代管式实例组中的所有已命名端口,请使用 instance-groups unmanaged set-named-ports 并指定空的已命名端口列表:

gcloud compute instance-groups unmanaged set-named-ports instance-group-name \
    --zone=zone \
    --named-ports=""

在上面的所有示例中,您都需要替换以下内容(如果存在):

  • instance-group-name:实例组的名称。
  • zone:实例组的区域。
  • port-nameport-number:端口名称和端口号表示您选择的名称与端口号之间的映射关系。您可以英文逗号为分隔符指定多个映射;例如,port-one:80,port-two:8080 是有效的已命名端口列表。

REST

  1. 描述实例组并记下 fingerprint

  2. 如需添加已命名端口,请使用 instanceGroups.setNamedPorts 方法发送 POST 请求。如果您要移除所有已命名的端口,请将 namedPorts 设置为空列表。

    POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instanceGroups/instance-group-name/setNamedPorts
    
    {
        "fingerprint": "fingerprint",
        "namedPorts": [
            {
            "name": "port-name",
            "port": port-number
            },
            {
            "name": "port-name",
            "port": port-number
            },
            ....
        ]
    }
    

    替换以下内容:

    • instance-group-name:实例组的名称。
    • zone:实例组的区域。
    • project-id:该实例组所属项目的 ID。
    • port-nameport-number:端口名称和端口号表示您选择的名称与端口号之间的映射关系。
    • fingerprint:这是您在上一步中记下的指纹。

后续步骤