设置双栈资源

双栈子网使您的 Cloud Run 资源可以通过直接 VPC 出站流量将 IPv4 和 IPv6 流量发送到 VPC 网络。 您可以将现有的仅限 IPv4(单栈)子网更改为双栈子网。

子网类型

VPC 网络支持以下 Compute Engine 子网类型

双栈限制

在更改现有 Cloud Run 资源上的栈类型之前,请考虑以下限制:

  • 只有自定义模式 VPC 网络中的子网支持双栈。如需让双栈子网可使用内部访问权限类型,必须启用 VPC 网络内部 IPv6 范围。设置 VPC 网络或将其转换为自定义模式。

  • 与仅 IPv4 子网相比,双栈子网可能会出现冷启动延迟时间增加,从而限制应用的扩容速度。

  • 不支持 NAT64

准备工作

请确保 Cloud Run 服务代理具有 Compute Public IP Admin 角色 (roles/compute.publicIpAdmin),才能使用具有外部 IPv6 的子网。

在资源中添加双栈子网

双栈子网同时具有 IPv4 和 IPv6 地址范围。

如需在 Cloud Run 资源中添加双栈子网,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中:

    1. 启用 Compute Engine API:

      启用 Compute Engine API

    2. 前往 VPC 网络页面:

      进入 VPC 网络页面

  2. 如果您要创建新的自定义模式网络,请点击创建 VPC 网络。如果您使用的是现有 VPC 网络,请点击该 VPC 网络的名称以显示其 VPC 网络详情页面。

  3. 如果您要创建新网络或转换现有网络,请输入名称,并确保子网创建模式设置为自定义,然后选择为此 VPC 网络配置 ULA 内部 IPv6 范围

  4. 子网标签页上,点击添加子网。在显示的面板中:

    1. 提供名称
    2. 选择区域
    3. 对于 IP 栈类型,请选择 IPv4 和 IPv6(双栈)
    4. 输入 IPv4 范围。这是子网的主要 IPv4 地址范围
    5. 选择 IPv6 访问权限类型

      如果内部选项不可用,但您需要使用该选项,请检查是否为网络分配了内部 IPv6 范围。

    6. 点击添加

  5. 在您创建的双栈子网上部署 Cloud Run 服务执行作业部署工作器池。在输入所需的资源详细信息时,请按照以下步骤选择新的 IPv6 地址范围:

    1. 点击容器、卷、网络、安全性,然后选择网络标签页。
    2. 依次点击连接到 VPC 以获取出站流量将流量直接发送到 VPC
    3. 选择您在上一步中创建的网络
    4. 点击子网字段,选择新创建的 IPv6 地址范围。

    系统会使用子网的栈类型自动预配资源。

gcloud

  1. 如需创建支持双栈子网的自定义模式网络,请运行 gcloud compute networks create 命令:

    如需在此网络的任何子网上配置内部 IPv6 范围,请使用 --enable-ula-internal-ipv6 标志。此选项会在 Google Cloud 用于内部 IPv6 子网范围的 fd20::/20 范围内分配 /48 ULA 前缀。

    gcloud compute networks create NETWORK \
      --subnet-mode=custom \
      --enable-ula-internal-ipv6
    

    NETWORK 替换为包含新子网的 VPC 网络的名称。

  2. 如需转换为自定义模式网络或更新自定义模式网络以支持双栈子网,请运行以下命令:

    gcloud compute networks update NETWORK \
      --subnet-mode=custom \
      --enable-ula-internal-ipv6
    

    NETWORK 替换为包含新子网的 VPC 网络的名称。

  3. 如需创建具有 IPv6 范围的双栈子网,请使用双栈设置运行 subnets create 命令

    gcloud compute networks subnets create SUBNET \
      --network=NETWORK \
      --range=PRIMARY_IPv4_RANGE \
      --stack-type=IPV4_IPV6 \
      --ipv6-access-type=IPV6_ACCESS_TYPE \
      --region=REGION
    

    替换以下内容:

    • SUBNET:新子网的名称。
    • NETWORK:将包含新子网的 VPC 网络的名称。
    • PRIMARY_IPv4_RANGE:新子网的主要 IPv4 范围(采用 CIDR 表示法)。如需了解详情,请参阅 IPv4 子网范围
    • IPV6_ACCESS_TYPE:新子网的 IPv6 访问权限类型 internalexternal
    • REGION:将在其中创建新子网的 Google Cloud 区域。
  4. 在您创建的双栈子网上部署 Cloud Run 服务执行作业部署工作器池。系统会使用子网的栈类型自动预配资源。

