使用目标池

目标池是一组从外部直通式网络负载均衡器接收传入流量的后端实例。目标池的所有后端实例必须位于同一 Google Cloud 区域中。外部直通式网络负载均衡器可以使用后端服务或目标池来定义一组后端实例。如果您要创建新的外部直通式网络负载均衡器,我们建议使用后端服务

本页面介绍用于目标池后端的配置选项。当外部直通式网络负载均衡器的转发规则将流量定向到目标池时,负载均衡器会根据来源 IP 地址的哈希、来源端口、目标 IP 地址和目标端口从目标池中选择实例。

如果您打算让自己的目标池包含单个虚拟机,请考虑使用协议转发功能(而不是负载均衡)。

目标池属性

目标池使用处理 TCPUDP 流量的转发规则。您必须先创建目标池,然后才能将其与转发规则一起使用。

目标池使用旧版 HTTP 健康检查

目标池具有以下属性:

name
此目标池的名称。该名称在此项目中必须是唯一的,长度为 1-63 个字符,并且与正则表达式 [a-z]([-a-z0-9]*[a-z0-9])? 匹配。这意味着第一个字符必须是小写字母,后面所有字符必须是短划线、小写字母或数字,但最后一个字符不能是短划线。
description
可选。此目标池的用户定义说明。
region

目标池所在区域的完全限定网址。该区域应该是后端实例所在的区域。例如:

"region" : "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION"

healthChecks[ ]

可选。此目标池的健康检查的可选列表。一个特定目标池只能附加一项健康检查。如需了解详情,请参阅健康检查

instances[ ]

应处理此目标池流量的实例网址列表。所有实例必须与目标池位于同一区域,但实例可以属于单个区域内的不同可用区。例如:

"instances" : [
  "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE",
  "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE-2"
]
sessionAffinity

可选。控制用于选择后端虚拟机实例的方法。您只能在创建目标池的过程中设置此值。此值一经设置,就无法再修改。哈希方法根据以下 5 个值中的部分值选择后端:

  • 源/目标 IP
  • 来源/目标端口
  • 第 4 层协议(TCP、UDP)

可能的哈希值如下:

NONE(即未指定哈希值)(默认)
5 元组哈希方法(使用来源和目标 IP 地址、来源和目标端口以及协议)。每个新连接可以任何实例为目标,但只要该实例保持良好的运行状况,指定连接的所有流量也都将保留在同一实例上。
CLIENT_IP_PROTO
3 元组哈希方法(使用来源和目标 IP 地址以及协议)。只要客户端的所有连接都使用相同的协议并且实例保持良好的运行状况,则这些连接都将在同一实例上结束。
CLIENT_IP
2 元组哈希方法(使用来源和目标 IP 地址)。无论协议如何,只要实例保持良好的运行状况,来自客户端的所有连接就都将以同一实例为目的地。

5 元组哈希方法可在多个虚拟机之间实现有效的流量分配。但是,来自同一客户端的其他会话可能会到达不同的实例,因为来源端口可能不同。如果您希望来自同一个客户端的所有会话都到达同一后端(前提是该后端保持良好的运行状况),可以指定 CLIENT_IP_PROTOCLIENT_IP 选项。

如果您选择 3 元组或 2 元组方法,这些方法通常会提供优于默认 5 元组方法的会话亲和性,但总体流量可能不会得到均匀分配。

分段的 UDP 数据包:如果您要对可能会分段的 UDP 流量执行负载均衡,请将会话亲和性设置为 CLIENT_IP_PROTOCLIENT_IP。请不要使用 NONE(5 元组哈希)。这是因为除了第一个 UDP 数据段之外,其他 UDP 数据段都不包含端口号,负载均衡器可能会丢弃没有端口的数据段。如需了解详情,请参阅负载均衡和分段 UDP 数据包

backupPool

可选。另一个目标池资源的完全限定网址。备用池是另一个目标池引用的目标池。您还必须定义 failoverRatio 才能使用此功能。如果目标池中健康的虚拟机比率低于 failoverRatio,则外部直通式网络负载均衡器会将流量发送到您的备用池。您只能为每个目标池提供一个备用池。备用池必须与目标池位于同一区域。如果目标池中健康的实例比率低于您配置的故障切换比率,则外部直通式网络负载均衡器会使用以下规则来路由流量:

  1. 如果健康状况良好的实例与目标池中实例总数的比率小于故障切换比率,则流量将发送到备用池中健康状况良好的实例。
  2. 如果健康状况良好的实例与目标池中实例总数的比率低于故障切换比率,但备用池中没有可用的健康状况良好的实例,则流量将发送到目标池中其余健康状况良好的实例。
  3. 如果目标池不是空的,并且目标池和备用池中的所有实例都未通过健康检查,那么作为最后的补救手段,流量将发送到目标池中的所有实例。
  4. 如果目标池为空,并且备用池中的所有实例都未通过健康检查,那么作为最后的补救手段,流量将发送到备用池中的所有实例。

