将应用负载均衡器转换为 IPv6

本文档介绍了如何将应用负载均衡器资源和后端从仅 IPv4(单栈)转换为 IPv4 和 IPv6(双栈)。使用 IPv6 的主要优势是可以分配大得多的 IP 地址池。您可以配置负载均衡器,以根据您的偏好设置终结入站 IPv6 流量,并通过 IPv4 或 IPv6 连接将此流量发送到后端。如需了解详情,请参阅用于应用负载均衡器和代理网络负载均衡器的 IPv6。

在本文档中,仅 IPv4(单栈)是指仅使用 IPv4 地址的资源,而 IPv4 和 IPv6(双栈)是指同时使用 IPv4 和 IPv6 地址的资源。

准备工作

在开始转换过程之前,请注意以下条件:

  • 您必须使用以下某种类型的应用负载均衡器:

    • 全球外部应用负载均衡器
    • 区域级外部应用负载均衡器
    • 跨区域内部应用负载均衡器
    • 区域级内部应用负载均衡器

    传统应用负载均衡器不支持双栈后端或子网。 如需详细了解 IPv6 支持,请参阅用于应用负载均衡器和代理网络负载均衡器的 IPv6。

  • 您的负载均衡器必须具有虚拟机实例群组后端或具有 GCE_VM_IP_PORT 端点的可用区级网络端点群组 (NEG) 后端。其他后端类型不支持双栈。

此外,转换过程因负载均衡器的类型而异。

  • 对于全球外部应用负载均衡器,您需要将后端转换为双栈,并创建可处理传入 IPv6 流量的 IPv6 转发规则。

  • 对于跨区域内部应用负载均衡器、区域级外部应用负载均衡器和区域级内部应用负载均衡器,您只需将后端转换为双栈。这些负载均衡器不支持 IPv6 转发规则。

如需了解如何设置应用负载均衡器,请参阅以下文档:

确定要转换的资源

记下与负载均衡器关联的资源的名称。您稍后需要提供这些名称。

  1. 如需列出所有子网,请使用 gcloud compute networks subnets list 命令:

    gcloud compute networks subnets list
    

    记下具有要转换为双栈的仅 IPv4 地址的子网的名称。后面将以 SUBNET 引用该名称。 之后,VPC 网络称为 NETWORK。

  2. 如需列出所有后端服务,请使用 gcloud compute backend-services list 命令:

    gcloud compute backend-services list
    

    记下要转换为双栈的后端服务的名称。之后,此名称称为 BACKEND_SERVICE。

  3. 如需列出所有网址映射,请使用 gcloud compute url-maps list 命令:

    gcloud compute url-maps list
    

    记下与负载均衡器关联的网址映射的名称。之后,此名称称为 URL_MAP。

  4. 如果您已有负载均衡器,则如需查看后端的 IP 栈类型,请使用 gcloud compute instances list 命令:

    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)"
    
  5. 如需列出所有虚拟机实例和实例模板,请使用 gcloud compute instances list 命令和 gcloud compute instance-templates list 命令:

    gcloud compute instances list
    
    gcloud compute instance-templates list
    

    记下要转换为双栈的实例和实例模板的名称。之后,此名称称为 VM_INSTANCE 和 INSTANCE_TEMPLATES。

  6. 如需列出所有实例群组,请使用 gcloud compute instance-groups list 命令:

    gcloud compute instance-groups list
    

    记下要转换为双栈的网络端点组的名称。之后,此名称称为 INSTANCE_GROUP。

  7. 如需列出所有可用区级网络端点组 (NEG),请使用 gcloud compute network-endpoint-groups list 命令:

    gcloud compute network-endpoint-groups list
    

    记下要转换为双栈的可用区级 NEG 后端的名称。之后,此名称称为 ZONAL_NEG。

  8. 如需列出所有目标代理,请使用 gcloud compute target-http-proxies list 命令:

    gcloud compute target-http-proxies list
    

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

从单栈后端转换为双栈后端

本部分介绍了如何将使用仅 IPv4(单栈)地址的负载均衡器资源和后端转换为 IPv4 和 IPv6(双栈)地址。

