直連虛擬私有雲與虛擬私有雲網路

您可以啟用 Cloud Run 服務、函式、工作或工作人員集區 ,透過直連虛擬私有雲輸出將流量傳送至虛擬私有雲網路,不需使用無伺服器 VPC 存取連接器。

Cloud Run 服務和工作不支援直連虛擬私有雲輸入。如要僅為工作站集區設定直連虛擬私有雲輸入流量,請參閱「Cloud Run 工作站集區輸入流量」。

事前準備

限制

下列限制適用於 Cloud Run 服務、函式、工作和工作人員集區:

  • 使用直連虛擬私有雲輸出時,執行個體啟動時的連線建立作業可能會延遲一分鐘以上。建議您設定 HTTP 啟動探查,在應用程式接受要求前,測試與應用程式使用的輸出目的地之間的連線。這項輸出連線測試應實作重試機制,或設定適當的週期和門檻設定,讓啟動探查做為重試機制。
  • 執行時間超過 1 小時的 Cloud Run 工作可能會發生連線中斷情形。這些情況可能發生在維護作業期間,因為系統會將作業從一部機器遷移至另一部機器。容器會在事件發生前 10 秒收到 SIGTSTP 信號,並在事件發生後收到 SIGCONT 信號。容器收到 SIGCONT 信號後,請重試連線。
  • 使用 Cloud NAT 時,如果使用直連虛擬私有雲輸出,執行個體啟動時可能會出現 30 秒以上的冷啟動延遲。為提升啟動效能,建議搭配 Cloud NAT 使用無伺服器 VPC 存取連接器
  • Cloud Run 支援的總處理量上限為每個執行個體 1 Gbps。超過這個數量就會導致效能受到限制。
  • Cloud Run 用量配額會限制您設定使用直接虛擬私有雲輸出流量的執行個體數量上限。每個 Cloud Run 修訂版本或工作執行作業可設定的數量上限。如要提高預設限制,請參閱如何提高配額

  • 在網路基礎架構維護期間,Cloud Run 服務和工作 可能會發生連線中斷情形。建議您使用可處理偶爾連線重設的用戶端程式庫。
  • Network Intelligence Center 僅支援 IPv4 和 IPv6 子網路範圍的「連線測試」和「流程分析器」
  • Cloud Run 服務和工作不支援直接虛擬私有雲輸入流量。工作站集區支援直連虛擬私有雲輸出和直連虛擬私有雲輸入。
  • 雖然工作站集區支援直連虛擬私有雲輸入,但您無法使用網路標記定義輸入防火牆規則的目標。
  • 僅支援使用直連虛擬私有雲,不支援使用無伺服器 VPC 存取連接器,將流量輸入至工作站集區。連接器不支援 Ingress。

直連虛擬私有雲輸出不支援下列項目:

  • 虛擬私有雲流程記錄檔不會提供 Cloud Run 修訂版本的名稱。
  • 虛擬私有雲防火牆規則記錄
  • Packet Mirroring
  • 輸入防火牆規則中的網路標記服務身分
  • 防火牆規則無法使用附加至 Cloud Run 工作負載的 Resource Manager 標記。
  • 使用 Cloud Next Generation Firewall Enterprise 檢查輸出流量,例如入侵偵測與預防服務、網址篩選服務和 TLS 檢查。

IP 位址分配

如要將 Cloud Run 服務或工作 放在虛擬私有雲網路上,請指定虛擬私有雲網路或子網路,或同時指定兩者。如果您只指定網路,子網路會使用與網路相同的名稱。Cloud Run 會從子網路分配 IP 位址。

IP 位址是暫時性的,因此請勿根據個別 IP 建立政策。 如要根據 IP 建立政策 (例如防火牆規則),您必須使用整個子網路的 IP 位址範圍。

如要變更 、工作或工作站集區 使用的網路或子網路,請部署新的修訂版本,或執行使用新網路和子網路值的新工作任務。

擴充及縮減規模

為在流量暴增期間加快擴充速度,Cloud Run 會一次保留 16 個 IP 位址 (28 子網路遮罩)。查看 Cloud Run 分配的 IP 位址。 為確保您有足夠的 IPv4 位址可供 Cloud Run 使用,子網路的 IPv4 位址範圍必須為 /26 或更大。

為提高 IP 位址分配效率並簡化管理作業,請將多項資源放在同一個子網路上。如果 IPv4 位址空間有限,請參閱「支援的 IPv4 範圍」一文,瞭解更多選項。

如要刪除子網路,請先刪除或重新部署 Cloud Run服務、工作或工作站集區 ,停止使用子網路,然後等待 1 到 2 小時。

服務和工作站集區的 IP 位址耗用量

在穩定狀態下,Cloud Run 使用的 IP 位址數量是執行個體數量的 2 倍 (2X)。當修訂版本縮減規模時,Cloud Run 最多會保留 IP 位址 20 分鐘。總共保留的 IP 位址數量至少是 2 倍,外加緩衝區,以因應修訂更新。

