部署 Cloud Run 服務或工作

本文說明如何部署應用程式,包括 Cloud Run 服務和 Cloud Run 工作。

Cloud Deploy 可讓您將以容器為基礎的工作負載,部署至任何 Cloud Run 服務作業。將 Cloud Run 服務部署至 Cloud Run 目標時,系統支援所有 Cloud Deploy 功能,但 Cloud Run 作業不支援初期測試部署。

本文說明部署至 Cloud Run 時需要完成的三項主要設定:

限制

  • 每個目標只能部署一項 Cloud Run 服務或工作。

  • 您無法對 Cloud Run 工作執行Canary 部署

    不過,Cloud Run 服務可以使用初期測試版部署。

  • 如要使用 Cloud Deploy 部署 Cloud Run 函式,您需要修改 CI 工作流程,將函式建構為容器,並以 Cloud Run 服務的形式部署。

事前準備

建立目標設定

您可以在交付管道 YAML 中設定目標,也可以將目標放在個別檔案中。此外,您可以在同一個檔案中設定多個目標。

目標必須與發布管道位於相同專案和區域。但只要服務帳戶有權存取這些專案,目標部署的服務或工作可以位於不同專案和區域。

在目標定義中,建立 run 節,找出要建立 Cloud Run 服務的位置。

在目標定義中指定 Cloud Run 服務或作業的語法如下:

run:
 location: projects/[project_name]/locations/[region_name]

這項資源 ID 使用下列元素:

  • [project_name] 是 Google Cloud 專案的名稱,您將在該專案中建立 Cloud Run 服務或工作。

    請為每個目標執行這項操作。建議您為每個 Cloud Run 服務或作業使用不同的專案。如要在同一個專案中執行多項服務或工作,您需要在 skaffold.yaml 設定檔中使用 Skaffold 設定檔

  • [region_name] 是要建立服務或工作的區域。服務或工作可位於Cloud Run 支援的任何區域

以下是目標設定範例,定義要建立的 Cloud Run 服務或作業:

      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
       name: dev
      description: development service
      run:
       location: projects/my-app/locations/us-central1

您可以在 Cloud Deploy 推送管道定義中定義這個目標,也可以另外定義。無論採用哪種方式,您都必須註冊目標,才能建立版本來部署 Cloud Run 服務或工作。

建立 Skaffold 設定

以下是 Cloud Run 部署作業範例 skaffold.yaml 檔案:

apiVersion: skaffold/v4beta7
kind: Config
metadata: 
  name: cloud-run-application
manifests:
  rawYaml:
  - service.yaml
deploy:
  cloudrun: {}

在這個 skaffold.yaml 檔案中...

  • manifests.rawYaml 提供 Cloud Run 服務定義的名稱。

    在本範例中,service.yaml 是定義 Skaffold 將部署的 Cloud Run 服務的檔案。這個檔案名稱可以是任何名稱,但按照慣例,服務的檔案名稱為 service.yaml,工作的檔案名稱為 job.yaml

  • deploy 節會指定資訊清單的部署方式,具體來說就是專案和位置。「deploy」是必填欄位。

    建議您保留空白 {}。Cloud Deploy 會在轉譯期間,根據目標定義中的專案和位置填入這項資訊。

    但如果是本機開發,則可以在這裡提供值。不過,無論這裡是否提供值,Cloud Deploy 一律會使用目標定義中的專案和位置。

建立 Cloud Run 服務定義

如要建立 Cloud Run 服務定義,您可以手動建立,也可以從現有服務複製。本節將介紹這兩種方法。

選項 1:建立新的 Cloud Run service.yaml

service.yaml 會定義 Cloud Run 服務。建立版本時,Skaffold 會使用這項定義部署服務。

以下是簡化的範例:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
 name: [SERVICE_NAME]
spec:
 template:
  spec:
   containers:
   - image: [IMAGE_PATH]

其中:

  • [SERVICE_NAME] 是這個 Cloud Run 服務的名稱。

  • [IMAGE_PATH] 會指向您要透過這項服務部署的容器映像檔。

方法 2:使用 Google Cloud 控制台從現有服務複製 service.yaml

您可以透過 Google Cloud 控制台建立服務或使用現有服務,然後從中複製 service.yaml

如要使用 Google Cloud CLI 取得 service.yaml,請按照下列步驟操作:

gcloud run services describe [service_name] --format=export

如要從 service.yaml 取得 Google Cloud 控制台:

  1. 前往 Google Cloud 控制台的 Cloud Run 服務頁面。

  2. 選取要使用的現有服務定義。

您也可以建立新的,然後選取。選取服務後,系統會顯示「服務詳細資料」頁面:

服務詳細資料頁面
Google Cloud 控制台,顯示 YAML 分頁

  1. 選取「YAML」YAML分頁標籤。

  2. 按一下「編輯」,然後將 YAML 的內容複製到檔案系統中名為 service.yaml 的新檔案,這樣 Skaffold 就能在您建立版本時使用該檔案。