更新子网

只有自定义模式 VPC 网络支持双栈子网。自动模式 VPC 网络及旧版网络均不支持双栈子网。 虽然自动模式网络可用于早期探索,但是对于大多数生产环境,更适合使用自定义模式 VPC。我们建议您使用自定义模式的 VPC。

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

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

    如果您使用的是 default 网络,必须将其转换为自定义模式 VPC 网络。

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

    确保子网的 IPv6 访问权限类型已设置为 External。

  3. 可选:如果您要在此网络中的子网上配置内部 IPv6 地址范围,请完成以下步骤:

    1. 对于 VPC 网络 ULA 内部 IPv6 范围,选择已启用。
    2. 在分配内部 IPv6 范围字段中,选择自动或手动。

      如果您选择手动,请输入 fd20::/20 范围内的 /48 范围。如果此范围正在使用中,系统会提示您提供其他范围。

更新代理专用子网

如果您使用的是基于 Envoy 的负载均衡器,我们建议您将代理专用子网栈类型更改为双栈。如需了解支持代理专用子网的负载均衡器,请参阅支持的负载均衡器。

您无法像更新常规子网(使用 subnets update command)一样更新代理专用子网 (purpose=REGIONAL_MANAGED_PROXY) 的堆栈类型。相反,您必须创建具有双栈堆栈类型的备用代理专用子网,然后将其提升为活跃角色。这是因为在每个 VPC 网络中,每个区域只能有一个代理专用子网处于活跃状态。

在 VPC 网络上分配内部 IPv6 范围后,请执行以下操作,将代理专用子网的堆栈类型更改为双栈。

控制台

  1. 在与活跃的代理专用子网相同的区域中创建备用代理专用子网,并将 IP 堆栈类型指定为双栈。

    1. 在 Google Cloud 控制台中,转到 VPC 网络页面。
      转到“VPC 网络”页面
    2. 点击您要向其中添加代理专用子网的 VPC 网络的名称。
    3. 点击添加子网。
    4. 输入名称。
    5. 选择区域。
    6. 对于用途,选择区域级托管式代理。
    7. 对于角色,选择备用。
    8. 对于 IP 栈类型,请选择 IPv4 和 IPv6(双栈)。
    9. 输入一个 IP 地址范围。
    10. 点击添加。
  2. 创建或修改应用于您的后端虚拟机或端点的入站流量允许防火墙规则,使其包含备用代理专用子网的主要 IP 地址范围。

  3. 将备用代理专用子网提升为活跃角色。此操作还会将之前的活跃代理专用子网降级为备用角色:

    1. 在 Google Cloud 控制台中,转到 VPC 网络页面。
      转到“VPC 网络”页面
    2. 点击要修改的 VPC 网络的名称。
    3. 在为负载均衡预留代理专用子网下,找到上一步中创建的备用子网。
    4. 点击激活。
    5. 指定可选的排空超时。
    6. 点击激活子网。
  4. 在连接排空超时后,或在确定与后端虚拟机或端点的连接并非来自之前的活跃(现在是备份)代理专用子网中的代理后,您可以执行以下操作:

    • 修改应用于您的后端虚拟机或端点的入站流量允许防火墙规则,使其不包含之前处于活跃状态(现在处于备用状态)的代理专用子网的主要 IP 地址范围。
    • 删除之前处于活跃状态(现在处于备用状态)的代理专用子网,以释放子网用于其主要 IP 地址范围的 IP 地址。

gcloud