舉例來說,如果您升級修訂版本,讓 revision 1 從 100 個執行個體縮減至零,而 revision 2 從零擴增至 100 個,Cloud Run 會在縮減後保留 revision 1 IP 位址最多 20 分鐘。在 20 分鐘的保留時間內,您必須保留至少 400 個 IP 位址 ((100 + 100) * 2)。

工作使用的 IP

如果是 Cloud Run 工作,每項工作在執行期間會耗用 1 個 IP 位址,執行完畢後還會耗用 7 分鐘。請確認子網路夠大,可容納所有並行執行的工作任務,且至少需要預留 /26 子網路。

例如:

  • 如果單一工作每天執行,且一律會在下次執行前至少 7 分鐘完成,則子網路上最多會消耗 1 個 IP 位址。
  • 假設有 10 項工作每 10 分鐘執行一次,每項工作執行 15 分鐘,則每項工作會耗用 1 個 IP 位址 22 分鐘 (3 次執行會同時耗用 IP 位址),如下例所示。因此,這項工作在穩定狀態下會耗用 30 個 IP 位址。
  • 如果單一工作需要 1 分鐘才能執行,且每分鐘執行 100 次,則視確切執行時間而定,大約需要 800 個 IP 位址。

支援的 IPv4 範圍

Cloud Run 支援下列子網路 IPv4 範圍:

  • RFC 1918
    • 10.0.0.0/8
    • 172.16.0.0/12
    • 192.168.0.0/16
  • RFC 6598
    • 100.64.0.0/10
  • E 級
    • 240.0.0.0/4

設定 IAM 權限

請使用下列其中一種方法,確保 Cloud Run 可以存取虛擬私有雲網路:

  • Cloud Run 服務代理程式角色:根據預設,Cloud Run 服務代理程式具有包含必要權限的 Cloud Run 服務代理程式角色 (roles/run.serviceAgent)

  • 自訂權限:如要更精細地控管,請在專案中授予 Cloud Run 服務代理下列額外權限:

    • compute.networks.get
    • compute.subnetworks.get
    • 專案或特定子網路的 compute.subnetworks.use 權限
    • compute.addresses.get
    • compute.addresses.list
    • compute.addresses.create (僅適用於具有外部 IPv6 的雙重堆疊子網路)
    • compute.addresses.delete (僅適用於具有外部 IPv6 的雙重堆疊子網路)
    • compute.addresses.createInternal
    • compute.addresses.deleteInternal
    • compute.regionOperations.get
  • Compute Network User 角色:如果您未使用預設的 Cloud Run Service Agent 角色或自訂權限,請將 Compute Network User 角色 (roles/compute.networkUser) 授予 Cloud Run Service Agent 服務帳戶。如果子網路使用外部 IPv6,也需要Compute Public IP Admin 角色 (roles/compute.publicIpAdmin)

    舉例來說,如要授予 Compute 網路使用者角色,請執行下列指令:

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member "serviceAccount:service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com" \
    --role "roles/compute.networkUser"

    更改下列內容:

    • PROJECT_ID:專案的 ID。
    • PROJECT_NUMBER:您部署 Cloud Run 資源的專案編號。

將 Cloud Run 資源連線至虛擬私有雲網路

請根據您擁有的 Cloud Run 資源,參閱下列其中一個章節的說明:

將服務連線至虛擬私有雲網路

透過直連虛擬私有雲輸出流量,Cloud Run 服務可將流量傳送至虛擬私有雲網路,不必使用無伺服器 VPC 存取連接器。網路費用會隨著服務本身調度率降至零。您也可以直接在 Cloud Run 服務修訂版本中新增網路標記,以實現更精細的網路安全,例如套用 VPC 防火牆規則

您可以使用Google Cloud 控制台、Google Cloud CLI、YAML 或 Terraform,為服務設定直連虛擬私有雲輸出流量。

控制台

  1. 前往 Cloud Run

  2. 如要設定要部署的新服務,請按一下「Create Service」(建立服務)。如要設定及部署現有服務,請按一下該服務,然後點選「編輯及部署新的修訂版本」

  3. 如要設定新服務,請視需要填寫初始服務設定頁面,然後按一下「Containers, Networking, Security」(容器、網路、安全性) 展開服務設定頁面。

  4. 按一下 [網路] 分頁標籤。

  5. 按一下「連線至虛擬私有雲,以傳出流量」

  6. 按一下「直接將流量傳送至虛擬私有雲」

  7. 在「Network」(網路) 欄位中,選取要傳送流量的虛擬私有雲網路。

  8. 在「Subnet」(子網路) 欄位中,選取服務接收 IP 位址的子網路。您可以在同一個子網路上部署多項服務。

  9. 選用:輸入要與服務建立關聯的網路標記名稱。網路標記是在修訂版本層級指定。每個服務修訂版本可以有不同的網路標記,例如 network-tag-2

  10. 在「流量轉送」中,選取下列其中一個選項:

    • 僅將傳至私人 IP 的要求轉送至虛擬私有雲:僅透過虛擬私有雲網路將流量傳送至內部位址。
    • 將所有流量轉送至虛擬私有雲,透過虛擬私有雲網路傳送所有輸出流量。
  11. 按一下 [Create] (建立) 或 [Deploy] (部署)

  12. 如要確認服務是否位於虛擬私有雲網路中,請點選服務,然後按一下「網路」分頁標籤。網路和子網路會列在「VPC」資訊卡中。

    現在,您可以根據防火牆規則,從 Cloud Run 服務傳送要求至虛擬私有雲網路上的任何資源。