系统只支持一级故障切换。例如,如果目标池 A 拥有备用池 B,且备用池 B 拥有备用池 C,则发往目标池 A 的流量只能定向到备用池 B,而不能定向到备用池 C。

failoverRatio

可选。一个介于 0.01.0 之间的浮点数,用于确定何时将此目标池声明为健康状况不佳。例如,当此值被设置为 0.1 时,如果健康状况良好的实例数量小于 0.1 (10%),则此目标池会被声明为健康状况不佳。如果故障切换比率为 0.0,则至少有一个后端必须健康状况良好,这样此目标池才能被判定为健康状况良好。如果故障切换比率被设置为 1.0,则所有实例都必须健康状况良好,这样此目标池才会被判定为健康状况良好。如果您定义了 backupPool 字段,则必须定义此字段。

故障切换条件

条件 新连接转到
故障切换比率 !=0,目标池中健康状况良好的虚拟机比率 >= FR 目标池
故障切换比率 =0,目标池中健康状况良好的虚拟机比率 > 0 目标池
故障切换比率 !=0,目标池中健康状况良好的虚拟机比率 < FR,并且备用池中至少有一个虚拟机健康状况良好 备用池
故障切换比率 =0,目标池中健康状况良好的虚拟机比率 = 0,并且备用池中至少有一个虚拟机健康状况良好 备用池
目标池中至少有一个虚拟机,目标池中的所有虚拟机健康状况不佳,并且备用池中的所有虚拟机健康状况不佳 目标池(最后的补救手段)
目标池中没有虚拟机,且备用池中的所有虚拟机健康状况不佳 备用池(最后的补救手段)
目标池中没有虚拟机,备用池中也没有虚拟机 流量下降

创建目标池

控制台

无法在 Google Cloud 控制台中创建目标池。您可以使用 Google Cloud CLI 或 API 创建目标池。

如需了解如何使用 Google Cloud CLI 创建基于目标池的外部直通式网络负载均衡器,请参阅设置具有目标池的外部直通式网络负载均衡器

gcloud

如需使用 gcloud compute 创建目标池,请使用 target-pools create 命令

  gcloud compute target-pools create TARGET_POOL \
      [--backup-pool=BACKUP_POOL] \
      [--description=DESCRIPTION] \
      [--failover-ratio=FAILOVER_RATIO] \
      [--http-health-check=HEALTH_CHECK] \
      [--region=REGION]
      [--session-affinity=SESSION_AFFINITY; default="NONE"]

替换以下内容:

  • TARGET_POOL:目标池的名称
  • BACKUP_POOL:备用目标池的名称
  • DESCRIPTION:目标池的说明
  • FAILOVER_RATIO:一个介于 0.0 至 1.0 之间的值,用于确定将此目标池判定为运行状况不佳的条件。
  • HEALTH_CHECK:此目标池的健康检查
  • REGION:目标池所在的区域
  • SESSION_AFFINITY:用于选择后端虚拟机实例的方法

API

如需在 API 中创建目标池,请向以下 URI 发出 HTTP POST 请求:

  https://www.googleapis.com/v1/compute/projects/PROJECT_ID/regions/REGION/targetPools
  {
    "name": name,
    "instances": [
       "https://www.googleapis.com/v1/compute/project/PROJECT_ID/zones/ZONE/instances/INSTANCE",
       "https://www.googleapis.com/v1/compute/project/PROJECT_ID/zones/ZONE/instances/INSTANCE-2",
    ]
  }
 

请替换以下内容:

  • PROJECT_ID:Google Cloud 项目 ID
  • ZONE:目标池中的实例所在的可用区
  • INSTANCEINSTANCE-2:要添加到目标池的实例

在目标池中添加或移除实例

控制台

无法在 Google Cloud 控制台中修改目标池。您可以使用 Google Cloud CLI 或 API 修改目标池。

gcloud

