使用负载均衡器作为下一个跃点来部署中心辐射型网络

本教程介绍了如何使用 VPC 网络对等互连部署中心辐射型架构。

本教程适用于希望使用由 Compute Engine 虚拟机组成的集中式设备在 Google Cloud 环境中实现中心辐射型架构的云网络工程师和运维专业人员。在本教程中,您需要将这些虚拟机部署为 NAT 网关,您可对其他功能(例如下一代防火墙)使用同样的方法。本教程假定您熟悉 VPC 网络和 Compute Engine

架构

在此架构中,一组辐射 VPC 网络通过中心 VPC 网络与外部通信,其中流量通过一组集中式设备(在本例中为网络地址转换 (NAT)网关)进行路由。相关路由从中心 VPC 网络导出到辐射 VPC 网络。NAT 网关被配置为具有新的默认路由的内部负载均衡器的后端,该路由将来自 Cloud Load Balancing 的内部直通网络负载均衡器作为下一个跃点

您可以使用多条采用等成本多路径 (ECMP) 路由的路由来实现相同类型的负载分配和高可用性。但是,使用内部直通式网络负载均衡器具有以下优势:

  • 只有当您依赖健康检查时,流量才会被转发到正常运行的实例。借助 ECMP,流量会被转发到该路由指向的所有活跃实例;使用内部直通网络负载均衡器可保证所有路由均被使用。此外,在实例终止或重启时,无需清理路由。
  • 您可微调健康检查计时器,因此可能会加快故障切换的速度。如果您使用代管实例组和自动修复功能,您仍可以自定义健康检查计时器,但它们将用于重新创建实例,而不是路由流量。

Google 还提供了 Cloud NAT,这是一项无需用户管理和干预即可实现高可用性的代管式服务。但是,由于 NAT 配置未导入对等互连网络,因此该使用场景不支持 Cloud NAT。

下图展示了您在本教程中构建的拓扑。

具有一个中心 VPC 网络和两个辐射 VPC 网络的架构。

该拓扑由一个中心 VPC 网络和两个辐射 VPC 网络组成,辐射网络通过 VPC 网络对等互连与中心网络对等互连。该中心 VPC 网络在内部直通网络负载均衡器后面有两个 NAT 网关实例。静态默认路由 (0/0 NAT-GW-ILB) 指向作为下一个跃点的内部直通网络负载均衡器。此静态默认路由使用自定义路由通过 VPC 网络对等互连导出。

目标

  • 创建多个 VPC 网络,并使用一个中心辐射型架构对这些网络建立对等互连。
  • 在中心 VPC 网络中创建和配置 NAT 网关。
  • 设置内部直通式网络负载均衡器并将其配置为下一个跃点。
  • 验证从辐射 VPC 网络到公共互联网的连接。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Compute Engine API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 Compute Engine API。

    启用 API

  8. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  9. 在本教程中,您将在 Cloud Shell 中运行所有命令。

设置您的环境

  1. 在 Cloud Shell 中,确保您使用的是您创建或选择的 Google Cloud 项目。将 project-id 替换为您的 Google Cloud 项目。

    gcloud config set project project-id
    
    export PROJECT_ID=`gcloud config list --format="value(core.project)"`
    
  2. 设置默认计算地区和区域。

    gcloud config set compute/region us-central1
    gcloud config set compute/zone us-central1-c
    export REGION=us-central1
    export ZONE=us-central1-c
    

    在本教程中,地区为 us-central1,区域为 us-central1-c

