使用以服務為基礎的網路,將 Canary 部署作業部署至 GKE 和 GKE Enterprise

本文說明如何設定及使用 Canary 部署,透過 Cloud Deploy 和以服務為基礎的網路,將應用程式部署至 GKE 或 GKE Enterprise。

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

如何為採用服務型網路的 GKE 和 GKE Enterprise 執行 Canary 部署

  1. 您提供 Deployment 資源和 Service 資源的名稱。

  2. Cloud Deploy 會建立額外的 Deployment 資源,名稱為目前的 Deployment 加上 -canary

Secret 和 ConfigMap 也會複製並重新命名為 -canary

  1. Cloud Deploy 會修改 Service,調整選取器以選取目前 Deployment 中的 Pod 和初期測試 Pod。

    Cloud Deploy 會根據Pod 佈建部分所述的計算方式,計算要用於 Canary 版本的 Pod 數量。計算方式會因您啟用或停用 Pod 超量佈建而異。

    如果我們跳過stable階段,Cloud Deploy 會新增用於比對 Pod 的標籤,因此這些標籤可用於後續的初期測試執行作業。

    Cloud Deploy 會建立部署,其中包含特定階段的 Pod 百分比,並在每個階段更新。計算方式是將 pod 數量視為原始 pod 數量的百分比。這可能會導致流量分配不準確。如需精確拆分流量,可以使用 Gateway API

  2. stable 階段,-canary Deployment 會縮減至零,並由新的 Deployment 取代原始 Deployment。

    除非停用過度佈建,否則 Cloud Deploy 不會修改原始部署作業,直到 stable 階段為止。

Cloud Deploy 會佈建 Pod,盡可能達到要求的 Canary 百分比。這項費用是根據 Pod 數量計算,而非 Pod 的流量。如要根據流量進行 Canary 部署,請使用 Gateway API

如果是 GKE 網路型 Canary,您可以啟用或停用 Pod 過度佈建。下列各節說明 Cloud Deploy 如何計算要為每個 Canary 階段的 Canary 部署作業佈建的 Pod 數量。

啟用超額佈建的 Pod 佈建

啟用過度佈建 (disablePodOverprovisioning: false) 後,Cloud Deploy 就能根據現有部署作業執行的 Pod 數量,建立足夠的額外 Pod,以執行您想要的 Canary 百分比。啟用 Pod 過度佈建時,Cloud Deploy 會在每個 Canary 階段,透過下列公式計算要為 Canary 部署作業佈建的 Pod 數量:

math.Ceil( percentage * ReplicaCountOfDeploymentOnCluster / (100-percentage))

使用這個公式時,目前的副本數量 (在這次 Canary 部署前已有的 Pod 數量) 會乘以階段的 Canary 百分比,然後將結果除以 (100 減去百分比)。

舉例來說,如果您已有 4 個 Pod,且 Canary 階段為 50%,則 Canary Pod 數量為 4 個。(100-percentage 的結果會以百分比形式表示:100-50=50,並視為 .50。)

Pod 超額佈建是預設行為。

停用超額佈建功能後佈建 Pod

您可以停用過度佈建 (disablePodOverprovisioning: true),確保 Cloud Deploy 不會增加副本數量。

如果停用 Pod 超量佈建,Cloud Deploy 會在每個 Canary 階段,按照下列公式計算 Canary 部署的 Pod 佈建:

math.Ceil( (ReplicaCountOfDeploymentOnCluster + ReplicaCountOfCanaryDeploymentOnCluster) * percentage)

在這個公式中,只有在先前已有 Canary 階段時,才會出現 ReplicaCountOfCanaryDeploymentOnCluster。如果是第一個 Canary 階段,則沒有 ReplicaCountOfCanaryDeploymentOnCluster

如果從 4 個 Pod 開始,該數字會乘以 Canary 百分比 (例如 50% 或 .5),得出 2。因此,原始部署作業現在會縮減至 2 個,並為初期測試部署作業建立 2 個新 Pod。如果接下來有 75% 的初期測試階段,您會有 2 (原始部署) +2 (第一個初期測試階段) *.75,取得 3 個初期測試 Pod 和 1 個執行原始部署的 Pod。