如需使用 gcloud compute 向目标池添加实例,请使用 target-pools add-instances 命令

  gcloud compute target-pools add-instances TARGET_POOL \
      --instances=INSTANCE,[INSTANCE-2,...]

替换以下内容:

  • TARGET_POOL:目标池的名称
  • INSTANCEINSTANCE-2:要添加到目标池的实例的名称

如需移除实例,请使用 target-pools remove-instances 命令

  gcloud compute target-pools remove-instances TARGET_POOL \
      --instances=INSTANCE,[INSTANCE-2,...]

替换以下内容:

  • TARGET_POOL:目标池的名称
  • INSTANCEINSTANCE-2:要从目标池中移除的实例的名称

API

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

  https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/targetPools/TARGET_POOL/removeInstance
  https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/targetPools/TARGET_POOL/addInstance

请求正文应包含要添加或移除的实例的完全限定 URI:

  {
   "instances": [
      {"instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE"},
      {"instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE-2"}
    ]
  }
 

替换以下内容:

  • PROJECT_ID:Google Cloud 项目 ID
  • TARGET_POOL:要更新的目标池的名称
  • REGION:目标池所在的区域
  • ZONE:更新后的实例所在的区域
  • INSTANCEINSTANCE-2:要添加到目标池的实例

如需了解详情,请参阅 targetPools.addInstancetargetPools.removeInstance 方法的 API 参考文档。

列出目标池

控制台

如需查看目标池列表,请使用负载均衡高级菜单。

高级负载均衡页面中,转到目标池标签页。
转到“目标池”

页面会显示目标池列表。

gcloud

如需使用 gcloud compute 列出现有目标池,请使用 target-pools list 命令

  gcloud compute target-pools list

如需获得更详细的输出,请使用 describe 命令并指定目标池的名称。

API

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

  https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/targetPools

请替换以下内容:

  • PROJECT_ID:Google Cloud 项目 ID
  • REGION:目标池所在的区域

描述目标池

控制台

如需获取有关目标池的信息,请使用负载均衡高级菜单。

  1. 高级负载均衡页面中,转到目标池标签页。
    转到“目标池”
  2. 如需查看详细信息,请点击目标池的名称。

gcloud

如需使用 gcloud compute 获取单个目标池的相关信息,请使用 target-pools describe 命令

  gcloud compute target-pools describe TARGET_POOL

替换以下内容:

  • TARGET_POOL:目标池的名称

API

在 API 中,向以下 URI 发送一个空的 GET 请求:

  https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/targetPools/TARGET_POOL

请替换以下内容:

  • PROJECT_ID:Google Cloud 项目 ID
  • TARGET_POOL:要更新的目标池的名称
  • REGION:目标池所在的区域

获取实例的运行状况

控制台

如需获取目标池中实例的健康状况,请使用负载均衡高级菜单。

  1. 高级负载均衡页面中,转到目标池标签页。
    转到“目标池”
  2. 点击目标池的名称。
  3. 目标池详情页面列出了所有实例及其运行状态。

gcloud

如需使用 gcloud compute 检查目标池中一个实例或所有实例的当前健康状况,您可以使用 gcloud compute target-pools get-health 命令

  gcloud compute target-pools get-health TARGET_POOL

替换以下内容:

  • TARGET_POOL:目标池的名称

该命令会返回由配置的健康检查判定的健康状况(“良好”或“不佳”)。

API

在 API 中,使用请求正文中指定的实例对以下 URI 发出 HTTP POST 请求:

  https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/targetPools/TARGET_POOL/getHealth

  {
    "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE"
  }

请替换以下内容:

  • PROJECT_ID:Google Cloud 项目 ID
  • TARGET_POOL:要更新的目标池的名称
  • REGION:目标池所在的区域
  • ZONE:实例所在的可用区
  • INSTANCE:您要检查其健康检查状态的实例

删除目标池

要删除某个目标池,必须首先确保该目标池未被任何转发规则引用。如果某个转发规则正在引用目标池,您必须删除该转发规则才能移除引用。

控制台

如需使用 Google Cloud 控制台删除目标池,请使用负载均衡高级菜单。

  1. 高级负载均衡页面中,转到目标池标签页。
    转到“目标池”
  2. 点击目标池的名称。
  3. 点击删除
  4. 删除目标池窗口中,点击删除

gcloud

如需使用 gcloud compute 删除目标池,请使用 target-pools delete 命令

  gcloud compute target-pools delete TARGET_POOL

替换以下内容:

  • TARGET_POOL:要删除的目标池的名称

API

