選取服務的執行環境

所有 Cloud Run 執行個體都會經過沙箱處理,沙箱技術和可用功能會因所選執行環境而異。

第一代執行環境以 gVisor 為基礎,具有快速冷啟動時間,並模擬大部分 (但不是全部) 的作業系統呼叫。

第二代執行環境是微型 VM,提供完整的 Linux 相容性,而非系統呼叫模擬。這個執行環境提供下列功能:

  • 提升 CPU 效能
  • 網路效能更快,尤其是在封包遺失的情況下
  • 完全相容於 Linux,包括支援所有系統呼叫、命名空間和 cgroup
  • 支援網路檔案系統

雖然第二代執行環境在持續負載下通常執行速度較快,但部分服務的冷啟動時間比第一代長。

兩種執行環境的價格相同。詳情請參閱 Cloud Run 定價頁面

為 Cloud Run 服務選取執行環境

根據預設,Cloud Run 服務不會指定執行環境,因此 Cloud Run 會根據使用的功能選取執行環境。如果未指定服務的執行環境,Cloud Run 可以選取第一代或第二代環境。

Cloud Run 工作和工作集區只會使用第二代執行環境,且無法變更。

如何選擇執行環境

如有下列任一情況,請使用第一代:

  • Cloud Run 服務的流量突然暴增,需要快速擴充至多個執行個體,或服務對冷啟動時間很敏感。
  • Cloud Run 服務的流量不頻繁,導致系統經常從零開始擴充。
  • 您想使用的記憶體容量小於 512 MiB。 第二代執行環境至少需要 512 MiB 的記憶體。

如果您的 Cloud Run 服務符合下列任一條件,就應使用第二代:

  • 您的服務必須使用 NFS,而這項功能僅適用於第 2 代。
  • 您的服務流量相當穩定,且可容忍冷啟動速度稍慢。
  • 您的服務有耗用大量 CPU 資源的工作負載。
  • 服務可望享有更快的網路效能。
  • 您的服務使用直接虛擬私有雲輸出將流量傳送至虛擬私有雲網路,且需要盡可能提升網路效能。
  • 您的服務需要使用軟體,但由於未實作的系統呼叫,導致軟體無法在第一代中執行。
  • 您的服務需要 Linux cgroup 功能。
  • 您的服務會使用第三方基礎架構保護容器。

必要的角色

如要取得設定及部署 Cloud Run 服務所需的權限,請要求管理員授予您下列 IAM 角色:

如果您要從原始碼部署服務函式,則必須在專案和 Cloud Build 服務帳戶中,獲得額外角色。

如需與 Cloud Run 相關聯的 IAM 角色和權限清單,請參閱「Cloud Run IAM 角色」和「Cloud Run IAM 權限」。如果 Cloud Run 服務與Google Cloud API (例如 Cloud 用戶端程式庫) 介接,請參閱服務身分設定指南。 如要進一步瞭解如何授予角色,請參閱「部署權限」和「管理存取權」。

設定及更新執行環境

變更任何設定都會建立新的修訂版本。除非您明確做出更新,改變這項設定,否則後續的修訂版本也會自動取得這個設定。

Cloud Run 服務的預設值為「未指定」,也就是說,Cloud Run 會選取合適的執行環境。或者,您也可以指定執行環境。如要使用第二代,您必須至少指定 512 MiB 的記憶體

當您建立新服務部署新修訂版本時,可以使用 Google Cloud 控制台、gcloud 指令列或 YAML 檔案設定執行環境:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run:

    前往 Cloud Run

  2. 從 Cloud Run 導覽選單中選取「服務」,然後按一下「部署容器」,設定新服務。如要設定現有服務,請按一下該服務,然後按一下「編輯並部署新修訂版本」

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

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

    圖片

    • 使用選項按鈕選取所需的執行環境。保留「預設」設定,讓 Cloud Run 選取合適的執行環境。
  5. 按一下 [Create] (建立) 或 [Deploy] (部署)

gcloud

