将实例组添加到负载均衡器


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

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

准备工作

  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 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

限制

  • 如果您要将负载均衡功能与区域级 MIG 搭配使用,则会受到以下限制:
    • 您无法使用 maxRate 平衡模式。
    • 如果您将 HTTP(S) 负载均衡方案与区域级 MIG 搭配使用,则必须选择 maxRatePerInstancemaxUtilization 平衡模式。

将代管式实例组添加到后端服务

创建大多数类型的负载均衡器需要后端服务。

一个后端服务可以包含多个后端。实例组是一种后端。实例组中的实例会响应来自负载均衡器的流量,轮到的后端服务知道可以使用哪些实例、这些实例可以处理多少流量,以及它们当前正在处理多少流量。此外,后端服务会监控健康检查,并且不会向健康状况不佳的实例发送新连接。

可以按照以下说明将代管实例组添加到后端服务。

控制台

  1. 转到 Google Cloud 控制台中的“负载均衡”页面。

    转到“负载均衡”页面

  2. 点击要向其中添加代管实例组的后端服务的名称。
  3. 点击修改
  4. 点击 +添加后端
  5. 选择要添加的实例组。
  6. 修改要更改的任何可选设置。
  7. 保存更改。

gcloud

使用 add-backend 命令

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
        --instance-group=INSTANCE_GROUP \
        [--instance-group-region=INSTANCE_GROUP_REGION | --instance-group-zone=INSTANCE_GROUP_ZONE] \
        --balancing-mode=BALANCING_MODE

所需的其他参数取决于代管实例组的平衡模式。如需了解详情,请参阅 SDK 中的 add-backend 命令

REST

如需使用 REST API 添加后端服务,请参阅 后端服务

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

目标池是包含一个或多个虚拟机实例的对象。目标池用于外部直通式网络负载均衡器,其中负载均衡器会将用户请求转发到附加的目标池。属于该目标池的实例会处理这些请求并返回响应。 您可以将代管实例组添加到目标池,因此,当您在实例组中添加或移除实例时,目标池也会自动更新并应用这些更改。

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

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

控制台

  1. 转到 Google Cloud 控制台中的“目标池”页面。

    转到“目标池”页面

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

gcloud

使用 set-target-pools 命令

gcloud compute instance-groups managed set-target-pools INSTANCE_GROUP \
        --target-pools TARGET_POOL,..

其中:

  • INSTANCE_GROUP 是实例组的名称。
  • TARGET_POOL,.. 是要向其中添加此实例组的一个或多个目标池的名称。

REST

区域级 MIG可用区级 MIG 调用 setTargetPools 方法。例如:

POST https://compute.googleapis.com/compute/v1/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"
  ]
}

将已命名端口分配给托管实例组

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

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 managed set-named-ports 命令设置一个或多个已命名端口。对于非代管式实例组,请使用 instance-groups set-named-ports 命令

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

例如:

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

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

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

使用 get-named-ports 命令检查托管实例组的已命名端口分配情况,如下所示:

gcloud compute instance-groups managed get-named-ports INSTANCE_GROUP
NAME  PORT
name1 10
name1 20
name1 80
name2 8080
name3 8080
name4 9000

REST

instanceGroupManagers API 不提供 setNamedPorts API 方法。请改用 instanceGroups API 执行此任务。

构造一个向 instanceGroups API 发出的请求,并加入实例组的名称。通过获取特定实例组的相关信息来获取实例组的当前 fingerprint 值。在请求正文中添加 fingerprint 以及一个或多个 namedPorts 值对:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroups/INSTANCE_GROUP/setNamedPorts

{
  "fingerprint": "42WmSpB8rSM=",
  "namedPorts": [
    {
       "name": "PORT_NAME",
       "port": PORT_NUMBER
    },
    {
       "name": "PORT_NAME",
       "port": PORT_NUMBER
    }
  ]
 }
 

例如,如果端口 102080 用于同一应用,您可以将 name1 分配给所有这些端口。此外,您还可以为端口 8080 分配两个名称 name2name3。最后,您可以将端口 9000 分配给 name4,如以下示例所示:

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instanceGroups/example-group/setNamedPorts

{
   "fingerprint": "42WmSpB8rSM=",
   "namedPorts": [
      {
       "name": "name1",
       "port": 8080
      },
      {
       "name": "name2",
       "port": 9000
      }
   ]
}

要为每个服务名称分配多个端口,请为该服务名称创建多个条目。例如,您可以将端口 102080 分配给 name1,同时将端口 8080 分配给 name2

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instanceGroups/example-group/setNamedPorts

{
   "fingerprint": "42WmSpB8rSM=",
   "namedPorts": [
      {
       "name": "name1",
       "port": 10
      },
      {
       "name": "name1",
       "port": 20
      }
      {
       "name": "name1",
       "port": 80
      }
      {
       "name": "name2",
       "port": 8080
      }
      {
       "name": "name3",
       "port": 80
      }
      {
       "name": "name4",
       "port": 8080
      }
   ]
}

如需列出已分配给托管实例组的已命名端口,请构造一个指向该实例组的 GET 请求,如下所示:

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/INSTANCE_GROUP

后续步骤