設定雙堆疊資源

雙重堆疊子網路可讓 Cloud Run 資源透過直接虛擬私有雲輸出流量,將 IPv4 和 IPv6 流量傳送至虛擬私有雲網路。您可以將現有的「僅限 IPv4」(單一堆疊) 子網路變更為雙重堆疊子網路。

子網路類型

虛擬私有雲網路支援下列 Compute Engine 子網路類型

雙堆疊限制

變更現有 Cloud Run 資源的堆疊類型前,請先考量以下限制:

  • 只有自訂模式虛擬私有雲網路中的子網路,才支援雙重堆疊。如要讓雙重堆疊子網路使用內部存取權類型,必須啟用虛擬私有雲網路內部 IPv6 範圍。設定虛擬私有雲網路,或將其轉換為自訂模式。

  • 與僅支援 IPv4 的子網路相比,雙重堆疊子網路的冷啟動延遲時間可能會較長,進而限制應用程式的擴充速度。

  • 不支援 NAT64

事前準備

請確認 Cloud Run 服務代理程式具備Compute Public IP 管理員角色 (roles/compute.publicIpAdmin),才能使用具有外部 IPv6 的子網路。

在資源上新增雙堆疊子網路

雙重堆疊子網路同時具有 IPv4 和 IPv6 位址範圍。

如要在 Cloud Run 資源上新增雙堆疊子網路,請按照下列步驟操作:

控制台

  1. 在 Google Cloud 控制台中:

    1. 啟用 Compute Engine API:

      啟用 Compute Engine API

    2. 前往「VPC networks」(VPC 網路) 頁面:

      前往「VPC networks」(虛擬私有雲網路)

  2. 如要建立新的自訂模式網路,請按一下「建立虛擬私有雲網路」。 如果您使用現有的虛擬私有雲網路,請按一下虛擬私有雲網路的名稱,顯示其「VPC network details」(虛擬私有雲網路詳細資料) 頁面。

  3. 如果您要建立新網路或轉換現有網路,請輸入名稱,並確認「子網路建立模式」設為「自訂」,然後選取「為這個虛擬私有雲網路設定 ULA 內部 IPv6 範圍」

  4. 在「子網路」分頁中,按一下「新增子網路」。在顯示的面板中:

    1. 提供「Name」(名稱)
    2. 選擇「Region」(區域)
    3. 在「IP 堆疊類型」部分,選取「IPv4 和 IPv6 (雙重堆疊)」
    4. 輸入「IPv4 range」(IPv4 範圍)。這是子網路的主要 IPv4 範圍
    5. 選取 IPv6 存取權類型

      如果沒有內部選項,但您需要這個選項,請確認網路已指派內部 IPv6 範圍。

    6. 按一下「新增」。

  5. 在您建立的雙堆疊子網路上部署 Cloud Run 服務執行工作部署 worker 集區。輸入所需資源詳細資料時,請按照下列步驟選取新的 IPv6 位址範圍:

    1. 按一下「容器、磁碟區、網路與安全性」,然後選取「網路」分頁標籤。
    2. 按一下「連線至虛擬私有雲,以傳出流量」,然後按一下「直接將流量傳送至虛擬私有雲」
    3. 選取您在上一個步驟中建立的「網路」
    4. 按一下「子網路」欄位,選取新建立的 IPv6 位址範圍。

    系統會自動根據子網路的堆疊類型佈建資源。

gcloud

  1. 如要建立支援雙重堆疊子網路的自訂模式網路,請執行 gcloud compute networks create 指令。

    如要在這個網路的任何子網路上設定內部 IPv6 範圍,請使用 --enable-ula-internal-ipv6 標記。這個選項會從內部 IPv6 子網路範圍使用的 fd20::/20 範圍內,指派 /48 ULA 前置字元。 Google Cloud

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

    NETWORK 替換為要包含新子網路的虛擬私有雲網路名稱。

  2. 如要轉換為或更新自訂模式網路,使其支援雙重堆疊子網路,請執行下列指令:

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

    NETWORK 替換為要包含新子網路的虛擬私有雲網路名稱。

  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:虛擬私有雲網路的名稱,此網路將包含新的子網路。
    • PRIMARY_IPv4_RANGE:新子網路的主要 IPv4 範圍,採用 CIDR 標記法。詳情請參閱「IPv4 子網路範圍」。
    • IPV6_ACCESS_TYPE:新子網路的 IPv6 存取類型,可以是 internalexternal
    • REGION:新子網路的建立 Google Cloud 區域。
  4. 在您建立的雙堆疊子網路上部署 Cloud Run 服務執行工作部署 worker 集區。系統會自動根據子網路的堆疊類型佈建資源。

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 替換為您的虛擬私有雲網路名稱。
    • SUBNET 替換為子網路名稱。您可以在同一個子網路上部署或執行多項服務、工作或工作站集區。
    • 選用:NETWORK_TAG_NAMES,您要與服務建立關聯的網路標記名稱。如果是服務,網路標記是在修訂版本層級指定。每個服務修訂版本可以有不同的網路標記,例如 network-tag-2
    • EGRESS_SETTING,並將輸出設定值設為:
      • all-traffic:透過虛擬私有雲網路傳送所有輸出流量。
      • private-ranges-only:只透過虛擬私有雲網路將流量傳送至內部位址。
    • 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 子網路範圍新增至現有的「僅限 IPv4」子網路,請參閱「將子網路的堆疊類型變更為雙重堆疊」。然後部署 Cloud Run 服務執行工作,或在雙堆疊子網路上部署工作集區

將子網路從雙重堆疊變更為單一堆疊

如要將資源的雙重堆疊子網路變更為單一堆疊子網路,請參閱「將雙重堆疊子網路變更為僅限 IPv4」。然後部署 Cloud Run 服務執行工作,或在雙堆疊子網路上部署工作集區

確認網路和子網路

如要確認資源是否位於虛擬私有雲網路上,請執行下列指令:

gcloud run services describe SERVICE_NAME --region=REGION

REGION 替換為建立新子網路的 Google Cloud 區域。

以下範例輸出內容顯示您的網路和子網路:

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