使用 DNS 路由政策的全球负载均衡架构

Last reviewed 2023-01-04 UTC

本文档介绍如何将多个区域级负载均衡器与 Google DNS 路由政策结合使用,以创建全球负载均衡架构。本文档面向网络工程师、解决方案架构师和运营专家。本教程假定您具备 Google Compute Engine 的基础知识,并且熟悉负载均衡器和 DNS 查找等网络概念。

简介

如果您要构建一个全球服务,该服务实现为在多个区域中运行的应用,那么您可以使用地理定位 DNS 路由政策为您的区域级负载均衡器设置全球 DNS 端点。在此方法中,您将创建一个将流量路由到最近的本地服务的全球端点。

根据要使用的负载均衡器类型,您可能可以使用基于代理的全球负载均衡选项来实现此场景。但在某些应用场景中,您必须使用区域级负载均衡产品,例如,您的服务传送 UDP 流量。地理定位 DNS 路由政策还可帮助为同时使用 Google Cloud 以及其他云服务提供商或本地部署的混合应用提供单个 DNS 端点。

架构

下图显示了一个示例架构,它在三个不同的区域中使用三个区域级负载均衡器。这些区域使用 DNS 路由政策组合起来。

Cloud DNS 根据客户端所在位置将流量路由到区域级内部负载均衡器的架构。

上图显示了俄勒冈、德国和新加坡的客户端如何向 Cloud DNS 进行 www.example.com 的 DNS 查找。请求被路由到靠近每个客户端的区域级负载均衡器,以访问托管在三个不同区域中的应用。

地理定位 DNS 路由政策的应用场景

本部分讨论使用地理定位 DNS 路由政策创建基于多个区域级负载均衡器的全球服务的以下应用场景:

可全球访问且全球分布的内部服务

您可以使用地理位置 DNS 路由政策来组合多个区域级内部负载均衡器,从而创建可在全球范围内访问且全球分布的内部服务。您可以使用内部直通式网络负载均衡器内部应用负载均衡器。如果没有 DNS 路由政策,则内部应用负载均衡器只能使用区域端点。借助使用全球访问权限的内部直通网络负载均衡器,您可以将服务提供给全球范围的用户使用;在这种情况下,后端只能位于单个区域中。但是,使用 DNS 路由政策时,后端可以位于多个区域中。

下图展示了此架构:

内部客户端的架构:Cloud DNS 将流量发送到位于客户端所在区域的内部直通网络负载均衡器实例。

上图显示了多个区域的内部客户端如何使用 Cloud DNS 解析 service.corp.example.com。客户端收到的响应始终包含内部直通网络负载均衡器的 IP 地址,该负载均衡器位于客户端所在区域。该负载均衡器指向同一区域中的应用。(在此示例中,应用在 Google Kubernetes Engine [GKE] 上运行,但这不是必要条件。)客户端将应用流量发送到应用的本地实例,但它们都使用相同的 service.corp.example.com DNS 端点。

您可以按照以下步骤创建此配置:

  1. 在每个区域中创建内部负载均衡器。如果您使用内部直通式网络负载均衡器,则必须启用全球访问权限,以确保其他区域中的客户端能够连接到服务。
  2. 创建 DNS 路由政策。在该政策中,将类型设置为 GEO,并将 --routing-policy-data 值设置为映射到相应内部负载均衡器的目标区域列表。您可以使用以下命令创建图中所示设置:

    gcloud beta dns record-sets create service.corp.example.com \
        --ttl=30 \
        --type=A \
        --zone=my-zone \
        --routing-policy-type=GEO \
        --routing-policy-data="europe-west4=fr-eu-w4;asia-east1=fr-as-e1;us-central1=fr-us-c1" \
        --enable-health-checking
    

此示例创建了一条 TTL 值为 30 秒的记录,以确保客户端在政策更改时频繁刷新 DNS 记录。

当您使用 DNS 路由政策时,每个客户端都会收到一个 DNS 响应,其中包含区域内内部负载均衡器的 IP 地址。如果客户端不在内部负载均衡器所在区域,它会收到离您最近的区域内的内部负载均衡器的 IP 地址。

DNS 路由政策会根据最近的内部负载均衡器区域路由流量。如果该区域中超过 80% 的后端健康状况不佳,并且您将健康检查功能与地理定位 DNS 路由政策结合使用,则流量会跨区域故障切换。

如果您不需要在区域之间故障切换,可以按如下所述更改命令:

  • 移除 --enable-health-checking 标志。
  • 将内部负载均衡器的每个转发规则的名称替换为其 IP 地址。

支持 TCP 和 UDP 的外部服务的全球端点

您还可以使用地理定位 DNS 路由政策组合多个区域级外部负载均衡器,从而为外部服务创建全球 DNS 端点。最常见的应用场景是为任何基于 TCP 或基于 UDP 的应用使用外部直通式网络负载均衡器。此方法对于使用 UDP 的应用特别有用,因为 Google Cloud 中没有 UDP 全球负载均衡选项。

对于使用 TCP 流量且受外部代理网络负载均衡器或外部应用负载均衡器支持的应用,您可能可以使用这些全球负载均衡器的实例,而不是使用 DNS 端点。这些负载均衡器使用任播提供跨区域负载均衡,任播提供单个 IP 地址作为所有后端实例的前端。