以下步骤假定您已具有现有的活跃代理专用子网。

  1. 使用 gcloud compute networks subnets create 命令,在同一区域中创建备用代理专用子网,并指定堆栈类型为双栈 (--stack-type=IPV4_IPV6)。此子网会通过 --role=BACKUP 标志分配为备用子网。

    gcloud compute networks subnets create BACKUP_PROXY_ONLY_SUBNET_NAME \
      --purpose=REGIONAL_MANAGED_PROXY \
      --role=BACKUP \
      --region=REGION \
      --network=VPC_NETWORK_NAME \
      --range=BACKUP_PROXY_ONLY_SUBNET_RANGE \
      --stack-type=IPV4_IPV6
    

    替换以下内容:

    • BACKUP_PROXY_ONLY_SUBNET_NAME:新创建的备用代理专用子网的名称
    • REGION:新创建的备用代理专用子网的区域。这应是与当前活跃的代理专用子网相同的区域。
    • VPC_NETWORK_NAME:新创建的备用代理专用子网的网络。这应是与当前活跃的代理专用子网相同的网络。
    • VPC_NETWORK_NAME:VPC 网络的名称
    • BACKUP_PROXY_ONLY_SUBNET_RANGE:新创建的备用代理专用子网的 CIDR 范围
  2. 创建或修改应用于您的后端虚拟机或端点的入站允许防火墙规则,使其现在包含备用代理专用子网的主要 IP 地址范围。防火墙规则应已接受来自活跃子网的连接。

    gcloud compute firewall-rules update PROXY_ONLY_SUBNET_FIREWALL_RULE \
      --source-ranges ACTIVE_PROXY_ONLY_SUBNET_RANGE,BACKUP_PROXY_ONLY_SUBNET_RANGE
    

    替换以下内容:

    • PROXY_ONLY_SUBNET_FIREWALL_RULE:防火墙规则的名称,用于允许来自代理专用子网的流量到达您的后端实例或端点
    • ACTIVE_PROXY_ONLY_SUBNET_RANGE:当前活跃的代理专用子网的 CIDR 范围
    • BACKUP_PROXY_ONLY_SUBNET_RANGE:备用代理专用子网的 CIDR 范围
  3. 更新新子网,将其设置为相应区域中的 ACTIVE 代理专用子网,并等待旧子网排空。此操作还会将之前的活跃代理专用子网降级为备用角色。

    如需立即排空 IP 地址范围,请将 --drain-timeout 设置为 0s。 这样可以迅速终止与分配有正被排空子网中的地址的代理的所有连接。

    gcloud compute networks subnets update BACKUP_PROXY_ONLY_SUBNET_NAME \
      --region=REGION \
      --role=ACTIVE \
      --drain-timeout=CONNECTION_DRAINING_TIMEOUT
    

    替换以下内容:

    • BACKUP_PROXY_ONLY_SUBNET_NAME:新创建的备用代理专用子网的名称
    • REGION:新创建的备用代理专用子网的区域。这应是与当前活跃的代理专用子网相同的区域。
    • CONNECTION_DRAINING_TIMEOUT: Google Cloud 将现有连接从之前活跃的代理专用子网中的代理迁移出来所用的时间量(以秒为单位)
  4. 使用 list 或 describe 命令监控排空状态。子网在进行排空时的状态为 DRAINING。

    gcloud compute networks subnets list
    

    等待排空完成。旧的代理专用子网排空后,该子网的状态为 READY。

  5. 更新代理专用子网防火墙规则,以仅允许来自新子网的连接。

    gcloud compute firewall-rules PROXY_ONLY_SUBNET_FIREWALL_RULE \
      --source-ranges BACKUP_PROXY_ONLY_SUBNET_RANGE
    
  6. 在确定与后端虚拟机或端点的连接并非来自之前的活跃(现在是备份)代理专用子网中的代理后,您可以删除旧子网。

    gcloud compute networks subnets delete ACTIVE_PROXY_ONLY_SUBNET_NAME \
      --region=REGION
    

更新虚拟机实例或模板

如果虚拟机实例连接到的子网配置了 IPv6 范围,则您可以在虚拟机实例上配置 IPv6 地址。只有以下后端才能支持 IPv6 地址:

  • 实例组后端:一个或多个托管式实例组后端、非托管式实例组后端,或托管式实例组后端与非托管式实例组后端的组合。
  • 可用区级 NEG:一个或多个 GCE_VM_IP_PORT 类型可用区级 NEG。

