このドキュメントでは、Kubernetes Gateway API サービス メッシュで Cloud Deploy を使用して、GKE または GKE 接続クラスタ にアプリケーションをデプロイするようにカナリア デプロイを構成して使用する方法について説明します。
カナリア デプロイとは、アプリケーションの新しいバージョンの段階的なロールアウトです。アプリケーションのパフォーマンスをモニタリングしながら、新しいバージョンに送信されるトラフィックの割合を徐々に増やしていきます。これにより、潜在的な問題を早期に検出し、ユーザーへの影響を最小限に抑えることができます。
Gateway API を使用した GKE と GKE 接続クラスタのカナリア デプロイの仕組み
Deployment と Service の参照に加えて、Service を参照する
backendRefsルールを含む HTTPRoute リソースを指定します。Cloud Deploy は、元の Deployment の名前に
-canaryを加えた名前の新しい Deployment と、元の Service 名に-canaryを加えた名前の新しい Service を作成します。Secret、ConfigMap、水平ポッド オートスケーラーもコピーされ、
-canaryという名前が付けられます。カナリア フェーズごとに、Cloud Deploy は HTTPRoute を変更し、元の Deployment の Pod とカナリア デプロイの Pod の間の重みを、そのフェーズの割合に基づいて更新します。
HTTPRouteリソースへの変更の伝播には遅延が生じる可能性があるため、構成にrouteUpdateWaitTimeプロパティを含めることで、システムがこの伝播に要する一定の時間待機するようにできます。stableフェーズでは、-canaryDeployment はゼロにスケールダウンされ、元の Deployment は新しいリリースの Deployment を使用するように更新されます。また、HTTPRoute は指定した元の HTTPRoute に戻ります。
Cloud Deploy は、
stableフェーズまで元の Deployment または Service を変更しません。
Cloud Deploy を使用すると、単一のステージまたは複数のステージで GKE と GKE 接続クラスタへのカナリア デプロイを構成できます。
ここに記載されている手順は、カナリア構成に固有のもののみです。デプロイ パイプラインの構成と実行に関する一般的な手順については、 ドキュメント Google Kubernetes Engine クラスタにデプロイするをご覧ください。
必要な権限があることを確認してください。
Cloud Deploy の使用に必要な他の Identity and Access Management 権限に加えて、カナリア デプロイに必要な追加のアクションを実行するには、次の権限が必要です。
clouddeploy.rollouts.advanceclouddeploy.rollouts.ignoreJobclouddeploy.rollouts.cancelclouddeploy.rollouts.retryJobclouddeploy.jobRuns.getclouddeploy.jobRuns.listclouddeploy.jobRuns.terminate
これらの権限を含む利用可能なロールの詳細については、IAM のロールと権限 をご覧ください。
skaffold.yaml を準備する
skaffold.yaml ファイルは、Kubernetes
マニフェストのレンダリングとデプロイの方法を定義します。GKE または GKE 接続クラスタへのカナリア デプロイでは、skaffold.yaml
ファイルがマニフェストを正しく指し、必要なビルド アーティファクトを定義していることを確認してください。標準デプロイに必要なもの以外に、skaffold.yaml内でカナリア固有の特別な構成は必要ありません。Skaffold プロファイルを使用して、カスタム カナリア フェーズのマニフェストのバリエーションを管理することもできます。
Kubernetes マニフェストを準備する
Kubernetes マニフェストには、Deployment リソースと Service
リソースの両方を含める必要があります。Service は、Deployment によって管理される Pod のラベルと一致する
selector を定義する必要があります。Cloud Deploy が検索するデフォルトのラベルは app
ですが、これはパイプラインで構成できます。
Deployment と Service に加えて、マニフェストには、トラフィック分割用に構成された HTTPRoute
リソースを含める必要があります。このリソースは、Service と関連する Gateway を参照します。
自動カナリアを構成する
Kubernetes Gateway API(Istio または サポートされている実装)を使用して、 メッシュ/ゲートウェイによって管理され、 Cloud Deploy によってオーケストレートされる、正確な割合ベースのトラフィック分割を行います。
Gateway API リソースを設定する: クラスタで Gateway、基盤となるサービス メッシュ(Istio など)、または Gateway コントローラが正しく構成されていることを確認します。
リリースを作成するときに Cloud Deploy に提供される Kubernetes マニフェストに、次のものを含めます。
HTTPRouteGateway リソースを参照するA. Deployment
サービス
デリバリー パイプラインと、カナリア デプロイを行うターゲットを構成します。
ターゲットの構成は、どのターゲットでも同じです。
特定のターゲットの進行シーケンスのデリバリー パイプライン構成には、Kubernetes Gateway API
HTTPRoute構成と Deployment と Service を参照するgatewayServiceMeshスタンザが含まれます。strategy: canary: runtimeConfig: kubernetes: gatewayServiceMesh: httpRoute: "ROUTE" service: "SERVICE" deployment: "DEPLOYMENT" routeUpdateWaitTime: "WAIT_TIME" podSelectorLabel: "LABEL" canaryDeployment: percentages: - 50ここで...
ROUTE は、必要なルーティング 動作を定義する httpRoute 構成です。
SERVICE は、Cloud Deploy が GKE と GKE 接続クラスタへのカナリア デプロイに必要とするサービス構成です。
DEPLOYMENT は、 Cloud Deploy が GKE と GKE 接続クラスタへのカナリア デプロイに必要とする Deployment の構成です。
WAIT_TIME は、リクエストのドロップを回避するために
HTTPRouteリソースへの変更の伝播が完了するまで Cloud Deploy が待機する時間です。例:routeUpdateWaitTime: 60s。Istio を使用せずに Gateway API を使用してカナリアを実行し、 Gateway API が Google Cloud ロードバランサに接続されている場合は、カナリアインスタンスをスケールダウンすると、少量のトラフィックが失われる可能性があります。 この動作が発生した場合は、この設定を構成できます。
LABEL は Pod セレクタ ラベルです。これは、マニフェストで定義されている Kubernetes Service と Deployment のラベルセレクタと一致する必要があります。 PIN の作成は省略することもできます。デフォルトは
appです。
カスタム自動カナリアを構成する
カスタム自動カナリアは、カスタム フェーズ定義(名前、割合、プロファイル、検証、フック)と、GKE または GKE 接続クラスタの Cloud Deploy
の自動トラフィック管理を組み合わせたものです。フェーズはユーザーが定義しますが、Cloud Deploy は割合と選択した runtimeConfig
に基づいて基盤となるリソース操作を処理します。
これを構成するには、strategy.canary ブロック内に、serviceNetworking を含む runtimeConfig
セクションと、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:
tasks: []
predeploy:
tasks: []
postdeploy:
tasks: []
- phaseId: "scaling"
percentage: 50
profiles: ["profile-b"] # Different profile for this phase
verify:
tasks: []
predeploy:
tasks: []
postdeploy:
tasks: []
- phaseId: "stable"
percentage: 100
profiles: ["profile-b"] # Can reuse profiles
verify:
tasks: []
predeploy:
tasks: []
postdeploy:
tasks: []
HTTPRoute を別のクラスタにデプロイする
Gateway API サービス メッシュを使用してカナリアを構成している場合は、HTTPRoute をデプロイする代替の非ターゲット クラスタを指定できます。
これを行うには、カナリア戦略構成で routeDestinations スタンザを使用して、HTTPRoute
の宛先クラスタを特定し、Service を同じ非ターゲット クラスタに伝播するブール値の設定を使用します。また、ターゲット構成に
associatedEntities スタンザを作成して、クラスタを特定します。
ターゲットで
associatedEntitiesを構成します。各エンティティは、Cloud Deploy が HTTPRoute と Kubernetes Service をデプロイするクラスタです。 ターゲット定義に
associatedEntitiesスタンザを含めます。associatedEntities: [KEY]: gkeClusters: - cluster: [PATH] dnsEndpoint: [true|false] internalIp: [true|false] proxyUrl:ここで
KEYは、この関連エンティティ グループの任意の名前です。この名前を使用して、カナリア構成のrouteDestinationsからエンティティを参照します。PATHは、HTTPRoute(必要に応じて Service)がデプロイされる GKE クラスタを識別するリソースパスです。dnsEndpointは、複数のエンドポイントが構成されている場合に、クラスタの DNS エンドポイントを使用するかどうかを示します。デフォルトはfalseです。internalIpは、複数のエンドポイントが構成されている場合に、クラスタの内部 IP(プライベート IP)を使用するかどうかを示します。デフォルトはfalseです。
internalIpの有無にかかわらず、任意の数のクラスタを含めることができます。カナリア構成で
routeDestinationsを構成します。各ルートの宛先は
associatedEntitiesスタンザを参照し、Service を代替クラスタにもデプロイするかどうかを示します。 カナリア構成のgatewayServiceMeshスタンザ内に次を追加します。routeDestinations: destinationIds: ["KEY"] propagateService: [true|false]ここで
KEYは、ターゲットのassociatedEntitiesで構成した名前です。 この名前を使用して、カナリア構成のrouteDestinationsからエンティティを参照します。値
@selfを指定して、関連する宛先に加えて、HTTPRoute をターゲット クラスタにデプロイすることもできます。propagateServiceは、HTTPRoute に加えて、Service を関連クラスタにデプロイするかどうかを示します。デフォルトはfalseです。
GKE または GKE 接続クラスタのカナリアを実行する
パイプラインとターゲットを登録する: デリバリー パイプラインと GKE または GKE 接続クラスタのターゲット構成ファイルを適用します。
gcloud deploy apply --file=delivery-pipeline.yaml --region=REGION gcloud deploy apply --file=gke-targets.yaml --region=REGIONデリバリー パイプラインには、選択したランタイムの自動またはカスタム カナリア構成が含まれています。
リリースを作成する: イメージ名を指定してデプロイを開始します。
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 discoveryPIPELINE_NAMEで識別されるデリバリー パイプラインには、このドキュメントで説明されている自動またはカスタム カナリア構成が含まれています。カナリアを進める:
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)。必須入力項目です。コマンドの詳細については、Google Cloud SDK リファレンスをご覧ください。
gcloud deploy rollouts advanceGoogle Cloud コンソール
デリバリー パイプラインのリストに表示されているパイプラインをクリックします。
デリバリー パイプラインの詳細ページには、デリバリー パイプラインの進行状況がグラフィカルに表示されます。
[ロールアウト] タブの [デリバリー パイプラインの詳細] で、ロールアウトの名前をクリックします。
そのロールアウトのロールアウトの詳細ページが表示されます。

この例では、ロールアウトに
canary-50フェーズとstableフェーズがあります。ロールアウトには、より多くのフェーズまたは異なるフェーズが含まれる場合があります。[ロールアウトを進める] をクリックします。
ロールアウトを次のフェーズに進めます。
スキップされるフェーズ
カナリアをデプロイするときに、アプリケーションがそのランタイムにデプロイされていない場合、Cloud Deploy はカナリア フェーズをスキップして安定フェーズを実行します。この理由については、初回にフェーズをスキップする をご覧ください。
次のステップ
カナリアのロールアウトのライフサイクルを管理する方法を確認する。
Cloud Deploy のデプロイ戦略の詳細を確認する。