创建 VPC 网络和子网

  1. 在 Cloud Shell 中,创建中心 VPC 网络和子网:

    gcloud compute networks create hub-vpc --subnet-mode custom
    
    gcloud compute networks subnets create hub-subnet1 \
        --network hub-vpc --range 10.0.0.0/24
    
  2. 创建辐射 VPC 网络(分别称为 spoke1-vpcspoke2-vpc),每个网络都有一个子网:

    gcloud compute networks create spoke1-vpc --subnet-mode custom
    
    gcloud compute networks create spoke2-vpc --subnet-mode custom
    
    gcloud compute networks subnets create spoke1-subnet1 \
        --network spoke1-vpc --range 192.168.1.0/24
    
    gcloud compute networks subnets create spoke2-subnet1 \
        --network spoke2-vpc --range 192.168.2.0/24
    
  3. 在中心 VPC 网络和辐射 VPC 网络中创建防火墙规则。这些规则允许来自指定 RFC 1918 范围的内部流量(TCP/80 和 443、UDP/53 和 ICMP):

    gcloud compute firewall-rules create hub-vpc-web-ping-dns \
        --network hub-vpc --allow tcp:80,tcp:443,icmp,udp:53 \
        --source-ranges 10.0.0.0/24,192.168.1.0/24,192.168.2.0/24
    
    gcloud compute firewall-rules create spoke1-vpc-web-ping-dns \
        --network spoke1-vpc --allow tcp:80,tcp:443,icmp,udp:53 \
        --source-ranges 10.0.0.0/24,192.168.1.0/24
    
    gcloud compute firewall-rules create spoke2-vpc-web-ping-dns \
        --network spoke2-vpc --allow tcp:80,tcp:443,icmp,udp:53 \
        --source-ranges 10.0.0.0/24,192.168.2.0/24
    
  4. 在中心 VPC 网络和辐射 VPC 网络中创建防火墙规则,允许 SSH 的 IAP 访问所有虚拟机:

    gcloud compute firewall-rules create hub-vpc-iap \
        --network hub-vpc --allow tcp:22 \
        --source-ranges 35.235.240.0/20
    
    gcloud compute firewall-rules create spoke1-vpc-iap \
        --network spoke1-vpc --allow tcp:22 \
        --source-ranges 35.235.240.0/20
    
    gcloud compute firewall-rules create spoke2-vpc-iap \
        --network spoke2-vpc --allow tcp:22 \
        --source-ranges 35.235.240.0/20
    

    本教程使用 SSH 的 Identity-Aware Proxy (IAP)。如需了解详情,请参阅连接到没有外部 IP 地址的实例

  5. 创建防火墙规则,允许对中心 VPC 网络中的自动修复实例组执行健康检查:

    gcloud compute firewall-rules create hub-vpc-health-checks \
        --network hub-vpc --allow tcp:443 --target-tags nat-gw \
        --source-ranges 130.211.0.0/22,35.191.0.0/16
    