gcloud

服務

如要透過 Google Cloud CLI 部署不含連接器的 Cloud Run 服務,請按照下列步驟操作:

  1. gcloud 元件更新到最新版本:

    gcloud components update
  2. 確認已為專案啟用 Compute Engine API:

    gcloud services enable compute.googleapis.com
    
  3. 執行下列指令,部署 Cloud Run 服務:

    gcloud run deploy SERVICE_NAME \
        --image=IMAGE_URL \
        --network=NETWORK \
        --subnet=SUBNET \
        --network-tags=NETWORK_TAG_NAMES \
        --vpc-egress=EGRESS_SETTING \
        --region=REGION

    更改項目:

    • SERVICE_NAME 改為您的 Cloud Run 服務名稱。
    • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • NETWORK 替換為您的虛擬私有雲端網路名稱。指定虛擬私有雲網路或子網路,或兩者皆指定。如果您只指定網路,子網路會使用與網路相同的名稱。
    • SUBNET 替換為子網路名稱。指定虛擬私有雲網路或子網路,或兩者皆指定。如果您只指定網路,子網路會使用與網路相同的名稱。您可以在同一個子網路上部署或執行多個服務或工作。
    • 選用:NETWORK_TAG_NAMES,以半形逗號分隔您要與服務建立關聯的網路標記名稱。如果是服務,網路標記是在修訂版本層級指定。每個服務修訂版本可以有不同的網路標記,例如 network-tag-2
    • EGRESS_SETTING,並提供輸出設定值
      • all-traffic:透過虛擬私有雲網路傳送所有輸出流量。
      • private-ranges-only:只透過虛擬私有雲網路將流量傳送至內部位址。
    • REGION 改為服務的地區。
  4. 如要確認服務位於虛擬私有雲網路上,請執行下列指令:

    gcloud run services describe SERVICE_NAME \
        --region=REGION

    更改項目:

    • SERVICE_NAME 改為您的服務名稱。
    • REGION 替換為您在上一個步驟中指定的服務區域。

    輸出內容應包含網路、子網路和輸出設定的名稱,例如:

    VPC access:
      Network:       default
      Subnet:        subnet
      Egress:        private-ranges-only
    

現在,您可以根據防火牆規則,從 Cloud Run 服務傳送要求至虛擬私有雲網路上的任何資源。

函式

如要透過 Google Cloud CLI 部署沒有連接器的 Cloud Run 函式,請按照下列步驟操作:

  1. gcloud 元件更新到最新版本:

    gcloud components update
  2. 確認已為專案啟用 Compute Engine API:

    gcloud services enable compute.googleapis.com
    
  3. 執行下列指令,部署 Cloud Run 函式:

    gcloud run deploy FUNCTION_NAME \
        --image=IMAGE_URL \
        --network=NETWORK \
        --subnet=SUBNET \
        --network-tags=NETWORK_TAG_NAMES \
        --vpc-egress=EGRESS_SETTING \
        --region=REGION \
        --function=FUNCTION_ENTRYPOINT

    更改項目:

    • FUNCTION_NAME 替換為 Cloud Run 函式名稱。
    • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • NETWORK 替換為您的虛擬私有雲端網路名稱。指定虛擬私有雲網路或子網路,或兩者皆指定。如果您只指定網路,子網路會使用與網路相同的名稱。
    • SUBNET 替換為子網路名稱。指定虛擬私有雲網路或子網路,或兩者皆指定。如果您只指定網路,子網路會使用與網路相同的名稱。您可以在同一個子網路上部署或執行多個服務或工作。
    • 選用:NETWORK_TAG_NAMES,以半形逗號分隔您要與函式建立關聯的網路標記名稱。如果是函式,則是在修訂版本層級指定網路代碼。每個修訂版本可以有不同的網路標記,例如 network-tag-2
    • EGRESS_SETTING,並提供輸出設定值
      • all-traffic:透過虛擬私有雲網路傳送所有輸出流量。
      • private-ranges-only:只透過虛擬私有雲網路將流量傳送至內部位址。
    • REGION 替換成函式的區域。
    • 選用:FUNCTION_ENTRYPOINT,並在原始碼中指定函式的進入點。這是 Cloud Run 在函式執行時執行的程式碼。此旗標的值必須是原始碼中既有的函式名稱或完整類別名稱。
  4. 如要確認函式位於虛擬私有雲網路中,請執行下列指令:

    gcloud run services describe FUNCTION_NAME \
        --region=REGION

    更改項目:

    • FUNCTION_NAME 替換成函式名稱。
    • REGION,並在上一個步驟中指定函式區域。

    輸出內容應包含網路、子網路和輸出設定的名稱,例如:

    VPC access:
      Network:       default
      Subnet:        subnet
      Egress:        private-ranges-only
    

