将全球外部代理网络负载均衡器迁移到双栈后端

本文档介绍如何将全球外部代理网络负载均衡器资源和后端从仅 IPv4(单栈)迁移到 IPv4 和 IPv6(双栈)。

本文档中的说明适用于 SSL 代理和 TCP 代理全球外部代理网络负载均衡器。

您必须先从仅 IPv4 迁移到 IPv4 和 IPv6(双栈)后端。您可以稍后切换后端服务的 IP 地址选择政策,以指定从 GFE 发送到后端的流量类型。如需了解详情,请参阅配置 IP 地址选择政策

迁移过程简介

迁移过程需要您更新以下负载均衡器资源:

  • 子网。子网的 IP 栈类型可以更新为支持仅 IPv4(单栈)或 IPv4 和 IPv6(双栈)。您无法将子网从双栈地址降级为单栈地址。如需进行更新,请参阅更新子网
  • 后端。以下后端的 IP 栈类型可以更新为支持仅 IPv4(单栈)或 IPv4 和 IPv6(双栈):
    • 所有实例组后端:一个或多个实例组后端、非托管式实例组后端,或托管式实例组后端与非托管式实例组后端的组合。

      如需进行更新,请参阅更新虚拟机实例或模板

    • 所有可用区级 NEG:一个或多个 GCE_VM_IP_PORT 类型可用区级 NEG。

      如需进行更新,请参阅更新可用区级 NEG

  • 防火墙规则。创建一条防火墙规则,以允许来自 IPv6 健康检查探测的流量到达后端。如需进行创建,请参阅创建 IPv6 健康检查防火墙规则
  • 后端服务。您可以更新后端服务的 IP 地址选择政策,以指定从 GFE 发送到后端的流量类型。如需进行更新,请参阅更新后端服务
  • 转发规则为 IPv6 创建转发规则

系统不会执行验证来检查您是否已更新所有必需的资源。更新所有资源后,流量应该会流向后端,您可以查看日志并验证迁移是否已完成。

确定要迁移的资源

  1. 如需列出所有子网,请在 Cloud Shell 中运行以下命令:

    gcloud compute networks subnets list
    

    记下具有要迁移到双栈的仅 IPv4 栈的子网的名称。之后,此地址称为 SUBNET。之后,VPC 网络称为 NETWORK

  2. 如需列出所有后端服务,请在 Cloud Shell 中运行以下命令:

    gcloud beta compute backend-services list
    

    记下要迁移到双栈的后端服务的名称。之后,此名称称为 BACKEND_SERVICE

  3. 如需列出所有虚拟机实例和实例模板,请在 Cloud Shell 中运行以下命令:

    gcloud compute instances list
    
    gcloud compute instance-templates list
    

    记下要迁移到双栈的实例和实例模板的名称。之后,此名称称为 VM_INSTANCEINSTANCE_TEMPLATES

  4. 如需列出所有可用区级网络端点组 (NEG),请在 Cloud Shell 中运行以下命令:

    gcloud compute network-endpoint-groups list
    

    记下要迁移到双栈的网络端点组的名称。之后,此名称称为 ZONAL_NEG

  5. 如需列出所有目标 SSL 代理,请在 Cloud Shell 中运行以下命令:

    gcloud compute target-ssl-proxies list
    

    记下与负载均衡器关联的目标代理的名称。之后,此名称称为 TARGET_PROXY

  6. 如需列出所有目标 TCP 代理,请在 Cloud Shell 中运行以下命令:

    gcloud compute target-tcp-proxies list
    

    记下与负载均衡器关联的目标代理的名称。之后,此名称称为 TARGET_PROXY

从 IPv4 迁移到 IPv4 和 IPv6(双栈)

本部分介绍了将使用仅 IPv4 地址的负载均衡器和后端迁移到 IPv4 和 IPv6(双栈)地址的过程。

前提条件

在开始之前,您必须已为实例组或可用区级 NEG 后端设置具有仅 IPv4 栈的 SSL 代理或 TCP 代理全球外部代理网络负载均衡器。

请参阅以下文档:

您可以运行以下命令,以列出项目中所有虚拟机实例的栈类型信息:

gcloud

