カナリア デプロイ戦略を使用する

このドキュメントでは、カナリア デプロイ戦略を構成および使用する方法について説明します。

カナリア デプロイとは

カナリア デプロイとは、すでにデプロイされているバージョンと新しいバージョンの間でトラフィックを分割するアプリケーションの段階的なロールアウトです。完全にロールアウトする前にユーザーのサブセットにロールアウトします。

サポート対象のターゲット タイプ

Cloud Deploy のカナリア デプロイは、次のものを含むすべてのターゲット タイプをサポートしています。

Canary 環境は、マルチターゲットでも機能します。

カナリア デプロイ戦略を使用する理由

カナリア デプロイでは、アプリケーションを部分的にリリースできます。このようにして、新しいバージョンのアプリケーションをすべてのユーザーに配信する前に、信頼性を確認できます。

たとえば、GKE または GKE Enterprise にデプロイする場合は、アプリケーションの新しいバージョンを少数の Pod にデプロイします。古いバージョンは引き続き実行されますが、より多くのトラフィックが新しい Pod に送信されます。

Cloud Run にデプロイする場合、Cloud Run 自体が構成した割合に従って、古いリビジョンと新しいリビジョン間でトラフィックを分割します。

カナリアの種類

Cloud Deploy では、次のタイプのカナリア デプロイを構成できます。

  • 自動

    自動カナリア デプロイ(サービス ネットワーキングGateway APICloud Run の場合)では、進行的なデプロイを表す一連の割合で Cloud Deploy を構成します。Cloud Deploy は、古いバージョンと新しいバージョンの間でトラフィックの割合を割り当てるために、追加のオペレーションを代行して実行します。

  • カスタム自動

    カスタム自動カナリア(サービス ネットワーキングGateway APICloud Run の場合)では、次の情報を指定できます。

    • フェーズ名
    • 目標の割合
    • フェーズで使用する Skaffold プロファイル
    • 確認ジョブを含めるかどうか
    • 事前デプロイ ジョブと事後デプロイ ジョブのどちらか一方、または両方を含めるかどうか

    ただし、トラフィック負荷分散情報を提供する必要はありません。Cloud Deploy が必要なリソース(サービス ネットワーキングGateway APICloud Run)を作成します。

  • カスタム

    カスタム カナリア(サービス ネットワーキングGateway APICloud Run の場合)では、以下のような各カナリア フェーズを個別に構成します。

    • フェーズ名
    • 目標の割合
    • フェーズで使用する Skaffold プロファイル
    • 確認ジョブを含めるかどうか
    • 事前デプロイ ジョブと事後デプロイ ジョブのどちらか一方、または両方を含めるかどうか

    また、完全なカスタム カナリアの場合、すべてのトラフィック バランシング構成を指定します。

カナリア デプロイのフェーズ

カナリア デプロイのリリースを作成すると、カナリア増分ごとにフェーズが作成され、100% の最終的な stable フェーズが作成されます。

たとえば、25%、50%、75% の増分でカナリアを構成すると、ロールアウトには次のフェーズがあります。

  • canary-25
  • canary-50
  • canary-75
  • stable

ロールアウト フェーズ、ジョブ、ジョブ実行の詳細については、ロールアウトを管理するをご覧ください。

カナリア デプロイ戦略で並列デプロイを使用する

並列デプロイを使用して、カナリア デプロイを実行できます。つまり、段階的にデプロイするターゲットは、2 つ以上の子ターゲットで構成できます。たとえば、同時に、別々のリージョンのクラスタに段階的にデプロイできます。

並列カナリアと単一ターゲット カナリアの違い

  • 単一ターゲットのカナリア デプロイと同様に、GKE ターゲットにデプロイする場合は、マニフェストに Kubernetes Deployment 構成と Kubernetes Service 構成が必要です。

  • 単一ターゲットのカナリア デプロイと同様に、デリバリー パイプラインの構成には、該当するステージのステージ定義内に strategy.canary スタンザを含める必要があります。

  • また、マルチターゲットを構成し、そのマルチターゲット参照を子ターゲットに構成する必要があります。

  • リリースを作成すると、コントローラのロールアウト子ロールアウトが作成されます。

    両方のタイプのロールアウト(コントローラと子)には、構成されているカナリア率ごとに個別のフェーズstableとカナリア 100% のフェーズがあります。

  • 子ロールアウトを進めることはできません。

    コントローラのロールアウトのみを進められます。コントローラのロールアウトを次のステージに進めると、子のロールアウトも Cloud Deploy によって次に進められます。

  • コントローラのロールアウトで、失敗したジョブを再試行することはできません。

    ジョブを再試行できるのは、子ロールアウトのみです。

  • コントローラのロールアウトで失敗したジョブを無視することはできません。

    失敗したジョブを無視できるのは、子ロールアウトのみです。

  • コントローラのロールアウトはキャンセルできますが、子ロールアウトはキャンセルできません。

  • 子ロールアウトでのみジョブ実行を終了できます。コントローラのロールアウトでは終了できません。

カナリアで並行ロールアウトが失敗した場合の対処方法

子ロールアウトが失敗すると、子ロールアウトの状況に応じて、コントローラのロールアウトはさまざまな状態に移行します。

  • 1 つ以上の子ロールアウトが失敗しても、少なくとも 1 つの子ロールアウトが IN_PROGRESS の状態であれば、コントローラのロールアウトは IN_PROGRESS のままになります。

  • 1 つ以上の子ロールアウトが失敗し、少なくとも 1 つの子ロールアウトが成功した場合、現在のフェーズの後にフェーズが続く場合、コントローラのロールアウトは HALTED になります。

    これが stable フェーズの場合、コントローラのロールアウトは FAILED です。

    HALTED を使用すると、失敗した子ロールアウト内で失敗したジョブを無視再試行、または コントローラのロールアウトをキャンセルし、子ロールアウトに対してそれ以上の操作を禁止します。

  • 子ロールアウトの失敗によりコントローラのロールアウトが HALTED 状態になっている場合に、子ロールアウトで失敗したジョブを無視すると、コントローラのロールアウトは IN_PROGRESS 状態に戻ります。

次のステップ