現在,您可以根據防火牆規則,從 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 替換為您的虛擬私有雲端網路名稱。指定虛擬私有雲網路或子網路,或兩者皆指定。如果您只指定網路,子網路會使用與網路相同的名稱。
    • 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"]
          }
        }
      }
    }
    

如要允許未經驗證的存取服務,可以公開服務

將作業連線至虛擬私有雲網路

透過直連虛擬私有雲輸出,Cloud Run 作業可將流量傳送至虛擬私有雲網路,而不需無伺服器 VPC 存取連接器。您也可以直接在 Cloud Run 作業中新增網路標記,進一步提升網路安全性,例如套用 VPC 防火牆規則

您可以使用Google Cloud 控制台、Google Cloud CLI 或 YAML,為工作設定直連虛擬私有雲輸出。

控制台

  1. 前往 Cloud Run

  2. 如要設定新工作,請按一下「Jobs」分頁,然後視需要填寫初始工作設定頁面。如要設定現有工作,請按一下該工作,然後按一下「Edit」(編輯)。

  3. 點選「Container, Variables & Secrets, Connections, Security」(容器、變數和密鑰、連線、安全性),展開工作屬性頁面。

  4. 按一下「連結」分頁標籤。

  5. 按一下「連線至虛擬私有雲,以傳出流量」

  6. 按一下「直接將流量傳送至虛擬私有雲」

  7. 在「Network」(網路) 欄位中,選取要傳送流量的虛擬私有雲網路。

  8. 在「Subnet」(子網路) 欄位中,選取工作接收 IP 位址的子網路。您可以在同一個子網路上執行多項工作。

  9. 在「流量轉送」中,選取下列其中一個選項:

    • 僅將傳至私人 IP 的要求轉送至虛擬私有雲:僅透過虛擬私有雲網路將流量傳送至內部位址。
    • 將所有流量轉送至虛擬私有雲,透過虛擬私有雲網路傳送所有輸出流量。
  10. 選用:輸入要與服務建立關聯的網路標記名稱。網路標記是在修訂版本層級指定。每個服務修訂版本可以有不同的網路標記,例如 network-tag-2

  11. 選用:輸入要與工作建立關聯的網路標記名稱。對於工作,網路標記是在執行層級指定。每次執行作業時,可以有不同的網路標記,例如 network-tag-2

  12. 按一下「建立」或「更新」

  13. 如要確認工作是否位於虛擬私有雲網路上,請按一下工作,然後按一下「Configuration」(設定) 分頁標籤。網路和子網路會列在「VPC」資訊卡中。

    現在您可以執行 Cloud Run 作業,並從作業將要求傳送至虛擬私有雲網路上的任何資源,但須遵守防火牆規則。

gcloud

如要透過 Google Cloud CLI 建立不含連接器的 Cloud Run 作業,請執行下列操作:

  1. gcloud 元件更新到最新版本:

    gcloud components update
  2. 確認已為專案啟用 Compute Engine API:

    gcloud services enable compute.googleapis.com
    
  3. 使用下列指令建立 Cloud Run 工作:

    gcloud run jobs create JOB_NAME \
    --image=IMAGE_URL \
    --network=NETWORK \
    --subnet=SUBNET \
    --network-tags=NETWORK_TAG_NAMES \
    --vpc-egress=EGRESS_SETTING \
    --region=REGION

    更改項目:

    • JOB_NAME 替換為 Cloud Run 作業名稱。
    • IMAGE_URL容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/job:latest
    • NETWORK 替換為您的虛擬私有雲端網路名稱。指定虛擬私有雲網路或子網路,或同時指定兩者。如果只指定網路,子網路會使用與網路相同的名稱。
    • SUBNET 替換為子網路名稱。指定虛擬私有雲網路或子網路,或兩者皆指定。如果您只指定網路,子網路會使用與網路相同的名稱。您可以在同一個子網路上部署或執行多個服務或工作。
    • 選用:NETWORK_TAG_NAMES 搭配要與工作建立關聯的聯播網標記名稱。如果是作業,網路標記是在執行層級指定。每個工作執行作業可以有不同的網路標記,例如 network-tag-2
    • EGRESS_SETTING,並提供輸出設定值
      • all-traffic:透過虛擬私有雲網路傳送所有輸出流量。
      • private-ranges-only:只透過虛擬私有雲網路將流量傳送至內部位址。
    • REGION 替換為工作所在的區域。
  4. 如要確認作業是否位於虛擬私有雲網路中,請執行下列指令:

    gcloud run jobs describe JOB_NAME \
      --region=REGION
      

    更改項目:

    • JOB_NAME 改為您的工作名稱。
    • REGION,並在上一個步驟中指定作業的區域。

    輸出內容應包含網路和子網路的名稱,例如:

    VPC network:
      Network:       default
      Subnet:        default
    

現在您可以執行 Cloud Run 作業,並從作業將要求傳送至虛擬私有雲網路上的任何資源,但須遵守防火牆規則。