gcloud compute instances list \
  --format= \
  "table(
name,
zone.basename(),
networkInterfaces[].stackType.notnull().list(),
networkInterfaces[].ipv6AccessConfigs[0].externalIpv6.notnull().list():label=EXTERNAL_IPV6,
networkInterfaces[].ipv6Address.notnull().list():label=INTERNAL_IPV6)"

更新子网

只有自定义模式 VPC 网络支持双栈子网。自动模式 VPC 网络及旧版网络均不支持双栈子网。

如需将网络更新为双栈设置,请按照以下步骤操作:

  1. 如果您使用的是自动模式 VPC 网络,则必须先将自动模式 VPC 网络转换为自定义模式

  2. 如需启用 IPv6,请参阅将子网的栈类型更改为双栈

更新虚拟机实例或模板

您无法修改属于托管式实例组或非托管式实例组的虚拟机实例。如需将虚拟机实例更新为双栈,请按照以下步骤操作:

  1. 从组中删除特定实例
  2. 创建双栈虚拟机
  3. 在 MIG 中创建具有特定名称的实例

您无法更新现有实例模板。如果您需要进行更改,可以创建另一个具有类似属性的模板。如需将虚拟机实例模板更新为双栈,请按照以下步骤操作:

控制台

  1. 在 Google Cloud 控制台中,转到实例模板页面。

    转到“实例模板”

    1. 点击您要复制和更新的实例模板。
    2. 点击创建类似模板
    3. 展开高级选项部分。
    4. 对于网络标记,请输入 allow-health-check-ipv6
    5. 网络接口部分中,点击添加网络接口
    6. 网络列表中,选择自定义模式 VPC 网络。
    7. 子网列表中,选择 SUBNET
    8. 对于 IP 栈类型,请选择 IPv4 和 IPv6(双栈)
    9. 点击创建
  2. 对与负载均衡器关联的托管式实例组 MIG 开始基本滚动更新

更新可用区级 NEG

可用区级 NEG 端点无法修改。您必须删除 IPv4 端点并创建一个同时具有 IPv4 和 IPv6 地址的新双栈端点。

如需在 REGION_A 区域中设置可用区级 NEG(具有 GCE_VM_IP_PORT 类型的端点),请先在 GCP_NEG_ZONE 可用区中创建虚拟机。然后,将虚拟机网络端点添加到可用区级 NEG。

创建虚拟机

控制台

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到虚拟机实例

  2. 点击创建实例

  3. 名称设置为 vm-a1

  4. 区域字段中,选择 REGION_A,然后在可用区字段中选择任意值。在此过程中,此可用区称为 GCP_NEG_ZONE

  5. 启动磁盘部分中,确保为启动磁盘选项选择了 Debian 操作系统和 10 (Buster) 版本。如有必要,请点击选择以更改映像。

  6. 展开高级选项部分,然后进行以下更改:

    • 展开网络部分。
    • 网络标记字段中,输入 allow-health-check
    • 网络接口部分中,进行以下更改:
      • 网络NETWORK
      • 子网SUBNET
      • IP 栈类型IPv4 和 IPv6(双栈)
    • 点击完成
    • 点击管理。在启动脚本字段中,复制并粘贴以下脚本内容。

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://metadata.google.internal/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
  7. 点击创建

  8. 重复执行下列步骤,使用以下名称和可用区组合创建第二个虚拟机:

    • 名称:vm-a2,可用区:GCP_NEG_ZONE

gcloud

使用虚拟机名称及其可用区的这些组合运行以下命令两次来创建虚拟机。两个虚拟机的脚本内容相同。

  • VM_NAMEvm-a1 和您选择的任何 GCP_NEG_ZONE 可用区
  • VM_NAMEvm-a2 和同一 GCP_NEG_ZONE 可用区

    gcloud compute instances create VM_NAME \
        --zone=GCP_NEG_ZONE \
        --stack-type=IPV4_IPV6 \
        --image-family=debian-10 \
        --image-project=debian-cloud \
        --tags=allow-health-check \
        --subnet=SUBNET \
        --metadata=startup-script='#! /bin/bash
          apt-get update
          apt-get install apache2 -y
          a2ensite default-ssl
          a2enmod ssl
          vm_hostname="$(curl -H "Metadata-Flavor:Google" \
          http://metadata.google.internal/computeMetadata/v1/instance/name)"
          echo "Page served from: $vm_hostname" | \
          tee /var/www/html/index.html
          systemctl restart apache2'
    