您可以使用下列指令,更新特定服務的執行環境

gcloud run services update SERVICE --execution-environment ENVIRONMENT

SERVICE 改為您的服務名稱,並將 ENVIRONMENT 改為所需的執行環境。為第一代指定 gen1 值,為第二代指定 gen2 值。

您也可以在部署期間,使用以下指令設定執行環境:

gcloud run deploy --image IMAGE_URL --execution-environment ENVIRONMENT

更改下列內容:

  • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  • ENVIRONMENT:所需的執行環境。為第一代指定 gen1 值,或為第二代指定 gen2 值。

YAML

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

    gcloud run services describe SERVICE --format export > service.yaml
  2. 設定 run.googleapis.com/execution-environment 註解:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/execution-environment: ENVIRONMENT

    更改下列內容:

    • SERVICE:Cloud Run 服務的名稱。
    • ENVIRONMENT:所選執行環境。 為第一代指定 gen1 值,為第二代指定 gen2 值。

    移除預設行為的 run.googleapis.com/execution-environment 註解。

  3. 使用下列指令建立或更新服務:

    gcloud run services replace service.yaml

Terraform

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

在 Terraform 設定中,將下列項目新增至 google_cloud_run_v2_service 資源:
resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service-execution-environment"
  location = "REGION"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    execution_environment = "ENVIRONMENT"
  }
}

更改下列內容:

  • REGION: Google Cloud 區域。例如:europe-west1
  • ENVIRONMENT:第一代為 EXECUTION_ENVIRONMENT_GEN1,第二代為 EXECUTION_ENVIRONMENT_GEN2

查看執行環境設定

如要查看 Cloud Run 服務目前的執行環境設定:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:

    前往 Cloud Run

  2. 按一下感興趣的服務,開啟「服務詳細資料」頁面。

  3. 按一下「Revisions」(修訂版本) 分頁標籤。

  4. 在右側的詳細資料面板中,「執行環境」設定會列在「容器」分頁下方。

gcloud

  1. 使用下列指令:

    gcloud run services describe SERVICE
  2. 在傳回的設定中找出「執行環境」設定。

安全關機

Cloud Run 執行個體關閉時,會收到 SIGTERM 信號,以便在 10 秒內順利關閉。

處理 SIGTERM 信號

建議容器安裝 SIGTERM 處理常式,尤其是使用以要求為準的計費方式時。

處理 SIGTERM 可讓容器有機會執行必要的清除作業,例如在結束前排清記錄。如果容器未擷取 SIGTERM,系統仍會提供 10 秒執行這些工作,而這 10 秒會計費。

如何檢查容器是否處理 SIGTERM

如要判斷容器是否已安裝 SIGTERM 處理常式,請執行下列操作:

  1. 啟動 Cloud Shell。您可以在說明文件頁面的標題中找到「啟用 Cloud Shell」啟用 Cloud Run 按鈕。您可能需要授權,並等待系統佈建。 或者,啟動獨立工作階段

  2. 在 Cloud Shell 中於本機執行容器:

    docker run IMAGE_URL

    IMAGE_URL 替換為容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG

  3. 在 Cloud Shell 中開啟另一個分頁,然後取得目前 Cloud Shell 工作階段中執行的容器清單:

    docker container ls

    您需要找出指令傳回的容器 ID。

  4. 使用容器 ID 將 SIGTERM 信號傳送至容器

    docker kill -s SIGTERM CONTAINER_ID
  5. 返回叫用 docker run 的分頁,查看容器是否已結束 (停止)。如果 SIGTERM 信號導致容器結束,表示容器正在處理 SIGTERM。

如何處理 SIGTERM

如果容器未處理 SIGTERM,新增 SIGTERM 處理常式的最簡單方法,就是使用 tini 包裝服務。這樣做可讓服務以 tini 的子程序形式執行,而 tini 則會擔任容器初始化程序的角色。如需操作說明,請參閱 Docker 指令

或者,您也可以變更應用程式,直接處理 SIGTERM。

後續步驟