使用 Cloud Deploy 時,您可以在單一或多個階段中,將 Canary 部署作業設定為 GKE 和 GKE Enterprise。

這裡的操作說明僅包含 Canary 設定專屬的內容。請參閱「將應用程式部署至 Google Kubernetes Engine 叢集」一文,瞭解如何設定及執行部署管道。

確認您具備必要權限

除了使用 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 檔案會定義 Kubernetes 資訊清單的算繪和部署方式。如要將 Canary 部署至 GKE/GKE Enterprise,請確認其正確指向資訊清單,並定義所有必要的建構構件。除了標準部署所需的設定外,skaffold.yaml 本身不需要任何特殊的 Canary 專用設定。您可能會使用 Skaffold 設定檔,管理自訂 Canary 階段的不同資訊清單變體。

準備 Kubernetes 資訊清單

Kubernetes 資訊清單必須包含 Deployment 資源和 Service 資源。Service 必須定義與 Deployment 所管理 Pod 標籤相符的 selector。Cloud Deploy 預設會尋找 app 標籤,但您可以在管道中設定這個標籤。

設定自動初期測試

使用標準 Kubernetes 服務網路,在特定 GKE 或 GKE Enterprise 階段的推送管道定義中,直接設定自動 Canary 部署。

在管道階段中,加入 strategy 屬性,如下所示:

serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          kubernetes:
            serviceNetworking:
              service: "SERVICE_NAME"
              deployment: "DEPLOYMENT_NAME"
              podSelectorLabel: "LABEL"
        canaryDeployment:
          percentages: [PERCENTAGES]
          verify: true|false
          predeploy:
            actions: "PREDEPLOY_ACTION"
          postdeploy:
            actions: "POSTDEPLOY_ACTION"

在此設定中...

  • SERVICE_NAME 是資訊清單中定義的 Kubernetes Service 名稱。

  • DEPLOYMENT_NAME 是 Kubernetes Deployment 的名稱,定義於資訊清單中。

  • LABEL 是 Pod 選擇器標籤。這必須與資訊清單中定義的 Kubernetes 服務標籤選取器相符。這項設定為選用。預設值為 app

  • PERCENTAGES 是以逗號分隔的百分比值清單,代表 Canary 增量,例如 [5, 25, 50]

    此外,這不包括 100,因為在 Canary 中假設為 100% 的部署,並由 stable 階段處理

  • 您可以啟用部署驗證 (verify: true)。啟用後,每個階段都會啟用 verify 工作。

  • PREDEPLOY_ACTION

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

  • POSTDEPLOY_ACTION

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

設定自訂初期測試

您可以手動設定 Canary,不必完全依賴 Cloud Deploy 提供的自動化功能。透過自訂 Canary 設定,您可以在推送管道定義中指定下列項目:

  • 推出階段名稱

    在全自動 Canary 部署中,Cloud Deploy 會為您命名階段 (例如 canary-25canary-75stable)。不過,使用自訂 Canary 時,您可以為每個階段命名,只要該名稱在 Canary 階段的所有階段中不重複,且符合資源 ID 限制即可。但最後階段 (100%) 的名稱必須是 stable

  • 各階段的百分比目標

    分別指定每個階段的百分比。

  • 階段要使用的 Skaffold 設定檔

    您可以為每個階段使用不同的 Skaffold 設定檔,也可以使用相同的設定檔,或任意組合。每個設定檔都可以使用不同的 Kubernetes 資訊清單。您也可以在特定階段使用多個設定檔。Cloud Deploy 會合併這些項目。

  • 階段是否有驗證工作

    請注意,啟用驗證後,您也需要設定 skaffold.yaml 以進行驗證。

  • 階段是否有部署前或部署後作業

    如要啟用部署前或部署後工作,請設定這些工作的 skaffold.yaml

自訂 Canary 支援所有目標類型

自訂初期測試設定元素

下列 YAML 顯示完全自訂 Canary 部署階段的設定:

strategy:
  canary:
    # Custom configuration for each canary phase
    customCanaryDeployment:
      phaseConfigs:
      - phaseId: "PHASE1_NAME"
        percentage: PERCENTAGE1
        profiles: [ "PROFILE_NAME" ]
        verify: true | false
        predeploy:
          actions: "PREDEPLOY_ACTION"
        postdeploy:
          actions: "POSTDEPLOY_ACTION"
      - 
      - phaseId: "stable"
        percentage: 100
        profiles: [ "LAST_PROFILE_NAME" ]
        verify: true|false
        predeploy:
          actions: "PREDEPLOY_ACTION"
        postdeploy:
          actions: "POSTDEPLOY_ACTION"

這個 YAML

  • PHASE1_NAME

    是階段的名稱。每個階段名稱都不得重複。

  • [ "PROFILE_NAME" ]

    這是要用於階段的設定檔名稱。您可以為每個階段使用相同的設定檔,也可以為每個階段使用不同的設定檔,或任意組合。此外,您也可以指定多個設定檔。Cloud Deploy 會使用您指定的所有設定檔,加上整體階段使用的設定檔或資訊清單。

  • stable

    最後一個階段必須命名為 stable

  • PERCENTAGE1

    這是第一階段要部署的百分比。每個階段都必須有專屬的百分比值,且該值必須是整數百分比 (例如不得為 10.5),階段也必須依遞增順序排列。

  • verify: true|false

    告知 Cloud Deploy 是否要為階段納入驗證工作。 請注意,如要讓每個階段都使用驗證,Skaffold 會使用相同的設定檔進行驗證,該設定檔是為該階段的算繪和部署作業指定。

  • PREDEPLOY_ACTION

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

  • POSTDEPLOY_ACTION

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

最後階段的百分比必須為 100。系統會按照您在這個 customCanaryDeployment 節中設定的順序執行階段,但如果百分比值不是遞增順序,註冊發布管道的指令就會失敗並顯示錯誤。

請注意,自訂 Canary 的設定不包含 runtimeConfig 節。如果加入 runtimeConfig,則會視為以自訂服務為基礎的 Canary 版本

設定自訂自動初期測試

這項功能結合了自訂階段定義 (名稱、百分比、設定檔、驗證、掛鉤),以及 Cloud Deploy 的 GKE 或 GKE Enterprise 自動流量管理功能。您定義階段,但 Cloud Deploy 會根據百分比和所選的 runtimeConfig,處理基礎資源操作。

如要設定這項功能,請在 strategy.canary 區塊中,同時加入 runtimeConfig 區段 (含 serviceNetworking) 和 customCanaryDeployment 區段 (定義 phaseConfigs)。Cloud Deploy 會使用指定的 Skaffold 設定檔進行算繪,但會根據 runtimeConfig 和階段百分比自動調整流量。

serialPipeline:
  stages:
  - targetId: gke-prod
    profiles: []
    strategy:
      canary:
        # Include runtimeConfig for automatic traffic management
        runtimeConfig:
          kubernetes:
            serviceNetworking:
              service: "my-app"
              deployment: "my-deployment"
        # Include customCanaryDeployment for phase customization
        customCanaryDeployment:
          phaseConfigs:
          - phaseId: "warmup"
            percentage: 10
            profiles: ["profile-a"] # Profile used for rendering this phase
            verify: true
          - phaseId: "scaling"
            percentage: 50
            profiles: ["profile-b"] # Different profile for this phase
            verify: true
          - phaseId: "stable"
            percentage: 100
            profiles: ["profile-b"] # Can reuse profiles
            verify: true

執行 GKE 或 GKE Enterprise Canary

  1. 註冊管道和目標:套用交付管道和 GKE 或 GKE Enterprise 目標設定檔。

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

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

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

    
    gcloud deploy releases create RELEASE_NAME \
                                    --delivery-pipeline=PIPELINE_NAME \
                                    --region=REGION
      # e.g., --images=my-cloudrun-service=gcr.io/my-project/my-app:v1.1
      # Add --skaffold-file or --source if not using default Skaffold config discovery
    

    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 會略過初期測試階段,並執行穩定階段。請參閱「首次略過階段」,瞭解發生這種情況的原因。

後續步驟