将端点添加到可用区级 NEG

控制台

如需将端点添加到可用区级 NEG,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入网络端点组页面。

    进入“网络端点组”

  2. 名称列表中,点击网络端点组的名称 (ZONAL_NEG)。系统会显示网络端点组详情页面。

  3. 此组中的网络端点部分,选择之前创建的 NEG 端点。点击移除端点

  4. 此组中的网络端点部分,点击添加网络端点

  5. 选择虚拟机实例

  6. 网络接口部分会显示虚拟机的名称、可用区和子网。

  7. IPv4 地址字段中,输入新网络端点的 IPv4 地址。

  8. IPv6 地址字段中,输入新网络端点的 IPv6 地址。

  9. 选择端口类型

    1. 如果您选择默认,端点会使用网络端点组中所有端点的默认端口 80。这足以满足我们的示例需求,因为 Apache 服务器在端口 80 处理请求。
    2. 如果您选择自定义,请输入要供端点使用的端口号
  10. 如需添加更多端点,请点击添加网络端点,并重复上述步骤。

  11. 添加所有端点后,点击创建

gcloud

  1. 将端点(GCE_VM_IP_PORT 端点)添加到 ZONAL_NEG

    gcloud compute network-endpoint-groups update ZONAL_NEG \
        --zone=GCP_NEG_ZONE \
        --add-endpoint='instance=vm-a1,ip=IPv4_ADDRESS, \
          ipv6=IPv6_ADDRESS,port=80' \
        --add-endpoint='instance=vm-a2,ip=IPv4_ADDRESS, \
          ipv6=IPv6_ADDRESS,port=80'
    

请替换以下内容:

IPv4_ADDRESS:网络端点的 IPv4 地址。该 IPv4 必须属于 Compute Engine 中的虚拟机(主要 IP 或作为别名 IP 范围的一部分)。如果未指定 IP 地址,则系统会使用网络端点组所属网络中的虚拟机实例的主要 IP 地址。

IPv6_ADDRESS:网络端点的 IPv6 地址。该 IPv6 地址必须属于网络端点组所属网络中的虚拟机实例(外部 IPv6 地址)。

创建 IPv6 健康检查防火墙规则

确保您有一个适用于负载均衡实例且允许来自 Google Cloud 健康检查系统(2600:2d00:1:b029::/642600:2d00:1:1::/64)的流量的入站流量规则。此示例使用目标标记 allow-health-check-ipv6 来标识应用该规则的虚拟机实例。

如果不使用此防火墙规则,则默认拒绝入站流量规则会阻止传入后端实例的 IPv6 流量。

控制台

  1. 在 Google Cloud 控制台中,转到防火墙页面。

    转到“防火墙政策”

  2. 如需允许 IPv6 子网流量,请再次点击创建防火墙规则,然后输入以下信息:

    • 名称fw-allow-lb-access-ipv6
    • 网络NETWORK
    • 优先级1000
    • 流量方向入站
    • 目标指定的目标标记
    • 目标标记allow-health-check-ipv6
    • 来源过滤条件IPv6 范围
    • 来源 IPv6 范围2600:2d00:1:b029::/642600:2d00:1:1::/64
    • 协议和端口允许全部
  3. 点击创建

gcloud

  1. 创建 fw-allow-lb-access-ipv6 防火墙规则以允许与子网通信:

    gcloud compute firewall-rules create fw-allow-lb-access-ipv6 \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-health-check-ipv6 \
        --source-ranges=2600:2d00:1:b029::/64,2600:2d00:1:1::/64 \
        --rules=all
    

更新后端服务并为 IPv6 创建转发规则

您可以更新现有 BACKEND_SERVICE 以支持双栈。本部分介绍了如何更新 IP 地址选择政策为 Prefer IPv6 的后端服务并添加可用区级 NEG 后端。