更新虚拟机实例

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

  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 GNU/Linux 12 (bookworm)。如有必要,请点击选择以更改映像。

  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_NAME 为 vm-a1 和您选择的任何 GCP_NEG_ZONE 可用区
  • VM_NAME 为 vm-a2 和同一 GCP_NEG_ZONE 可用区

    gcloud compute instances create VM_NAME \
        --zone=GCP_NEG_ZONE \
        --stack-type=IPV4_IPV6 \
        --image-family=debian-12 \
        --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 探测系统的 IP 地址范围进行健康检查。如需了解详情,请参阅探测 IP 范围。

确保入站流量规则适用于正在负载均衡的实例,且允许来自 Google Cloud 健康检查系统的流量。此示例使用目标标记 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::/64、2600:2d00:1:1::/64

      • 对于跨区域内部应用负载均衡器、区域级外部应用负载均衡器、区域级内部应用负载均衡器、跨区域内部代理网络负载均衡器、区域级外部代理网络负载均衡器和区域级内部代理网络负载均衡器,请输入 2600:2d00:1:b029::/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
    

    对于跨区域内部应用负载均衡器、区域级外部应用负载均衡器、区域级内部应用负载均衡器、跨区域内部代理网络负载均衡器、区域级外部代理网络负载均衡器和区域级内部代理网络负载均衡器,请使用以下命令:

    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 \
        --rules=all
    

为代理专用子网创建防火墙规则

如果您使用的是区域级外部应用负载均衡器或内部应用负载均衡器,则必须更新入站流量防火墙规则 fw-allow-lb-access-ipv6,以允许流量从代理专用子网流向后端。

如需获取代理专用子网的 IPv6 地址范围,请运行以下命令:

gcloud compute networks subnets describe PROXY_ONLY_SUBNET \
    --region=REGION \
    --format="value(internalIpv6Prefix)"

请注意内部 IPv6 地址范围;此范围在后面称为 IPV6_PROXY_ONLY_SUBNET_RANGE。

如需更新代理专用子网的防火墙规则 fw-allow-lb-access-ipv6,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往防火墙政策页面。

    转到“防火墙政策”

  2. 在 VPC 防火墙规则面板中,点击 fw-allow-lb-access-ipv6。

    • 来源 IPv6 范围:2600:2d00:1:b029::/64、IPV6_PROXY_ONLY_SUBNET_RANGE
  3. 点击保存。

gcloud

  1. 更新 fw-allow-lb-access-ipv6 防火墙规则以允许与代理专用子网通信:

    gcloud compute firewall-rules update fw-allow-lb-access-ipv6 \
        --source-ranges=2600:2d00:1:b029::/64,IPV6_PROXY_ONLY_SUBNET_RANGE
    

为 IPv6 创建新的后端服务和转发规则

本部分介绍了为 IPv6 创建新的后端服务和转发规则的过程。 请注意,您只能为全球外部应用负载均衡器创建 IPv6 转发规则。跨区域内部应用负载均衡器、区域级外部应用负载均衡器和区域级内部应用负载均衡器不支持 IPv6 转发规则。

此时,BACKEND_SERVICE 和 BACKEND_SERVICE_IPV6 都能处理流量。为避免流量中断,请创建一个 IP 地址选择政策设置为 Prefer IPv6 的新后端服务。创建新的后端服务后,您可以将流量路由到新的 IPv6 后端服务。

控制台

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

    转到“负载均衡”

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

  3. 点击修改。

配置后端服务:

  1. 点击后端配置。
  2. 在后端服务字段中,选择创建后端服务。
  3. 将名称设置为 BACKEND_SERVICE_IPV6。
  4. 对于后端类型,选择可用区级网络端点组。
  5. 在 IP 地址选择政策列表中,选择首选 IPv6。
  6. 在协议字段中,选择 HTTP。
  7. 在新建后端面板中,执行以下操作:
    1. 在网络端点组列表中,选择 ZONAL_NEG。
    2. 在 RPS 上限字段中,输入 10。
  8. 在健康检查列表中,选择 HTTP 健康检查。
  9. 点击完成。

配置 IPv6 前端:

跨区域内部应用负载均衡器、区域级外部应用负载均衡器和区域级内部应用负载均衡器不支持使用 IPv6 的转发规则。

  1. 点击前端配置。
  2. 点击添加前端 IP 和端口。
  3. 在名称字段中,输入转发规则的名称。
  4. 在协议字段中,选择 HTTP。
  5. 将 IP 版本设置为 IPv6。
  6. 点击完成。
  7. 点击更新。

配置路由规则

  1. 点击路由规则。
  2. 点击高级主机和路径规则。
  3. 点击更新。

gcloud

  1. 创建健康检查:

     gcloud compute health-checks create http HEALTH_CHECK \
         --port 80
    
  2. 为 HTTP 流量创建后端服务:

    全局

    对于全球外部应用负载均衡器,请使用以下命令:

    gcloud compute backend-services create BACKEND_SERVICE_IPV6 \
        --load-balancing-scheme=EXTERNAL_MANAGED \
        --protocol=HTTP \
        --ip-address-selection-policy=PREFER_IPV6 \
        --health-checks=HEALTH_CHECK \
        --global
    

    跨区域

    对于跨区域内部应用负载均衡器,请使用以下命令:

    gcloud compute backend-services create BACKEND_SERVICE_IPV6 \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --protocol=HTTP \
        --ip-address-selection-policy=PREFER_IPV6 \
        --health-checks=HEALTH_CHECK \
        --global
    

    区域级

    对于区域级外部应用负载均衡器,请使用以下命令:

    gcloud compute backend-services create BACKEND_SERVICE_IPV6 \
        --load-balancing-scheme=EXTERNAL_MANAGED \
        --protocol=HTTP \
        --ip-address-selection-policy=PREFER_IPV6 \
        --health-checks=HEALTH_CHECK \
        --region=REGION
    

    对于区域级内部应用负载均衡器,请使用以下命令:

    gcloud compute backend-services create BACKEND_SERVICE_IPV6 \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --protocol=HTTP \
        --ip-address-selection-policy=PREFER_IPV6 \
        --health-checks=HEALTH_CHECK \
        --region=REGION
    
  3. 将双栈可用区级 NEG 作为后端添加到后端服务。

    全局

    对于全球外部应用负载均衡器,请使用以下命令:

     gcloud compute backend-services add-backend BACKEND_SERVICE_IPV6 \
         --network-endpoint-group=ZONAL_NEG \
         --network-endpoint-group-zone=ZONE \
         --max-rate-per-endpoint=10 \
         --global
    

    跨区域

    对于跨区域内部应用负载均衡器,请使用以下命令:

     gcloud compute backend-services add-backend BACKEND_SERVICE_IPV6 \
         --network-endpoint-group=ZONAL_NEG \
         --network-endpoint-group-zone=ZONE \
         --max-rate-per-endpoint=10 \
         --global
    

    区域级

    对于区域级外部应用负载均衡器和区域级内部应用负载均衡器,请使用以下命令:

     gcloud compute backend-services add-backend BACKEND_SERVICE_IPV6 \
         --network-endpoint-group=ZONAL_NEG \
         --network-endpoint-group-zone=ZONE \
         --max-rate-per-endpoint=10 \
         --region=REGION
    
  4. 将双栈实例群组作为后端添加到后端服务。

    全局

    对于全球外部应用负载均衡器,请使用以下命令:

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

    跨区域

    对于跨区域内部应用负载均衡器,请使用以下命令:

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

    区域级

    对于区域级外部应用负载均衡器和区域级内部应用负载均衡器,请使用以下命令:

     gcloud compute backend-services add-backend BACKEND_SERVICE_IPV6 \
         --instance-group=INSTANCE_GROUP \
         --region=REGION
    
  5. 仅适用于全球外部应用负载均衡器。为全球外部应用负载均衡器创建 IPv6 转发规则。使用以下命令:

     gcloud compute forwarding-rules create FORWARDING_RULE_IPV6 \
         --load-balancing-scheme=EXTERNAL_MANAGED \
         --network-tier=PREMIUM \
         --global \
         --target-http-proxy=TARGET_PROXY \
         --ports=443
    