YAML

  1. 如要建立新工作,請略過這個步驟。 如要更新現有工作,請下載其 YAML 設定

    gcloud run jobs describe JOB_NAME --format export > job.yaml
  2. 更新下列屬性:

    apiVersion: run.googleapis.com/v1
      kind: Job
      metadata:
        name: JOB_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

    更改項目:

    • JOB_NAME 替換為 Cloud Run 作業名稱。工作名稱不得超過 49 個半形字元,且每個區域和專案的工作名稱不得重複。
    • REGION,必須與子網路的地區相符。
    • NETWORK 替換為您的虛擬私有雲端網路名稱。指定虛擬私有雲網路或子網路,或兩者皆指定。如果您只指定網路,子網路會使用與網路相同的名稱。
    • SUBNET 替換為子網路名稱。指定虛擬私有雲網路或子網路,或兩者皆指定。如果您只指定網路,子網路會使用與網路相同的名稱。您可以在同一個子網路上部署或執行多個服務或工作。
    • 選用:NETWORK_TAG_NAMES 搭配要與工作建立關聯的聯播網標記名稱。如果是作業,網路標記是在執行層級指定。每個工作執行作業可以有不同的網路標記,例如 network-tag-2
    • EGRESS_SETTING,並提供輸出設定值
      • all-traffic:透過虛擬私有雲網路傳送所有輸出流量。
      • private-ranges-only:只透過虛擬私有雲網路將流量傳送至內部位址。
    • IMAGE 改為作業容器映像檔的網址。
  3. 使用下列指令建立或更新作業:

    gcloud run jobs replace job.yaml

將 worker 集區連線至虛擬私有雲網路

透過直連虛擬私有雲,Cloud Run 工作站集區可與 VPC 傳送或接收流量,且每個工作站集區執行個體都會在設定的網路和子網路上收到私人 IP 位址。

與服務或工作不同,工作站集區的直連虛擬私有雲連線能力可允許輸出和輸入。也就是說,工作站集區執行個體可以存取虛擬私有雲網路上的資源,而虛擬私有雲網路上的資源也可以使用 IP 位址存取工作站集區執行個體。瞭解執行個體如何使用中繼資料伺服器擷取私人 IP 位址

您也可以直接在 Cloud Run 工作站集區修訂版本上新增網路標記,並搭配直接虛擬私有雲輸出功能,進一步控管網路安全,例如套用 虛擬私有雲防火牆規則

您可以使用 Google Cloud 控制台、Google Cloud CLI 或 YAML 設定直連虛擬私有雲輸出。

控制台

  1. 前往 Cloud Run

  2. 從選單中選取「工作站集區」,然後按一下「部署容器」,設定新的工作站集區。如要設定現有 worker 集區,請按一下該集區,然後按一下「Edit and deploy new revision」(編輯並部署新修訂版本)

  3. 如要設定新的工作站集區,請填寫初始工作站集區頁面,然後按一下「Container(s), Volumes, Networking, Security」展開工作站集區設定頁面。

  4. 按一下 [網路] 分頁標籤。

  5. 選取「連線至虛擬私有雲」

  6. 按一下 [Create] (建立) 或 [Deploy] (部署)

    現在,您可以根據防火牆規則,從 Cloud Run worker 集區將要求傳送至虛擬私有雲網路上的任何資源。

gcloud

如要透過 Google Cloud CLI 部署 Cloud Run worker 集區,但不使用連接器,請按照下列步驟操作:

  1. gcloud 元件更新到最新版本:

    gcloud components update
  2. 確認已為專案啟用 Compute Engine API:

    gcloud services enable compute.googleapis.com
    
  3. 執行下列指令,部署 Cloud Run 工作站集區:

    gcloud run worker-pools deploy WORKER_POOL \
        --image=IMAGE_URL \
        --network=NETWORK \
        --subnet=SUBNET \
        --network-tags=NETWORK_TAG_NAMES \
        --vpc-egress=EGRESS_SETTING \
        --region=REGION

    更改項目:

    • WORKER_POOL 改成 Cloud Run 工作站集區的名稱。工作人員集區名稱不得超過 49 個字元,且每個區域和專案都必須使用不重複的名稱,也不得與專案中現有的服務名稱相同。如果工作站集區尚未存在,這項指令會在部署期間建立工作站集區。您可以完全省略這個參數,這樣系統會提示您輸入 worker 集區名稱。
    • IMAGE_URL:包含工作站集區的容器映像檔參照,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest
    • NETWORK 替換為您的虛擬私有雲端網路名稱。指定虛擬私有雲網路或子網路,或兩者皆指定。如果您只指定網路,子網路會使用與網路相同的名稱。
    • SUBNET 替換為子網路名稱。指定虛擬私有雲網路或子網路,或兩者皆指定。如果您只指定網路,子網路會使用與網路相同的名稱。您可以在同一個子網路上部署或執行多個服務或工作。
    • 選用 (僅限直連虛擬私有雲輸出流量):NETWORK_TAG_NAMES,以半形逗號分隔要與工作站集區建立關聯的網路標記名稱。如果是服務,網路標記是在修訂版本層級指定。每個工作站集區修訂版本可以有不同的網路標記,例如 network-tag-2
    • EGRESS_SETTING,並提供輸出設定值
      • all-traffic:透過虛擬私有雲網路傳送所有輸出流量。
      • private-ranges-only:只透過虛擬私有雲網路將流量傳送至內部位址。
    • REGION,並指定工作站集區的區域。
  4. 如要確認工作站集區位於虛擬私有雲網路中,請執行下列指令:

    gcloud run worker-pools describe WORKER_POOL \
        --region=REGION

    更改項目:

    • WORKER_POOL 替換為工作站集區的名稱。
    • REGION,其中包含您在上一個步驟中指定的工作站集區區域。

    輸出內容應包含網路、子網路和輸出設定的名稱,例如:

    VPC access:
      Network:       default
      Subnet:        subnet
      Egress:        private-ranges-only
    

