使用目标池

外部 TCP/UDP 网络负载平衡可以使用后端服务或目标池来定义接收传入流量的一组后端实例。本页面介绍网络负载平衡目标池后端的配置选项。如需了解网络负载平衡如何与区域后端服务配合工作,请参阅使用后端服务的网络负载平衡器概览

当网络负载平衡器的转发规则将流量定向到目标池时,负载平衡器会根据来源 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/<var>PROJECT_ID</var>/regions/<var>REGION</var>"
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 之间的浮点数,用于确定将此目标池判定为运行状况不佳的条件。例如,当此值被设置为 .1 时,如果运行状况良好的实例数量低于 .1 (10%),则此目标池会被判定为运行状况不佳。如果故障转移比率为 0.0,则至少有一个后端必须运行状况良好,这样此目标池才能被判定为运行状况良好。如果故障转移比率被设置为 1.0,则所有实例都必须运行状况良好,这样此目标池才会被判定为运行状况良好。如果您定义了 backupPool 字段,则必须定义此字段。

故障转移条件

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

创建目标池

控制台

如需使用 Cloud Console 创建目标池,请使用负载平衡高级菜单。

  1. 高级负载平衡页面中,转到目标池标签页。
    转到“目标池”
  2. 点击创建目标池
  3. 输入名称
  4. 选择区域
  5. 运行状况检查下,点击创建新的运行状况检查另创建一项运行状况检查。这些步骤会创建旧版 HTTP 运行状况检查,这是对目标池的要求。
    1. 输入 basic-check 作为运行状况检查的名称
    2. 保留默认设置。
    3. 点击保存并继续
  6. 根据您选择的区域中可用的资源,点击选择现有实例选择现有实例组
    1. 虚拟机实例实例组下,选择目标池的资源。
  7. 点击创建

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] \
      [--session-affinity=SESSION_AFFINITY; default="NONE"]

请替换以下内容:

  • TARGET_POOL:目标池的名称
  • BACKUP_POOL:备用目标池的名称
  • DESCRIPTION:可选的说明
  • FAILOVER_RATIO:介于 0.0 和 1.0 之间的值,用于确定目标池被判定为运行状况不佳的时间
  • HEALTH_CHECK:此目标池的运行状况检查
  • 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:要添加到目标池的实例

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

控制台

如需使用 Cloud Console 向目标池添加实例或从中移除实例,请使用负载平衡高级菜单。

  1. 高级负载平衡页面中,转到目标池标签页。
    转到“目标池”
  2. 点击要修改的目标池的名称。
  3. 点击修改
  4. 如需向目标池添加更多资源,请使用添加实例添加实例组列表。
  5. 如需移除某个实例或实例组,请点击其名称旁边的 X
  6. 点击保存

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:目标池的名称

    结束 Cloud Shell 会话后,您将丢失这些环境变量。

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:您要检查其运行状况检查状态的实例

删除目标池

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

控制台

如需使用 Cloud Console 删除目标池,请使用负载平衡高级菜单。

  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 运行状况检查。

控制台

如果使用 Cloud Console,则可以在创建目标池时或创建使用目标池后端的网络负载平衡器时创建旧式 HTTP 运行状况检查。

您无法使用 Cloud Console 运行状况检查页面创建独立的旧版运行状况检查。

如需移除与目标池关联的运行状况检查,请执行以下操作:

  1. 高级负载平衡页面中,转到目标池标签页。
    转到“目标池”
  2. 点击要修改的目标池的名称。
  3. 点击修改
  4. 运行状况检查下,选择不检查运行状况
  5. 点击保存

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 参考文档。

添加或移除备用目标池

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

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

控制台

如需添加备用目标池,请执行以下操作:

  1. 高级负载平衡页面中,转到目标池标签页。
    转到“目标池”
  2. 点击要修改的目标池的名称。
  3. 点击修改
  4. 备用池下,从列表中选择备用目标池。
  5. 设置故障转移比率
  6. 点击保存

如需移除备用目标池,请执行以下操作:

  1. 高级负载平衡页面中,转到目标池标签页。
    转到“目标池”
  2. 点击要修改的目标池的名称。
  3. 点击修改
  4. 备用池下,选择
  5. 点击保存

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故障转移比率

如果您定义了一个空目标池,或者未定义故障转移比率,则此目标池的备用池行为将被停用。

后续步骤