使用目标池

外部 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/[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 之间的浮点数,用于确定将此目标池判定为运行状况不佳的条件。例如,当此值被设置为 .1 时,如果运行状况良好的实例数量低于 .1 (10%),则此目标池会被判定为运行状况不佳。如果故障转移比率为 0.0,则至少有一个后端必须运行状况良好,这样此目标池才能被判定为运行状况良好。如果故障转移比率被设置为 1.0,则所有实例都必须运行状况良好,这样此目标池才会被判定为运行状况良好。如果您定义了 backupPool 字段,则必须定义此字段。

故障转移条件

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

添加目标池

如需使用 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"]

如需在 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]/[ZONE]/[ZONE]/instances/[INSTANCE]",
     "https://www.googleapis.com/v1/compute/project/[PROJECT_ID]/[ZONE]/[ZONE]/instances/[INSTANCE-2]",
  ]
}

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

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

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

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

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

在 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]"}
  ]
}

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

列出目标池

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

gcloud compute target-pools list

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

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

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

描述目标池

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

gcloud compute target-pools describe TARGET_POOL

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

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

获取实例的运行状况

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

gcloud compute target-pools get-health TARGET_POOL \
    [--fields FIELDS [FIELDS ...]] \
    [--format FORMAT; default="yaml"] \
    [--limit LIMIT] \
    [--raw-links] \
    [--sort-by SORT_BY]

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

在 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]"
}

删除目标池

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

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

gcloud compute target-pools delete TARGET_POOL

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

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

在目标池中添加或移除运行状况检查

运行状况检查对象是独立的全局资源,可与任何目标池关联,也可以取消关联。

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

请注意,网络负载平衡使用旧版 HTTP 运行状况检查来确定目标池中实例的运行状况。网络负载平衡器只能使用旧版 HTTP 运行状况检查,而不能使用旧版 HTTPS 运行状况检查。

如需使用 gcloud compute 向目标池添加运行状况检查,请使用 target-pools add-health-checks 命令:

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

如需移除运行状况检查,请使用 target-pools remove-health-checks 命令:

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

如需使用 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"
}

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

添加或移除备用目标池

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

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

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

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

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

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

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

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

后续步骤