YAML

  1. 如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置

    gcloud run services describe SERVICE --format export > service.yaml
  2. 更新以下属性:

    apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: SERVICE_NAME
        labels:
          cloud.googleapis.com/location: REGION
      spec:
        template:
          metadata:
            annotations:
              run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET","tags":"NETWORK_TAG_NAMES"}]'
              run.googleapis.com/vpc-access-egress: EGRESS_SETTING
          spec:
            containers:
            - image: IMAGE

    您需要进行如下替换:

    • SERVICE_NAME 替换为您的 Cloud Run 服务的名称。服务名称不得超过 49 个字符,并且在每个区域和项目中必须是唯一的。
    • REGION 替换为 Cloud Run 服务的区域,该区域必须与子网的区域一致。
    • NETWORK 替换为 VPC 网络的名称。
    • SUBNET 替换为您的子网名称。 您可以在同一子网上部署或执行多个服务、作业或工作器池。
    • 可选:将 NETWORK_TAG_NAMES 替换为要与服务关联的网络标记的名称。对于服务,网络标记在修订版本级指定。每个服务修订版本都可以有不同的网络标记,例如 network-tag-2
    • EGRESS_SETTING 替换为出站流量设置值
      • all-traffic:通过 VPC 网络发送所有出站流量。
      • private-ranges-only:仅发送通过 VPC 网络发送到内部地址的流量。
    • IMAGE 替换为服务容器映像的网址。

    您还可以指定更多配置,例如环境变量或内存限制。

  3. 使用以下命令创建或更新服务:

    gcloud run services replace service.yaml

Terraform

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

  1. 请将以下内容添加到 main.tf 文件:

    /**
     * Copyright 2024 Google LLC
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    # Example configuration of a Cloud Run service with direct VPC
    
    resource "google_cloud_run_v2_service" "default" {
      name     = "cloudrun-service"
      location = "us-central1"
    
      deletion_protection = false # set to "true" in production
    
      template {
        containers {
          image = "us-docker.pkg.dev/cloudrun/container/hello"
        }
        vpc_access {
          network_interfaces {
            network    = "default"
            subnetwork = "default"
            tags       = ["tag1", "tag2", "tag3"]
          }
        }
      }
    }
    

(可选)如果您想允许对服务进行未经身份验证的访问,请将服务设为公开

将子网从单栈更改为双栈

如需将 IPv6 子网范围添加到自定义模式 VPC 网络中的现有仅限 IPv4 子网,请参阅将子网的栈类型更改为双栈。 然后,在双栈子网上部署 Cloud Run 服务执行作业部署工作器池

将子网从双栈更改为单栈

如需将资源的双栈子网更改为单栈子网,请参阅将双栈子网更改为仅限 IPv4 子网。 然后,在双栈子网上部署 Cloud Run 服务执行作业部署工作器池

验证网络和子网

如需检查您的资源是否在 VPC 网络上,请运行以下命令:

gcloud run services describe SERVICE_NAME --region=REGION

REGION 替换为在其中创建新子网的 Google Cloud 区域。

以下示例输出显示了您的网络和子网:

  VPC Access:
    Network:        example-network
    Subnet:         example-subnet
    Egress:         private-ranges-only