現在,您可以根據防火牆規則,從 Cloud Run worker 集區將要求傳送至虛擬私有雲網路上的任何資源。

YAML

  1. 如要建立新的工作站集區,請略過這個步驟。 如要更新現有工作站集區,請下載 YAML 設定

    gcloud run worker-pools describe WORKER_POOL --format export > worker-pool.yaml
  2. 更新下列屬性:

    apiVersion: run.googleapis.com/v1
      kind: WorkerPool
      metadata:
        name: WORKER_POOL
        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_URL

    更改下列內容:

    • WORKER_POOL:Cloud Run 工作站集區的名稱。
    • REGION:Cloud Run worker 集區的區域,必須與子網路的區域相符。
    • NETWORK:虛擬私有雲網路的名稱。指定虛擬私有雲網路或子網路,或兩者皆指定。如果您只指定網路,子網路會使用與網路相同的名稱。
    • SUBNET 替換為子網路名稱。指定虛擬私有雲網路或子網路,或兩者皆指定。如果您只指定網路,子網路會使用與網路相同的名稱。您可以在同一個子網路上部署或執行多個服務或工作。
    • 選用 (僅限直連虛擬私有雲輸出):NETWORK_TAG_NAMES:您要與工作者集區建立關聯的網路標記名稱。如果是工作站集區,網路標記是在修訂版本層級指定。每個工作站集區修訂版本可以有不同的網路標記,例如 network-tag-2
    • EGRESS_SETTING輸出設定值
      • all-traffic:透過虛擬私有雲網路傳送所有輸出流量。
      • private-ranges-only:只透過虛擬私有雲網路將流量傳送至內部位址。
    • IMAGE_URL:包含工作站集區的容器映像檔參照,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest

    您也可以指定更多設定,例如環境變數或記憶體限制。

  3. 使用下列指令建立或更新工作站集區:

    gcloud run worker-pools replace worker-pool.yaml

    如果存在 worker-pool.yaml 檔案,gcloud run worker-pools replace 指令預設會使用該檔案。

管理員可以設定 run.allowedVPCEgress 組織政策,限制開發人員可選取的輸出設定。

使用中繼資料伺服器擷取私人 IP 位址

您可以存取虛擬私有雲網路中執行個體之間的私人 IP 位址,進行安全的內部通訊。如要從中繼資料伺服器擷取工作站集區執行個體的私有 IP 位址,請在容器內執行下列指令:

  • 如要取得 IPv4 位址,請將要求傳送至中繼資料伺服器的 /computeMetadata/v1/instance/network-interfaces/0/ip 端點:

    curl "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip" -H "Metadata-Flavor: Google"
    
  • 如要取得 IPv6 位址,請使用雙重堆疊子網路建立執行個體,然後向 /computeMetadata/v1/instance/network-interfaces/0/ipv6 端點的中繼資料伺服器傳送要求:

    curl "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ipv6" -H "Metadata-Flavor: Google"
    
  • 如要確認 worker 集區執行個體已連結至虛擬私有雲網路,請查詢下列網路介面中繼資料路徑:

    # Verify the existence of the network interface directory
    
    curl "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/" -H "Metadata-Flavor: Google"
    
    # Verify the existence of the first network interface
    
    curl "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/" -H "Metadata-Flavor: Google"
    

處理中繼資料伺服器錯誤

在下列情況下,中繼資料伺服器會傳回 404: Not Found 錯誤:

  • 如果您在僅支援 IPv4 的子網路上查詢 IPv6 位址。
  • 如果未將 worker 集區執行個體連線至虛擬私有雲網路,在這種情況下,中繼資料伺服器會針對下列路徑傳回錯誤:

    • /computeMetadata/v1/instance/network-interfaces
    • /computeMetadata/v1/instance/network-interfaces/0
    • /computeMetadata/v1/instance/network-interfaces/0/ip
    • /computeMetadata/v1/instance/network-interfaces/0/ipv6

設定雙重堆疊 (IPv4 和 IPv6)

如要在 Cloud Run 資源上新增具有 IPv6 範圍的雙重堆疊子網路,請參閱「設定雙重堆疊」。

使用防火牆規則限制存取權