创建实例和所需路由

  1. 在 Cloud Shell 中,为 NAT 网关创建实例模板,该网关具有设置 NAT 网关的启动脚本:

    gcloud compute instance-templates create \
      hub-nat-gw-ilbnhop-template \
      --network hub-vpc \
      --subnet hub-subnet1 \
      --machine-type n1-standard-2 --can-ip-forward \
      --tags nat-gw --scopes default,compute-rw \
      --metadata startup-script='#! /bin/bash
    apt-get update
    # Enable IP forwarding:
    echo 1 > /proc/sys/net/ipv4/ip_forward
    echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-example.conf
    # Read VM network configuration:
    md_vm="http://metadata.google.internal/computeMetadata/v1/instance/"
    md_net="$md_vm/network-interfaces"
    nic0_gw="$(curl $md_net/0/gateway -H "Metadata-Flavor:Google")"
    nic0_mask="$(curl $md_net/0/subnetmask -H "Metadata-Flavor:Google")"
    nic0_addr="$(curl $md_net/0/ip -H "Metadata-Flavor:Google")"
    nic0_id="$(ip addr show | grep $nic0_addr | tail -c 5)"
    # Use a web server to pass the health check for this example.
    # In production, use a more complete test.
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    echo "Example web page to pass health check" | \
    tee /var/www/html/index.html
    sudo systemctl restart apache2
    # Enable IP masquerading
    iptables -t nat -A POSTROUTING -o $nic0_id -j MASQUERADE'
    

    本教程使用 n1-standard-2 作为实例类型,但您也可使用任何其他数量或大小的网关。请务必考虑每个虚拟机的出站带宽上限等因素

  2. 创建 HTTP 健康检查:

    gcloud compute health-checks create http nat-gw-ilbnhop-health-check \
        --region us-central1 \
        --port 80
    
  3. 创建一个地区级实例组,该组有两个实例分布在一个地区:

    gcloud compute instance-groups managed create \
        hub-nat-gw-ilbnhop-mig \
        --region us-central1 --size=2 \
        --template=hub-nat-gw-ilbnhop-template \
        --health-check nat-gw-ilbnhop-health-check \
        --initial-delay 15
    

    在本教程中,初始延时设置为 15 秒。在生产部署中,根据需要自定义此设置。本教程未使用自动扩缩政策

  4. 创建后端服务并添加实例组:

    gcloud compute backend-services create hub-nat-gw-ilbnhop-backend \
        --load-balancing-scheme=internal \
        --protocol=tcp \
        --health-checks=nat-gw-ilbnhop-health-check
    
    gcloud compute backend-services add-backend \
        hub-nat-gw-ilbnhop-backend \
        --instance-group=hub-nat-gw-ilbnhop-mig \
        --instance-group-region=us-central1
    
  5. 创建转发规则:

    gcloud compute forwarding-rules create \
        hub-nat-gw-ilbnhop \
        --load-balancing-scheme=internal \
        --network=hub-vpc \
        --subnet=hub-subnet1 \
        --address=10.0.0.10 \
        --ip-protocol=TCP \
        --ports=all \
        --backend-service=hub-nat-gw-ilbnhop-backend \
        --backend-service-region=us-central1 \
        --service-label=hub-nat-gw-ilbnhop
    

    即使仅使用 TCP 定义转发规则,当您使用内部直通式网络负载均衡器作为下一个跃点时,转发规则也会将所有流量转发到后端虚拟机上的所有端口。内部直通式网络负载均衡器是区域级负载均衡器。

  6. 创建一条新路由,将转发规则用作下一个跃点:

    gcloud compute routes create hub-nat-gw-ilbnhop \
        --network=hub-vpc \
        --destination-range=0.0.0.0/0 \
        --next-hop-ilb=hub-nat-gw-ilbnhop \
        --next-hop-ilb-region=us-central1 \
        --priority=800
    

    您可以指定网络标记,以使下一个跃点路由仅应用于配置了标记的客户端实例,但标记不会通过 VPC 网络对等互连导出或导入。

  7. 从中心 VPC 删除默认路由

    export hub_default_route=$(gcloud compute routes list \
        --format="value(name)" --filter="network:hub-vpc AND \
        nextHopGateway:default-internet-gateway" | head -n 1)
    gcloud compute routes delete $hub_default_route -q
    
  8. 创建带标记的新路由,仅允许来自 NAT 网关的流量:

    gcloud compute routes create hub-default-tagged \
        --network hub-vpc --destination-range 0.0.0.0/0 \
        --next-hop-gateway default-internet-gateway \
        --priority 700 --tags nat-gw
    
  9. 删除从每个辐射的 VPC 到互联网的默认路由:

    export spoke1_default_route=$(gcloud compute routes list \
        --format="value(name)" --filter="network:spoke1-vpc AND \
        nextHopGateway:default-internet-gateway")
    
    gcloud compute routes delete $spoke1_default_route -q
    
    export spoke2_default_route=$(gcloud compute routes list \
        --format="value(name)" \
        --filter="network:spoke2-vpc AND nextHopGateway:default-internet-gateway")
    
    gcloud compute routes delete $spoke2_default_route -q
    

    如果本地路由和导入的路由之间存在冲突,始终以本地路由为准。如需了解详情,请参阅路由顺序

  10. 创建客户端虚拟机:

    gcloud compute instances create spoke1-client \
        --subnet=spoke1-subnet1 --no-address \
        --metadata startup-script='#! /bin/bash
    apt-get update
    apt-get install dnsutils -y'
    
    gcloud compute instances create spoke2-client \
        --subnet=spoke2-subnet1 --no-address \
        --metadata startup-script='#! /bin/bash
    apt-get update
    apt-get install dnsutils -y'
    

创建 VPC 网络对等互连连接

VPC 网络对等互连是双向的,因此两端都必须定义。一个 VPC 网络可以与多个 VPC 网络对等互连,但是存在限制。要通过 VPC 网络对等互连访问默认路由,请使用通过 VPC 网络对等互连导入和导出自定义路由功能。