与 DNS 端点相比,使用全球负载均衡选项的优势如下:

  • 故障切换是即时进行的。发生故障切换时,来自用户端的流量不会发生明显变化。
  • 互联网路由决定了负载均衡目标。互联网路由协议会根据最短路径转发流量,而不是由 Cloud DNS 选择目标位置。
  • 跨区域负载均衡。Google 的全球负载均衡支持跨区域故障切换。而使用外部直通网络负载均衡器时,不会使用 DNS 路由政策进行健康检查。

因此,如果您的应用基于 TCP 并且这些产品支持您的应用,我们建议您使用 Google 的全球负载均衡选项。

下图显示了使用全球 DNS 端点的架构:

外部客户端的架构:客户端获取客户端所在区域中的内部直通网络负载均衡器实例的 IP 地址。

上图显示了多个区域的外部客户端如何使用 Cloud DNS 解析 www.example.com。客户端收到的响应包含客户端所在区域中的网络 TCP/UDP 负载均衡器的 IP 地址。然后,客户端可以连接到在同一区域中运行的应用。每个客户端都将应用流量发送到服务的本地实例,但它们都使用相同的 www.example.com DNS 端点。

您可以按照以下步骤创建此配置:

  1. 在每个区域中创建网络 TCP/UDP 负载均衡器
  2. 创建 DNS 路由政策。在该政策中,将类型设置为 GEO,并将 --routing-policy-data 值设置为映射到相应网络 TCP/UDP 负载均衡器的目标区域列表。您可以使用以下命令创建图中所示设置:

    gcloud dns record-sets create www.example.com \
        --ttl=30 \
        --type=A \
        --zone=my-zone \
        --routing-policy-type=GEO \
        --routing-policy-data="europe-west4=192.0.2.5;asia-east1=198.51.100.10;us-central1=203.0.113.33"
    

应用此政策后,当客户端发出 DNS 请求时,每个客户端收到的 DNS 响应都会包含最靠近该客户端的区域中的外部直通网络负载均衡器的 IP 地址。

全球端点 www.example.com 无法用于自动执行区域间流量故障切换,因为使用外部直通网络负载均衡器时没有健康检查。您需要通过更改 DNS 记录来手动触发故障切换。

此方法适合的另一个应用场景是,您的应用使用 HTTP(S) 并具有数据区域性要求,但您仍希望使用全球端点来传送数据。如需实现此场景,您可以使用地理定位 DNS 路由政策组合多个区域级外部应用负载均衡器实例。如果您没有区域性要求,则可以使用全球外部应用负载均衡器

混合服务的全球 DNS 端点

在某些情况下,您可以使用地理定位 DNS 路由政策为混合应用提供单个端点。

下图展示了此架构:

混合场景的架构:对于亚洲和美国的客户端,Cloud DNS 将流量发送到内部直通网络负载均衡器实例;对于欧洲的客户端,将流量发送到本地负载均衡器。

上图显示了多个区域的外部客户端如何使用 Cloud DNS 解析 www.example.com。Cloud DNS 将亚洲和美国的互联网用户指向靠近这些用户的区域中的网络 TCP/UDP 负载均衡器的 IP 地址。负载均衡器指向的 GKE 应用在相同区域中运行。对于欧洲的互联网用户,Cloud DNS 会返回一个指向欧洲本地数据中心内的负载均衡器的 IP 地址,应用托管在 GKE on VMware 上。(在此示例中,应用在 GKE on VMware 和 GKE 上运行,但这不是必要条件。)

您可以按照以下步骤创建此配置:

  1. 在每个区域中创建网络 TCP/UDP 负载均衡器和本地负载均衡器。
  2. 创建 DNS 路由政策。在该政策中,将类型设置为 GEO,并将 --routing-policy-data 值设置为映射到相应网络 TCP/UDP 负载均衡器的目标区域列表。您可以使用以下命令创建图中所示设置:

    gcloud dns record-sets create www.example.com \
        --ttl=30 \
        --type=A \
        --zone=my-zone \
        --routing-policy-type=GEO \
        --routing-policy-data="europe-west4=192.0.2.51;asia-east1=198.51.100.10;us-central1=203.0.113.33"
    

通过设置 --routing-policy-data 标志,您可以让 Cloud DNS 根据最近的 Google Cloud 区域返回不同的 IP 地址。但是,您无法根据客户端的确切国家/地区或区域路由流量。在前面的示例中,大多数用户被发送到其所在大洲的一个区域或本地数据中心。但是,Cloud DNS 用于确定最近的 Google Cloud 区域的算法可能与特定的国家/地区或地理位置边界不一致。因此,您不能将地理定位 DNS 路由政策用于合规性应用场景。

对于所需粒度比本示例中显示的大洲级粒度更精细的其他使用场景,则无法使用这一混合方法。例如,如果您的本地数据中心所在的国家/地区不存在 Google Cloud 区域,则无法为该国家/地区或区域的用户发送本地流量,您只能将负载均衡器配置为根据最近的 Google Cloud 区域返回 IP 地址。如果您想根据准确的地理位置或国家/地区限制或路由流量,可以使用提供基于 DNS 的全球服务器负载均衡 (GSLB) 服务的第三方提供商。

后续步骤