如果您有与后端服务关联的实例组,则必须更新后端服务

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击负载均衡器的名称。

  3. 点击修改

为 IPv6 配置后端服务

  1. 点击后端配置
  2. 对于后端类型,选择可用区级网络端点组
  3. IP 地址选择政策列表中,选择首选 IPv6
  4. 协议字段中:
    • 对于 TCP 代理,选择 TCP
    • 对于 SSL 代理,选择 SSL
  5. 后端部分中,点击添加后端
  6. 新建后端面板中,执行以下操作:
    • 网络端点组列表中,选择 ZONAL_NEG
    • 连接数上限字段中,输入 10
  7. 点击完成
  8. 健康检查列表中,选择 HTTP 健康检查。

配置 IPv6 转发规则

  1. 点击前端配置
  2. 点击添加前端 IP 和端口
  3. 名称字段中,输入转发规则的名称。
  4. 协议字段中:
    • 对于 TCP 代理,选择 TCP
    • 对于 SSL 代理,选择 SSL
  5. IP 版本设置为 IPv6
  6. 对于 SSL 代理,在证书列表中,选择一个证书。
  7. 点击完成
  8. 点击更新

gcloud

  1. 为 HTTP 流量创建后端服务:

    gcloud beta compute backend-services update BACKEND_SERVICE \
       --protocol=[SSL|TCP] \
       --port-name=http \
       --ip-address-selection-policy=PREFER_IPV6 \
       --health-checks=HEALTH_CHECK \
       --global
    
  2. 将可用区级 NEG 作为后端添加到后端服务。

    gcloud beta compute backend-services add-backend BACKEND_SERVICE \
       --network-endpoint-group=ZONAL_NEG \
       --global
    
  3. 预留一个外部 IPv6 地址,以供客户用来访问负载均衡器。

    gcloud compute addresses create lb-ipv6-1 \
       --ip-version=IPV6 \
       --network-tier=PREMIUM \
       --global
    
  4. 对于 SSL 代理,为后端服务创建转发规则。

    gcloud beta compute target-ssl-proxies create TARGET_PROXY \
       --backend-service=BACKEND_SERVICE \
       --ssl-certificates=[SSL_CERT_1][,[SSL_CERT_2],...] \
       --ssl-policy=my-ssl-policy \
       --proxy-header=NONE
    
    gcloud beta compute forwarding-rules create  \
       --load-balancing-scheme=EXTERNAL_MANAGED \
       --network-tier=PREMIUM \
       --address=lb-ipv6-1 \
       --global \
       --target-ssl-proxy=TARGET_PROXY \
       --ports=443
    
  5. 对于 TCP 代理,为后端服务创建转发规则。

    gcloud beta compute target-tcp-proxies create TARGET_PROXY \
       --backend-service=BACKEND_SERVICE \
       --proxy-header=NONE
    
    gcloud beta compute forwarding-rules create  \
       --load-balancing-scheme=EXTERNAL_MANAGED \
       --network-tier=PREMIUM \
       --address=lb-ipv6-1 \
       --global \
       --target-tcp-proxy=TARGET_PROXY \
       --ports=443
    

更新实例组的后端服务

如果您有与后端服务关联的实例组,则必须按照以下所述更新后端服务:

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击负载均衡器的名称。

  3. 点击修改

配置后端服务

  1. 点击后端配置
  2. 对于后端类型,选择实例组
  3. IP 地址选择政策列表中,选择首选 IPv6
  4. 协议字段中:
    • 对于 TCP 代理,选择 TCP
    • 对于 SSL 代理,选择 SSL
  5. 如果您已将虚拟机实例或模板更新为双栈,则不需要再次更新后端部分。
  6. 选择健康检查
  7. 点击更新

gcloud

  1. 为 HTTP 流量创建后端服务:

    gcloud beta compute backend-services update BACKEND_SERVICE \
       --protocol=[SSL|TCP] \
       --port-name=http \
       --ip-address-selection-policy=PREFER_IPV6 \
       --health-checks=HEALTH_CHECK \
       --global
    
  2. 将实例组作为后端添加到后端服务。如果您已将虚拟机实例或模板更新为双栈,则可以跳过此步骤。

    gcloud beta compute backend-services add-backend BACKEND_SERVICE \
       --instance-group=INSTANCE_GROUP \
       --global
    