在本教程中,您将在同一 Google Cloud 项目中创建所有 VPC 网络。

  1. 在 Cloud Shell 中,在启用路由导出标志的情况下创建从中心 VPC 网络到辐射 VPC 网络的 VPC 连接:

    gcloud compute networks peerings create hub-to-spoke1 \
        --network hub-vpc --peer-network spoke1-vpc \
        --peer-project $PROJECT_ID \
        --export-custom-routes
    
    gcloud compute networks peerings create hub-to-spoke2 \
        --network hub-vpc --peer-network spoke2-vpc \
        --peer-project $PROJECT_ID \
        --export-custom-routes
    
  2. 在启用路由导入标志的情况下创建从 spoke1 VPC 网络到中心 VPC 网络的 VPC 网络对等互连连接:

    gcloud compute networks peerings create spoke1-to-hub \
        --network spoke1-vpc --peer-network hub-vpc \
        --peer-project $PROJECT_ID \
        --import-custom-routes
    
  3. 在启用路由导入标志的情况下创建从 spoke2 VPC 网络到中心 VPC 网络的 VPC 网络对等互连连接:

    gcloud compute networks peerings create spoke2-to-hub \
        --network spoke2-vpc --peer-network hub-vpc \
        --peer-project $PROJECT_ID \
        --import-custom-routes
    

验证路由传播和连接

  1. 在 Cloud Shell 中,验证是否已将静态路由正确创建为启动脚本的一部分。

    gcloud compute routes list --filter="network:hub-vpc"
    

    确保输出中存在 hub-default-taggedhub-nat-gw-ilbanhop 路由:

    NAME                            NETWORK  DEST_RANGE      NEXT_HOP                  PRIORITY
    default-route-13a4b635b5eab48c  hub-vpc  10.0.0.0/24     hub-vpc                   1000
    hub-default-tagged              hub-vpc  0.0.0.0/0       default-internet-gateway  700
    hub-nat-gw-ilbanhop             hub-vpc  0.0.0.0/0       10.0.0.10                 800
    peering-route-3274f1257a9842a0  hub-vpc  192.168.2.0/24  hub-to-spoke2             1000
    peering-route-798c5777f13094bc  hub-vpc  192.168.1.0/24  hub-to-spoke1             1000
    
  2. 验证 spoke1-vpc 路由表,确保已正确导入默认路由:

    gcloud compute routes list --filter="network:spoke1-vpc"
    

    确保输出中存在以 peering-route 开头且以 0.0.0.0/0 作为 DEST_RANGE 值的路由:

    NAME                            NETWORK     DEST_RANGE      NEXT_HOP       PRIORITY
    default-route-75f6ea8f5fc54813  spoke1-vpc  192.168.1.0/24  spoke1-vpc     1000
    peering-route-6c7f130b860bfd39  spoke1-vpc  10.0.0.0/24     spoke1-to-hub  1000
    peering-route-9d44d362f98afbd8  spoke1-vpc  0.0.0.0/0       spoke1-to-hub  800
    
  3. 通过 IAP 使用 SSH 连接到其中一个客户端:

    gcloud compute ssh spoke1-client --tunnel-through-iap
    
  4. 通过 NAT 网关测试 Google 公共 DNS 来验证连接:

    sudo hping3 -S -p 80 -c 3 dns.google
    

    由于内部直通网络负载均衡器支持 TCP 和 UDP,您无法使用基于 ICMP 的 ping 来验证互联网连接,因此必须使用 hping3 等工具。

    输出类似于以下内容:

    HPING dns.google (eth0 8.8.4.4): S set, 40 headers + 0 data bytes
    len=44 ip=8.8.4.4 ttl=126 DF id=0 sport=80 flags=SA seq=0 win=65535 rtt=4.6 ms
    len=44 ip=8.8.4.4 ttl=126 DF id=0 sport=80 flags=SA seq=1 win=65535 rtt=4.4 ms
    len=44 ip=8.8.4.4 ttl=126 DF id=0 sport=80 flags=SA seq=2 win=65535 rtt=4.3 ms
    
    --- dns.google hping statistic ---
    3 packets transmitted, 3 packets received, 0% packet loss
    round-trip min/avg/max = 4.3/4.4/4.6 ms
    
  5. 验证您用于与互联网通信的公共 IP 地址:

    curl ifconfig.co
    

    输出会显示其中一个 NAT 网关实例的公共 IP 地址。如果您再次运行该命令,输出可能会显示其他公共 IP 地址,因为连接是使用配置的内部负载平衡会话亲和性(默认情况下为客户端 IP、协议和端口)分配的。

    VPC 网络对等互连不具有传递性,因此通过 VPC 网络对等互连的辐射 VPC 网络之间没有连接。