使用 VPC 防火牆規則,限制對虛擬私有雲網路中資源的存取權。請使用下列任一策略新增這些限制:

  • 使用子網路的 IP 範圍,建立參照服務工作的輸入防火牆規則。
  • 建立參照服務工作的輸出防火牆規則。

    在輸出防火牆規則中,使用連結的服務帳戶服務身分、子網路的 IP 範圍或相關聯的網路標記,參照您的服務或工作。

輸出網路標記

在輸出防火牆規則中使用網路標記,增加一層網路安全防護。

控制台

如要將網路標記與服務或工作建立關聯,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Cloud Run」頁面。

    前往 Cloud Run

  2. 按一下要與網路標記建立關聯的服務或工作,然後按一下服務的「Edit and deploy new revision」(編輯並部署新修訂版本) 或工作的「Edit」(編輯)

  3. 按一下服務的「網路」分頁標籤,或是作業的「連線」分頁標籤。

  4. 確認已選取「連線至虛擬私有雲,以傳出流量」和「直接將流量傳送至虛擬私有雲」

  5. 在「Subnet」(子網路) 欄位中,選取服務接收 IP 位址的子網路。您可以在同一個子網路上部署或執行多項服務或工作。

  6. 在「Network tags」(網路標記) 欄位中,輸入要與服務或工作建立關聯的網路標記名稱。

  7. 按一下「部署」或「更新」

對於服務,每個服務修訂版本可以有不同的網路標記集,因為網路標記是在修訂版本層級指定。對於工作,工作執行作業具有與建立工作執行作業時相同的工作網路標記。

gcloud

如要將網路標記與服務或工作建立關聯,請使用 gcloud run deploy 指令:

gcloud run deploy SERVICE_JOB_NAME \
    --image=IMAGE_URL \
    --network=NETWORK \
    --subnet=SUBNET \
    --network-tags=NETWORK_TAG_NAMES \
    --region=REGION

更改下列內容:

  • SERVICE_JOB_NAME 改為您的服務或工作名稱。
  • IMAGE_URL 服務或職缺的圖片網址。
  • NETWORK 替換為您的虛擬私有雲網路名稱。
  • SUBNET 替換為子網路名稱。指定虛擬私有雲網路或子網路,或兩者皆指定。如果您只指定網路,子網路會使用與網路相同的名稱。您可以在同一個子網路上部署或執行多個服務或工作。
  • NETWORK_TAG_NAMES 替換為網路標記名稱,或以半形逗號分隔的網路標記清單。
  • REGION 改為您的區域名稱。

對於服務,每個服務修訂版本可以有不同的網路標記集,因為網路標記是在修訂版本層級指定。對於工作,工作執行作業具有與建立工作執行作業時相同的工作網路標記。

取消連結 Cloud Run 資源

請根據您擁有的 Cloud Run 資源,參閱下列其中一個章節的說明:

取消連結服務

控制台

  • 如要從虛擬私有雲網路移除服務,請按照下列步驟操作:

    1. 前往 Cloud Run

    2. 按一下要移除的服務,然後點選「Edit and deploy new revision」(編輯及部署新的修訂版本)

    3. 按一下 [網路] 分頁標籤。

    4. 清除「連線至虛擬私有雲,以傳出流量」

    5. 點選「Deploy」(部署)

    6. 如要確認服務已不再使用虛擬私有雲網路,請按一下「網路」分頁標籤。網路和子網路不再列於「VPC」資訊卡中。

  • 如要只移除網路標記,但保留服務與虛擬私有雲網路的連線:

    1. 按一下含有要移除網路代碼的服務,然後點選「編輯並部署新修訂版本」

    2. 按一下 [網路] 分頁標籤。

    3. 清除您不想再與服務建立關聯的網路標記名稱。

    4. 點選「Deploy」(部署)

gcloud

  • 如要從虛擬私有雲網路移除服務,請執行下列指令:

    gcloud run services update SERVICE_NAME --region=REGION \
    --clear-network
  • 如要只移除網路標記,但保留服務與虛擬私有雲網路的連線,請執行下列指令:

    gcloud run services update SERVICE_NAME --region=REGION \
    --clear-network-tags

    更改下列內容:

    • SERVICE_NAME:Cloud Run 服務的名稱。
    • REGION:Cloud Run 服務的區域。

YAML

  • 如要從虛擬私有雲網路移除服務,請按照下列步驟操作:

    1. 下載服務的 YAML 設定

      gcloud run services describe SERVICE_NAME --format export > service.yaml
    2. service.yaml 檔案中移除下列內容:

      run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET","tags":"NETWORK_TAG_NAMES"}]'

      地點

      • NETWORK:虛擬私有雲網路的名稱。
      • SUBNET:子網路名稱。
      • 選用:NETWORK_TAG_NAMES:網路標記的名稱 (如已將標記與服務建立關聯)。
    3. 執行下列指令來部署服務修訂版本:

      gcloud run services replace service.yaml
  • 如要只移除網路標記,但保留服務與虛擬私有雲網路的連線:

    1. 下載服務的 YAML 設定

      gcloud run services describe SERVICE_NAME --format export > service.yaml
    2. service.yaml 檔案的內容中移除 tags 變數,保留 networksubnetwork 變數,如下列範例所示:

      run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET"}]'

      地點

      • NETWORK:虛擬私有雲網路的名稱。
      • SUBNET:子網路名稱。
    3. 執行下列指令來部署服務修訂版本:

      gcloud run services replace service.yaml