将流量路由到新的 IPv6 后端服务

更新网址映射,以将部分客户端流量定向到新的 IPv6 后端服务 BACKEND_SERVICE_IPV6。

  1. 使用以下命令修改网址映射:

    全局

    对于全球外部应用负载均衡器,请使用以下命令:

      gcloud compute url-maps edit URL_MAP \
          --global
      

    跨区域

    对于跨区域内部应用负载均衡器,请使用以下命令:

      gcloud compute url-maps edit URL_MAP \
          --global
      

    区域级

    对于区域级外部应用负载均衡器和区域级内部应用负载均衡器,请使用以下命令:

       gcloud compute url-maps edit URL_MAP \
           --region=REGION
       
  2. 在显示的文本编辑器中,添加一个操作为 weightedBackendServices 的 routeRule 以将一定百分比的 IPv6 流量定向到 BACKEND_SERVICE_IPV6。

    defaultService: global/backendServices/BACKEND_SERVICE
    hostRules:
    - hosts:
      - '*'
      pathMatcher: matcher1
    name: URL_MAP
    pathMatchers:
    - defaultService: global/backendServices/BACKEND_SERVICE
      name: matcher1
      routeRules:
      - matchRules:
        - prefixMatch: ''
        priority: 1
        routeAction:
          weightedBackendServices:
          - backendService: global/backendServices/BACKEND_SERVICE
            weight: 95
          - backendService: global/backendServices/BACKEND_SERVICE_IPV6
            weight: 5
    

如需实现向 IPv6 的逐步迁移,请通过多次修改网址映射,将新的后端服务 BACKEND_SERVICE_IPV6 的权重百分比逐步增加到 100%。

配置 IP 地址选择政策

将资源和后端转换为双栈后,您可以使用 IP 地址选择政策指定从后端服务发送到后端的流量类型。

将 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 地址选择政策,此配置会导致后端健康状况不佳,因为流量无法到达这些后端,并且 HTTP 503 响应代码会返回给客户端。

控制台

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

    转到“负载均衡”

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

  3. 点击修改。

  4. 点击后端配置。

  5. 在后端服务字段中,选择 BACKEND_SERVICE_IPV6。

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

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

  8. 点击完成。

gcloud

更新后端服务的 IP 地址选择政策:

全局

对于全球外部应用负载均衡器,请使用以下命令:

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

跨区域

对于跨区域内部应用负载均衡器,请使用以下命令:

gcloud compute backend-services update BACKEND_SERVICE_IPV6 \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --protocol=HTTP \
    --ip-address-selection-policy=IP_ADDRESS_SELECTION_POLICY \
    --global

区域级

对于区域级外部应用负载均衡器,请使用以下命令:

gcloud compute backend-services update BACKEND_SERVICE_IPV6 \
    --load-balancing-scheme=EXTERNAL_MANAGED \
    --protocol=HTTP \
    --ip-address-selection-policy=IP_ADDRESS_SELECTION_POLICY \
    --region=REGION

对于区域级内部应用负载均衡器,请使用以下命令:

gcloud compute backend-services update BACKEND_SERVICE_IPV6 \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --protocol=HTTP \
    --ip-address-selection-policy=IP_ADDRESS_SELECTION_POLICY \
    --region=REGION

测试负载均衡器

您必须验证所有必需的资源是否都已更新为双栈。更新所有资源后,流量必须自动流向后端。您可以查看日志并验证转换是否已完成。

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

查找负载均衡器 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
    

对于内部负载均衡器

  1. 在负载均衡器所在的 VPC 网络和区域中创建测试客户端虚拟机。它无需位于同一子网或可用区中。

    gcloud compute instances create client-vm \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ssh \
        --subnet=SUBNET
    
  2. 使用 SSH 连接到客户端实例。

    gcloud compute ssh client-vm \
        --zone=ZONE
    
  3. 重复以下命令几次,直到您看到所有后端虚拟机都做出响应:

    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。

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