本文說明如何設定及使用 Canary 部署,透過 Cloud Deploy 和 Kubernetes Gateway API 服務網格,將應用程式部署至 GKE 或 GKE Enterprise。
初期測試部署是指逐步推出應用程式新版本,逐步增加傳送至新版本的流量百分比,同時監控應用程式的效能。這有助於及早發現潛在問題,並盡量減少對使用者的影響。
如何使用 Gateway API,為 GKE 和 GKE Enterprise 執行 Canary 部署作業
除了 Deployment 和 Service 參照,您還提供 HTTPRoute 資源,其中包含參照 Service 的
backendRefs規則。Cloud Deploy 會建立新的 Deployment,名稱為原始 Deployment 名稱加上
-canary,以及新的 Service,名稱為原始 Service 名稱加上-canary。系統也會複製 Secret、ConfigMap 和水平 Pod 自動調度器,並使用
-canary重新命名。在每個 Canary 階段,Cloud Deploy 會修改 HTTPRoute,根據該階段的百分比,更新原始 Deployment 的 Pod 與 Canary Deployment 的 Pod 之間的權重。
變更傳播至
HTTPRoute資源時可能會發生延遲,因此您可以在設定中加入routeUpdateWaitTime屬性,讓系統等待指定時間,確保變更傳播完成。在
stable階段,-canaryDeployment 會縮減至零,而原始 Deployment 會更新為使用新版本的 Deployment。此外,HTTPRoute 現在已還原為您提供的原始狀態。
在
stable階段之前,Cloud Deploy 不會修改原始的 Deployment 或 Service。
使用 Cloud Deploy 時,您可以在單一或多個階段中,將 Canary 部署作業設定為 GKE 和 GKE Enterprise。
這裡的操作說明僅包含 Canary 設定專屬的內容。請參閱「將應用程式部署至 Google Kubernetes Engine 叢集」一文,瞭解如何設定及執行部署管道。
確認您具備必要權限
除了使用 Cloud Deploy 時需要的其他 Identity and Access Management 權限,您還需要下列權限,才能執行可能需要用於 Canary 部署作業的其他動作:
clouddeploy.rollouts.advanceclouddeploy.rollouts.ignoreJobclouddeploy.rollouts.cancelclouddeploy.rollouts.retryJobclouddeploy.jobRuns.getclouddeploy.jobRuns.listclouddeploy.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 標籤,但您可以在管道中設定這個標籤。
除了 Deployment 和 Service 之外,資訊清單還必須包含為流量分配設定的 HTTPRoute 資源,並參照 Service 和相關聯的閘道。
設定自動初期測試
使用 Kubernetes Gateway API (搭配 Istio 或任何支援的實作方式),透過網格/閘道管理精確的百分比流量分配,並由 Cloud Deploy 協調。
設定 Gateway API 資源:請確認您的 Gateway 和基礎服務網格 (例如 叢集中已正確設定 Istio 或 Gateway 控制器。
在您建立版本時提供給 Cloud Deploy 的 Kubernetes 資訊清單中,加入下列項目:
參照 Gateway 資源的
HTTPRouteDeployment
服務
設定推送管道和要進行初期測試部署的目標:
目標的設定方式與任何目標相同。
在特定目標的進展順序中,交付管道設定包含
gatewayServiceMesh節,可參照 Kubernetes Gateway APIHTTPRoute設定,以及 Deployment 和 Service。strategy: canary: runtimeConfig: kubernetes: gatewayServiceMesh: httpRoute: "ROUTE" service: "SERVICE" deployment: "DEPLOYMENT" routeUpdateWaitTime: "WAIT_TIME" podSelectorLabel: "LABEL" canaryDeployment: percentages: - 50Where...
ROUTE 是 httpRoute 設定,用於定義所需的轉送行為。
SERVICE 是服務設定,Cloud Deploy 需要這項設定,才能將 Canary 部署作業部署至 GKE 和 GKE Enterprise。
DEPLOYMENT 是 Deployment 設定,Cloud Deploy 需要這項設定,才能將 Canary 部署作業部署至 GKE 和 GKE Enterprise。
WAIT_TIME 是 Cloud Deploy 等待
HTTPRoute資源變更完成傳播的時間長度,可避免要求遭到捨棄。例如:routeUpdateWaitTime: 60s。如果您使用 Gateway API 執行 Canary,但沒有 Istio,且 Gateway API 連線至 Google Cloud 負載平衡器,當 Canary 執行個體縮減時,可能會遺失少量流量。如果發生這種情況,您可以設定這項設定。
LABEL 是 Pod 選擇器標籤。這必須與資訊清單中定義的 Kubernetes 服務和部署項目中的標籤選取器相符。這項設定為選填。預設值為
app。
設定自訂自動初期測試
這項功能結合了自訂階段定義 (名稱、百分比、設定檔、驗證、掛鉤) 和 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:
gatewayServiceMesh:
httpRoute: "my-route"
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
將 HTTPRoute 部署至其他叢集
使用 Gateway API 服務網格設定 Canary 時,您可以指定要部署 HTTPRoute 的替代非目標叢集。
如要這麼做,請在 Canary 策略設定中使用 routeDestinations 節,找出 HTTPRoute 的目的地叢集,並使用布林值設定將 Service 傳播至相同的非目標叢集。您會在目標設定中建立 associatedEntities 節,以識別叢集。
在目標上設定
associatedEntities。每個實體都是叢集,Cloud Deploy 會在其中部署 HTTPRoute,以及 Kubernetes Service (選用)。在目標定義中加入
associatedEntities節:associatedEntities: [KEY]: gkeClusters: - cluster: [PATH] dnsEndpoint: [true|false] internalIp: [true|false] proxyUrl:其中:
KEY是這個關聯實體群組的任意名稱。您會使用這個名稱,從 Canary 設定中參照實體。routeDestinationsPATH是資源路徑,用於識別要部署 HTTPRoute (和選用的 Service) 的 GKE 叢集。dnsEndpoint會指出是否要使用叢集的 DNS 端點 (如果已設定多個端點)。預設值為false。internalIp表示是否要使用叢集的內部 IP (私人 IP),前提是已設定多個端點。預設值為false。
您可以納入任意數量的叢集,無論是否含有
internalIp。在初期測試設定中設定
routeDestinations。每條路徑目的地都會參照
associatedEntities節,並指出是否也要將服務部署至替代叢集。在 Canary 設定的gatewayServiceMesh節中加入以下內容:routeDestinations: destinationIds: ["KEY"] propagateService: [true|false]其中:
KEY是您在associatedEntities中設定的目標名稱。在 Canary 設定中,使用這個名稱參照routeDestinations中的實體。您也可以提供
@self值,將 HTTPRoute 部署至目標叢集,以及相關聯的目的地。propagateService表示除了 HTTPRoute 之外,是否要將 Service 部署至相關聯的叢集。預設值為false。
執行 GKE 或 GKE Enterprise Canary
註冊管道和目標:套用交付管道和 GKE 或 GKE Enterprise 目標設定檔。
gcloud deploy apply --file=delivery-pipeline.yaml --region=REGION gcloud deploy apply --file=gke-targets.yaml --region=REGION推送管道包含所選執行階段的自動或自訂 Canary 設定。
建立版本:開始部署作業,並提供映像檔名稱。
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 設定。推進初期測試版本:
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 控制台
在推送管道清單中,按一下您的管道。
「推送 pipeline 詳細資料」頁面會以圖形呈現推送 pipeline 的進度。
在「推出」分頁的「發布管道詳細資料」下方,按一下推出作業的名稱。
系統隨即會顯示該推出作業的詳細資料頁面。

請注意,在本範例中,發布作業有
canary-50階段和stable階段。您的推出作業可能會有更多階段或不同階段。按一下「進展至下一個推出階段」。
推出作業會推進至下一個階段。
略過的階段
如果您部署初期測試版本,但應用程式尚未部署至該執行階段,Cloud Deploy 會略過初期測試階段,並執行穩定階段。請參閱「首次略過階段」,瞭解發生這種情況的原因。
後續步驟
瞭解如何管理 Canary 推出作業的生命週期。
進一步瞭解平行部署。
進一步瞭解 Cloud Deploy 部署策略。