生产环境的注意事项

您在本教程中创建的配置在单个区域中提供两个 NAT 网关。但是,ECMP 负载平衡并不完美,单个流不会跨多条链路进行传播,而这是您在使用有状态设备(如下一代防火墙)时所需的功能。

要在生产环境中部署此配置,请考虑以下几点:

  • 此配置最适合临时或无状态的出站链路。如果 NAT 网关池的大小发生更改,则 TCP 连接可能会重新平衡,这可能导致已建立的连接重置。
  • 节点不会自动更新,因此如果默认 Debian 安装存在安全漏洞,您需要手动更新映像。
  • 如果您的虚拟机位于多个区域,则需要在每个区域设置 NAT 网关。
  • 每个网关的带宽可能会因硬件类型而异。请务必考虑每个虚拟机的出站带宽上限等因素。在网关故障期间,流量会分配到其余网关。由于正在运行的流未重新编程,因此在网关重新在线后,流量不会立即复位。因此,请在调整大小时确保留出足够的开销。
  • 如果希望在出现意外结果时收到提醒,请使用 Cloud Monitoring 监控代管式实例组和网络流量。

清理

避免产生费用的最简单方法是删除您为本教程创建的 Google Cloud 项目。或者,您也可以删除各个资源。

删除项目

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

逐个删除资源

如果您想保留 Google Cloud 项目,可以删除您为本教程创建的资源。

  1. 删除 VPC 网络对等互连连接:

    gcloud compute networks peerings delete spoke2-to-hub \
        --network spoke2-vpc -q
    
    gcloud compute networks peerings delete spoke1-to-hub \
        --network spoke1-vpc -q
    
    gcloud compute networks peerings delete hub-to-spoke1 \
        --network hub-vpc -q
    
    gcloud compute networks peerings delete hub-to-spoke2 \
        --network hub-vpc -q
    
  2. 删除实例、负载均衡器资源、模板和路由:

    gcloud compute instances delete spoke1-client \
      --zone=us-central1-c -q
    
    gcloud compute instances delete spoke2-client \
      --zone=us-central1-c -q
    
    gcloud compute routes delete hub-nat-gw-ilbnhop -q
    
    gcloud compute forwarding-rules delete hub-nat-gw-ilbnhop -q
    
    gcloud compute backend-services delete -q hub-nat-gw-ilbnhop-backend -q
    
    gcloud compute instance-groups managed delete hub-nat-gw-ilbnhop-mig \
      --region us-central1 -q
    
    gcloud compute health-checks delete nat-gw-ilbnhop-health-check -q
    
    gcloud compute instance-templates delete hub-nat-gw-ilbnhop-template -q
    
    gcloud compute routes delete hub-default-tagged -q
    
  3. 删除防火墙规则、子网和 VPC 网络:

    gcloud compute firewall-rules delete spoke2-vpc-iap -q
    
    gcloud compute firewall-rules delete spoke2-vpc-web-ping-dns -q
    
    gcloud compute firewall-rules delete spoke1-vpc-iap -q
    
    gcloud compute firewall-rules delete spoke1-vpc-web-ping-dns -q
    
    gcloud compute firewall-rules delete hub-vpc-iap -q
    
    gcloud compute firewall-rules delete hub-vpc-web-ping-dns -q
    
    gcloud compute firewall-rules delete hub-vpc-health-checks -q
    
    gcloud compute networks subnets delete spoke1-subnet1 \
        --region us-central1 -q
    
    gcloud compute networks subnets delete spoke2-subnet1 \
        --region us-central1 -q
    
    gcloud compute networks subnets delete hub-subnet1 \
        --region us-central1 -q
    
    gcloud compute networks delete spoke1-vpc -q
    
    gcloud compute networks delete spoke2-vpc -q
    
    gcloud compute networks delete hub-vpc -q
    

后续步骤