配置 IP 地址选择政策

此步骤是可选的,并提供有关配置后端服务的 IP 地址选择政策的说明。将后端迁移到双栈后,您可以使用 IP 地址选择政策指定从 GFE 发送到后端的流量类型。

IP_ADDRESS_SELECTION_POLICY 替换为以下任意值:

IP 地址选择政策 说明
仅 IPv4 仅将 IPv4 流量发送到后端服务的后端,无论从客户端到 GFE 的流量如何。仅使用 IPv4 健康检查来检查后端的健康状况。
首选 IPv6

优先考虑后端的 IPv6 连接,而不是 IPv4 连接(前提是存在具有 IPv6 地址且健康状况良好的后端)。

健康检查会定期监控后端的 IPv6 和 IPv4 连接。GFE 会先尝试 IPv6 连接;如果 IPv6 连接中断或速度较慢,则 GFE 会使用 happy eyeballs 回退并连接到 IPv4。

即使其中一个 IPv6 或 IPv4 连接健康状况不佳,后端仍会被视为健康状况良好,并且这两个连接都可以由 GFE 尝试,并通过 happy eyeballs 最终选择使用哪个连接。

仅 IPv6

仅将 IPv6 流量发送到后端服务的后端,无论从客户端到代理的流量如何。仅使用 IPv6 健康检查来检查后端的健康状况。

系统不会执行验证来检查后端流量类型是否与 IP 地址选择政策匹配。例如,如果您使用 IPV4 后端并选择 Only IPv6 作为 IP 地址选择政策,则不会看到配置错误,但流量也不会流向后端。

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击负载均衡器的名称。

  3. 点击修改

  4. 点击后端配置

  5. 后端服务字段中,选择 BACKEND_SERVICE

  6. 后端类型必须是可用区级网络端点组实例组

  7. IP 地址选择政策列表中,选择 IP_ADDRESS_SELECTION_POLICY

  8. 点击完成

gcloud

  1. 更新后端服务:

    gcloud beta compute backend-services update BACKEND_SERVICE \
       --load-balancing-scheme=EXTERNAL_MANAGED \
       --protocol=HTTP \
       --ip-address-selection-policy=IP_ADDRESS_SELECTION_POLICY \
       --global
    

测试负载均衡器

测试负载均衡器,以确认迁移是否成功,以及传入流量是否按预期到达后端。

查询外部 IP 地址

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击负载均衡器的名称。

  3. 前端部分中,系统会显示两个负载均衡器 IP 地址。在此过程中,IPv4 地址称为 IP_ADDRESS_IPV4,IPv6 地址称为 IP_ADDRESS_IPV6

  4. 后端部分中,如果 IP 地址选择政策为 Prefer IPv6,则系统会为后端显示两种健康检查状态。

测试发送到实例的流量

在此示例中,来自 curl 命令的请求会随机分配到后端。

  1. 重复以下命令几次,直到您看到所有后端虚拟机都做出响应:

    curl -m1 IP_ADDRESS_IPV4:PORT
    
    curl -m1 IP_ADDRESS_IPV6:PORT
    

    例如,如果 IPv6 地址为 [fd20:1db0:b882:802:0:46:0:0]:80,则该命令类似于以下内容:

    curl -m1 [fd20:1db0:b882:802:0:46:0:0]:80
    

查看日志

每个日志条目都会捕获后端的目标 IPv4 和 IPv6 地址。由于我们支持双栈,因此请务必观察后端使用的 IP 地址。

您可以通过查看日志来检查流量是流向 IPv6 还是回退到 IPv4。

日志包含与后端关联的 backend_ip 地址。通过检查日志并比较 backend_ip 的目标 IPv4 或 IPv6 地址,您可以确认使用哪个 IP 地址。

限制

当 IP 地址选择政策配置为 IPV6_ONLY 时,您仍可以配置 IPv4 only 后端。此类配置会导致没有健康状况良好的后端,客户端会收到响应代码 503,并且没有上游流量。通过检查日志,您可以看到包含 failed_to_pick_backendstatusDetails 消息。