在 API 中,向以下 URI 发送一个空的 DELETE 请求:

  https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/targetPools/TARGET_POOL

请替换以下内容:

  • PROJECT_ID:Google Cloud 项目 ID
  • TARGET_POOL:要更新的目标池的名称
  • REGION:目标池所在的区域

在目标池中添加或移除健康检查

健康检查对象属于独立的全球性 资源;您可以将这些对象关联至任何目标池,也可以解除其与任何目标池之间的关联。

如果目标池没有关联的健康检查,则外部直通式网络负载均衡器会将所有实例视为健康状况良好,并将流量发送到该目标池中的所有实例。但是,如果您查询没有关联健康检查的目标池的健康状况,则系统将返回 unhealthy 状态,这表示目标池没有关联健康检查。建议您的目标池应具有关联的健康检查,这样可帮助您管理您的实例。

外部直通式网络负载均衡器使用传统 HTTP 健康检查来确定目标池中实例的健康状况。外部直通式网络负载均衡器只能使用传统 HTTP 健康检查,而不能使用传统 HTTPS 健康检查。

控制台

使用 Google Cloud 控制台时,您可以在创建具有目标池后端的外部直通式网络负载均衡器时创建旧版 HTTP 健康检查。

无法使用 Google Cloud 控制台的健康检查页面来创建独立的旧版健康检查。

gcloud

如需使用 gcloud compute 向目标池添加健康检查,请使用 target-pools add-health-checks 命令

  gcloud compute target-pools add-health-checks TARGET_POOL \
      --http-health-check=HEALTH_CHECK

替换以下内容:

  • TARGET_POOL:目标池的名称
  • HEALTH_CHECK:要用于此目标池的旧版 HTTP 健康检查

如需移除健康检查,请使用 target-pools remove-health-checks 命令

  gcloud compute target-pools remove-health-checks TARGET_POOL \
    --http-health-check=HEALTH_CHECK

替换以下内容:

  • TARGET_POOL:目标池的名称
  • HEALTH_CHECK:要从此目标池中移除的旧版 HTTP 健康检查

API

如需使用 API 关联健康检查或取消与健康检查的关联,请向适当的 URI 发出 HTTP POST 请求:

  https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/targetPools/TARGET_POOL/removeHealthCheck
  https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/targetPools/TARGET_POOL/addHealthCheck

请求正文应包含要关联或解除关联的健康检查:

  {
    "healthCheck": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/httpHealthChecks/HEALTH_CHECK"
  }

请替换以下内容:

  • PROJECT_ID:Google Cloud 项目 ID
  • TARGET_POOL:要更新的目标池的名称
  • REGION:目标池所在的区域
  • HEALTH_CHECK:与目标池关联或取消关联的旧版 HTTP 健康检查

如需了解详情,请参阅 targetPools.addHealthChecktargetPools.removeHealthCheck 的 API 参考文档。

添加或移除备用目标池

首次创建目标池时,您可以选择应用一个备用目标池。当目标池健康状况不佳时,该备用目标池可用于接收流量。

如果您以前从未设置过备用目标池,则还应设置健康检查,以确保该功能正常运行。

控制台

无法在 Google Cloud 控制台中修改目标池。您可以使用 Google Cloud CLI 或 API 修改目标代理。

gcloud

如需使用 gcloud compute 更新备用池资源,请使用 target-pools set-backup 命令

  gcloud compute target-pools set-backup TARGET_POOL \
      --backup-pool=BACKUP_POOL \
      --failover-ratio=FAILOVER_RATIO

替换以下内容:

  • TARGET_POOL:目标池的名称
  • BACKUP_POOL:备用目标池的名称
  • FAILOVER_RATIO:一个介于 0.0 至 1.0 之间的值,用于确定将此目标池判定为运行状况不佳的条件。

API

如需通过 API 发出请求以更新或移除备用池,请向以下 URI 发出 POST 请求:

  POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/targetPools/TARGET_POOL/setBackup?failoverRatio=FAILOVER_RATIO

  {
    "target": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/targetPools/BACKUP_POOL"
  }

请替换以下内容:

  • PROJECT_ID:Google Cloud 项目 ID
  • TARGET_POOL:要更新的目标池的名称
  • REGION:目标池所在的区域
  • BACKUP_POOL:要与目标池关联的备用池的名称
  • FAILOVER_RATIO故障切换比率

如果您定义了一个空目标池,或者未定义故障切换比率,则系统会针对此目标池停用备用池行为。

后续步骤