将全球外部应用负载均衡器从单栈转换为双栈

本文档介绍了如何将全球外部应用负载均衡器资源和后端从仅 IPv4(单栈)转换为 IPv4 和 IPv6(双栈)。在本文档中,仅 IPv4(单栈)是指仅使用 IPv4 地址的资源,IPv4 和 IPv6(双栈)是指同时使用 IPv4 和 IPv6 地址的资源。

优势

将负载均衡器转换为双栈具有以下多项优势:

  • IPv6 的主要优点是可以分配更大的 IP 地址池。

  • 许多已在使用仅 IPv4 的负载均衡器的客户可以利用特定于云的方法,从仅 IPv4 的资源转换为 IPv4 和 IPv6(双栈)资源。

  • 您可以配置负载均衡器,以根据您的偏好设置终结入站 IPv6 流量,并通过 IPv4 或 IPv6 连接将此流量代理到后端。如需了解详情,请参阅 IPv6

限制

  • 您无法将子网的 IP 栈类型从 IPv4 和 IPv6(双栈)更新为仅 IPv4。

  • 将后端服务上的 IP 地址选择政策配置为仅 IPv6 时,您仍可以配置仅 IPv4 的后端。但是,此类配置会导致后端健康状况不佳,客户端会收到响应代码 503,并且流量不会流向上游。日志在 statusDetails HTTP 失败消息中显示 failed_to_pick_backend

  • 您可以将后端服务的 IP 地址选择政策配置为仅 IPv6,但后端的 IP 栈类型始终为 IPv4 和 IPv6(双栈)。

  • 只有具有 GCE_VM_IP_PORT 端点的虚拟机实例组后端和可用区级网络端点组 (NEG) 支持 IPv4 和 IPv6(双栈)。

准备工作

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

如需详细了解如何设置全球外部应用负载均衡器,请参阅以下文档:

确定要转换的资源

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

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

    gcloud compute networks subnets list
    

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

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

    gcloud beta compute backend-services list
    

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

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

    gcloud beta 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_INSTANCEINSTANCE_TEMPLATES

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

    gcloud compute network-endpoint-groups list
    

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

  7. 如需列出所有目标代理,请使用 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 网络转换为自定义模式

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

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

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

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

更新虚拟机实例或模板

如果虚拟机实例连接到的子网配置了 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 操作系统和 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 创建新的后端服务和转发规则

本部分介绍了为 IPv6 创建新的后端服务和转发规则的过程。

BACKEND_SERVICEBACKEND_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 前端:

  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 beta 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
    
  3. 将可用区级 NEG 作为后端添加到后端服务。

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

    gcloud compute addresses create lb-ipv6-1 \
       --ip-version=IPV6 \
       --network-tier=PREMIUM \
       --global
    
  5. 为后端服务创建转发规则。创建转发规则时,请指定子网中的外部 IP 地址。

    gcloud beta compute forwarding-rules create FORWARDING_RULE_IPV6 \
       --load-balancing-scheme=EXTERNAL_MANAGED \
       --network-tier=PREMIUM \
       --address=lb-ipv6-1 \
       --global \
       --target-https-proxy=TARGET_PROXY \
       --ports=443
    

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

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

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

    gcloud compute url-maps edit URL_MAP \
        --global
    
  2. 在显示的文本编辑器中,添加一个操作为 weightedBackendServicesrouteRule 以将一定百分比的 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 地址选择政策指定从 Google Front End (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_IPV6

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

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

  8. 点击完成

gcloud

  1. 更新后端服务:

    gcloud beta compute backend-services update BACKEND_SERVICE_IPV6 \
       --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 http://IP_ADDRESS_IPV4
    
    curl http://IP_ADDRESS_IPV6
    

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

    curl http://[fd20:1db0:b882:802:0:46:0:0]
    

查看日志

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

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

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