取消連結工作

控制台

  • 如要從虛擬私有雲網路移除工作:

    1. 前往 Cloud Run

    2. 按一下要移除的工作,然後點選「編輯及部署新的修訂版本」

    3. 按一下「連結」分頁標籤。

    4. 清除「連線至虛擬私有雲,以傳出流量」

    5. 按一下「Update」

    6. 如要確認工作不再位於 VPC 網路中,請按一下「Configuration」(設定) 分頁標籤。網路和子網路不再列於「VPC」資訊卡中。

  • 如要僅移除網路標記,但保留工作與虛擬私有雲網路的連線:

    1. 按一下含有要移除網路標記的工作,然後按一下「編輯並部署新修訂版本」

    2. 按一下「連結」分頁標籤。

    3. 清除您不想再與工作建立關聯的網路標記名稱。

    4. 按一下「Update」

gcloud

  • 如要從虛擬私有雲網路移除作業,請執行下列指令:

    gcloud run jobs update JOB_NAME --region=REGION \
      --clear-network
      
  • 如要只移除網路標記,但讓作業繼續連線至虛擬私有雲網路,請執行下列指令:

    gcloud run jobs update JOB_NAME --region=REGION \
      --clear-network-tags
      

    更改下列內容:

    • JOB_NAME:Cloud Run 工作名稱。
    • REGION:Cloud Run 工作的區域。

YAML

  • 如要從虛擬私有雲網路移除工作:

    1. 下載作業的 YAML 設定

      gcloud run jobs describe JOB_NAME --format export > job.yaml
    2. job.yaml 檔案中移除下列內容:

      run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET","tags":"NETWORK_TAG_NAMES"}]'

      更改下列內容:

      • NETWORK:虛擬私有雲網路的名稱。
      • SUBNET:子網路名稱。
      • 選用:NETWORK_TAG_NAMES,其中包含您與工作相關聯的聯播網代碼名稱。
    3. 執行下列指令來更新作業:

      gcloud run jobs replace job.yaml
  • 如要僅移除網路標記,但保留工作與虛擬私有雲網路的連線:

    1. 下載作業的 YAML 設定

      gcloud run jobs describe JOB_NAME --format export > job.yaml
    2. job.yaml 檔案的內容中移除 tags 變數,保留 networksubnetwork 變數,如下列範例所示:

      run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET"}]'

      更改下列內容:

      • NETWORK:虛擬私有雲網路的名稱。
      • SUBNET:子網路名稱。
    3. 執行下列指令來更新作業:

      gcloud run jobs replace job.yaml

中斷工作站集區連線

gcloud

  • 如要從虛擬私有雲網路移除工作站集區,請執行下列指令:

    gcloud run worker-pools update WORKER_POOL --region=REGION \
    --clear-network
  • 如要只移除網路標記,但仍將工作站集區連線至虛擬私有雲網路,請執行下列指令:

    gcloud run worker-pools update WORKER_POOL --region=REGION \
    --clear-network-tags

    更改下列內容:

    • WORKER_POOL:Cloud Run 工作站集區的名稱。
    • REGION:Cloud Run worker 集區的區域。

疑難排解

無法刪除子網路

如要刪除子網路,請先刪除或重新部署使用該子網路的所有資源。如果 Cloud Run 使用子網路,請先將 Cloud Run服務作業與虛擬私有雲網路中斷連線,或將其移至其他子網路,再刪除子網路。

直連虛擬私有雲輸出子網路的 IPv4 位址用盡

嘗試部署時發生下列錯誤:

Instance failed to start because of insufficient free IP addresses in the
subnetwork SUBNET_ID when attempting to create an address in the
subnetwork. Please consider moving to a subnetwork with more available IP
addresses.

如果虛擬私有雲網路的子網路用盡 IPv4 位址,Cloud Logging 會記錄這項事件。發生這種情況時,Cloud Run 無法再啟動任何服務執行個體或工作,直到有更多 IPv4 位址可用為止。

如要解決這個問題,請按照「IP 位址耗盡策略」操作。

查看分配的 IP 位址

您無法手動刪除保留的地址。嘗試刪除為 Cloud Run 分配的 IP 位址時,會發生下列錯誤:

The address resource 'ADDRESS_NAME' is already being used by
'//serverless.googleapis.com/projects/PROJECT_ID/locations/REGION/addressReservations/ADDRESS_NAME'

如要查看 Cloud Run 分配的 IP 位址,請前往Google Cloud 控制台的「IP 位址」頁面,然後找出「使用中」欄設為「無伺服器」的位址。

或者,您也可以從 Google Cloud CLI 執行下列指令:

gcloud compute addresses list --filter="purpose=SERVERLESS"

自訂 MTU 相關問題

如果自訂 MTU 發生問題,請確認您使用 Cloud Run 的預設 MTU 設定