建立 Cloud Run 工作定義

如要部署 Cloud Run 工作定義,您可以手動建立,也可以從現有工作複製。本節將介紹這兩種方法。

請注意,Cloud Deploy 部署作業不一定會執行工作。這與服務不同,服務是指部署後執行的應用程式。工作呼叫方式取決於工作本身。

選項 1:建立新的 Cloud Run job.yaml

job.yaml 會定義 Cloud Run 工作。建立版本時,Skaffold 會使用這項定義部署工作。

以下是簡化的範例:

apiVersion: run.googleapis.com/v1
kind: Job
metadata:
 name: [JOB_NAME]
spec:
  template:
  spec:
   containers:
   - image: [IMAGE_PATH]

其中:

  • [JOB_NAME] 是這項 Cloud Run 工作的名稱。

  • [IMAGE_PATH] 會指向您要為這項工作部署的容器映像檔。

方法 2:使用 Google Cloud 控制台從現有作業複製 job.yaml

您可以透過 Google Cloud 主控台建立工作或使用現有工作,然後從中複製 job.yaml

如要使用 Google Cloud CLI 取得 job.yaml,請按照下列步驟操作:

gcloud run jobs describe [job_name] --format=export

如要從 job.yaml 取得 Google Cloud 控制台:

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

  2. 選取要使用的現有工作定義。

您也可以建立新的,然後選取。選取工作後,系統會顯示「工作詳細資料」頁面:

工作詳細資料頁面
Google Cloud 控制台,顯示 YAML 分頁標籤

  1. 選取「YAML」YAML分頁標籤。

  2. 按一下「編輯」,然後將 YAML 的內容複製到檔案系統中名為 job.yaml 的新檔案,這樣 Skaffold 就能在您建立版本時使用該檔案。

全面整合使用

您現在已擁有 Cloud Run 服務或工作定義、skaffold.yaml設定和 Cloud Deploy 目標定義,並將目標註冊為 Cloud Deploy 資源,因此可以叫用推送管道,建立發布版本並透過管道中定義的目標進度逐步進行。

快速入門導覽課程「使用 Cloud Deploy 將應用程式部署至 Cloud Run」會實際示範上述所有步驟。

不同修訂版本的服務行為

重新部署服務時,新修訂版本會以新部署的 service.yaml 為基礎。除非新部署的 YAML 相同,否則系統不會保留先前的修訂版本。舉例來說,如果先前的修訂版本中有設定或標籤,但新的 YAML 中沒有,則新的修訂版本就不會包含這些設定或標籤。

觸發 Cloud Run 工作

部署工作後,您可以按照 Cloud Run 說明文件中的說明觸發工作。

在多個專案中部署 Cloud Run 服務和工作

如要部署不同專案中的服務或工作,執行服務帳戶必須有權存取定義這些服務或工作的專案。

詳情請參閱「Cloud Deploy 執行服務帳戶」和「Identity and Access Management 角色和權限」。

部署 Cloud Run 函式

每次部署函式時,Cloud Run functions 都會建構原始碼。因此,管道中的每個目標執行階段可能會取得略有不同的構件。這與 Cloud Deploy 的最佳做法背道而馳。建議您改為直接使用 Cloud Run 服務。這可讓您建構單一構件,並在各個環境中升級。

  1. 在 Cloud Run 函式的 service.yaml 中進行檢查。

    您可以執行下列指令來取得這項資訊:

    gcloud run services describe FUNCTION_NAME \
    --format=export \
    --region=REGION \
    --project=PROJECT
    
  2. 移除下列註解 (如有):

    • run.googleapis.com/build-base-image
    • run.googleapis.com/build-name
    • run.googleapis.com/build-source-location
    • run.googleapis.com/build-enable-automatic-updates
  3. spec.spec.containers.image 中的值替換為 IMAGE_TAG

  4. 建立推送管道和目標,並將 Cloud Run 服務設為目標。

  5. 在 CI 程序中,將建構步驟與部署步驟分開。請改用下列步驟,不要使用 Google Cloud CLI 部署函式:

    1. 使用 Cloud Build 將函式建構 到容器中:

      gcloud builds submit --pack image=REGION-docker.pkg.dev/PROJECT/cloud-run-source-deploy/IMAGE_NAME \
      --project=PROJECT \
      --region=REGION
      
    2. 使用 Cloud Deploy 建立版本

      gcloud deploy releases create RELEASE_NAME \
      --project=PROJECT \
      --region=REGION \
      --delivery-pipeline=DELIVERY_PIPELINE
      --image=IMAGE_TAG=REGION-docker.pkg.dev/PROJECT/cloud-run-source-deploy/IMAGE_NAME
      

後續步驟