將初期測試版部署至 Cloud Run

本文說明如何設定及使用初期測試版部署作業,透過 Cloud Deploy 將應用程式部署至 Cloud Run (僅限服務,不含工作)。

初期測試部署是指逐步推出應用程式新版本,逐步增加傳送至新版本的流量百分比,同時監控應用程式的效能。這有助於及早發現潛在問題,並盡量減少對使用者的影響。

Cloud Run 的初期測試版部署作業運作方式

使用初期測試版部署策略部署至 Cloud Run 時,Cloud Deploy 會以新修訂版本更新現有服務。新修訂版本會收到指定百分比的流量,舊修訂版本則會繼續接收剩餘流量。隨著時間逐漸增加新修訂版本的流量分配比例。

使用 Cloud Deploy 時,您可以設定在單一或多個階段中,將 Canary 部署至 Cloud Run。

這裡的操作說明僅包含 Canary 設定專屬的內容。如需設定及執行部署管道的一般操作說明,請參閱「部署 Cloud Run 服務或工作」一文。

確認您具備必要權限

除了使用 Cloud Deploy 時需要的其他 Identity and Access Management 權限,您還需要下列權限,才能執行可能需要用於 Canary 部署作業的其他動作:

  • clouddeploy.rollouts.advance
  • clouddeploy.rollouts.ignoreJob
  • clouddeploy.rollouts.cancel
  • clouddeploy.rollouts.retryJob
  • clouddeploy.jobRuns.get
  • clouddeploy.jobRuns.list
  • clouddeploy.jobRuns.terminate

如要進一步瞭解哪些可用角色包含這些權限,請參閱「IAM 角色和權限」。

準備好「skaffold.yaml

skaffold.yaml 檔案定義了 Cloud Run 服務定義的轉譯和部署方式。如要將 Canary 版本部署至 Cloud Run,請確認該版本正確指向服務定義檔,並定義所有必要的建構構件 (例如容器映像檔)。除了標準部署所需的設定外,skaffold.yaml 本身不需要任何特殊的 Canary 專用設定。您可以使用 Skaffold 設定檔,管理自訂 Canary 階段的不同服務定義變體。

準備服務定義

您可以使用一般的 Cloud Run 服務定義檔,但不需要 traffic 節。Cloud Deploy 會為您管理最後一個成功修訂版本和新修訂版本之間的流量分配。

示例 service.yaml (不含 traffic 節):

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: my-cloudrun-service
spec:
  template:
    spec:
      containers:
      - image: gcr.io/my-project/my-cloudrun-app
        ports:
        - containerPort: 8080

設定自動初期測試

在特定 Cloud Run 階段的推送管道定義中,直接設定自動化初期測試。Cloud Deploy 會自動指示 Cloud Run 根據指定的百分比,在最後一個穩定版本和新版本之間拆分流量。

serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          cloudRun:
            automaticTrafficControl: true
        canaryDeployment:
          percentages: [PERCENTAGES]
          verify: true|false
          predeploy:
            actions: "PREDEPLOY_ACTION"
          postdeploy:
            actions: "POSTDEPLOY_ACTION"

在這項設定中:

  • PERCENTAGES 是以逗號分隔的百分比值清單,代表 Canary 增量,例如 [25, 50, 75]。請注意,這不包括 100,因為在 Canary 中假設部署百分比為 100%,並由 stable 階段處理。

  • 您可以啟用部署驗證 (verify: true)。啟用後,系統會在每個 Canary 階段新增 verify 工作。

  • PREDEPLOY_ACTION

    與您在 skaffold.yaml 中使用的 ACTION_NAME 相同,可定義要在部署前執行的自訂動作。

  • POSTDEPLOY_ACTION

    與您在 skaffold.yaml 中使用的 ACTION_NAME 相同,用於定義部署後要執行的自訂動作。

設定自訂自動初期測試

這項功能結合了自訂階段定義 (名稱、百分比、設定檔、驗證、掛鉤) 和 Cloud Deploy 的 Cloud Run 自動流量管理功能。您定義階段,但 Cloud Deploy 會根據百分比指示 Cloud Run 轉移流量。

如要設定這項功能,請在 strategy.canary 區塊中同時加入 runtimeConfig.cloudRun.automaticTrafficControl: true 設定和 customCanaryDeployment 區段 (定義 phaseConfigs)。Cloud Deploy 會使用指定的 Skaffold 設定檔,算繪服務定義 (仍不應有 traffic 節),但會根據階段百分比自動管理流量。

serialPipeline:
  stages:
  - targetId: cloudrun-prod
    profiles: []
    strategy:
      canary:
        # Include runtimeConfig for automatic traffic management
        runtimeConfig:
          cloudRun:
            automaticTrafficControl: true
        # Include customCanaryDeployment for phase customization
        customCanaryDeployment:
          phaseConfigs:
          - phaseId: "warmup-cr"
            percentage: 10
            profiles: ["base-config"] # Profile rendering service def (no traffic stanza)
            verify: true
          - phaseId: "scaling-cr"
            percentage: 50
            profiles: ["base-config"] # Can use the same profile
            verify: true
          - phaseId: "stable"
            percentage: 100
            profiles: ["base-config"]
            verify: true

執行 Cloud Run Canary

  1. 註冊管道和目標:套用傳送管道和 Cloud Run 目標設定檔。

    
    gcloud deploy apply --file=delivery-pipeline.yaml --region=REGION
    gcloud deploy apply --file=cloudrun-targets.yaml --region=REGION
    

    推送管道包含所選執行階段的自動或自訂 Canary 設定。

  2. 建立版本:開始部署作業,並提供映像檔名稱。

    
    gcloud deploy releases create RELEASE_NAME \
                                    --delivery-pipeline=PIPELINE_NAME \
                                    --region=REGION
    

    PIPELINE_NAME 識別的推送管道包含本文所述的自動或自訂 Canary 設定。

  3. 推進初期測試版本:

    gcloud CLI

    gcloud deploy rollouts advance ROLLOUT_NAME \
                                --release=RELEASE_NAME \
                                --delivery-pipeline=PIPELINE_NAME \
                                --region=REGION
    

    其中:

    ROLLOUT_NAME 是目前要推進至下一階段的推出作業名稱。

    RELEASE_NAME 是指這個推出作業所屬的版本名稱。

    PIPELINE_NAME 是您用來管理這個版本部署作業的發布管道名稱。

    REGION 是建立版本的區域名稱,例如 us-central1。必填。

    如要進一步瞭解 gcloud deploy rollouts advance 指令,請參閱 Google Cloud SDK 參考資料。

    Google Cloud 控制台

    1. 開啟「推送管道」頁面

    2. 在推送管道清單中,按一下您的管道。

      「推送 pipeline 詳細資料」頁面會以圖形呈現推送 pipeline 的進度。

    3. 在「推出」分頁的「發布管道詳細資料」下方,按一下推出作業的名稱。

      系統隨即會顯示該推出作業的詳細資料頁面。

       Google Cloud 控制台中的推出作業詳細資料

      請注意,在本範例中,發布作業有 canary-50 階段和 stable 階段。您的推出作業可能會有更多階段或不同階段。

    4. 按一下「進展至下一個推出階段」

      推出作業會推進至下一個階段。

略過的階段

如果您部署初期測試版本,但應用程式尚未部署至該執行階段,Cloud Deploy 會略過初期測試階段,並執行穩定階段。請參閱「首次略過階段」,瞭解發生這種情況的原因。

後續步驟