カナリアデプロイ
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
カナリアデプロイは、フリートのごく一部をアプリケーションの新しいバージョンに更新する一般的な継続的デプロイ戦略です。
継続的デリバリーを取り入れる際、組織はどのデプロイ戦略を使用するかを決定する必要があります。最も一般的な戦略の1つはカナリアデプロイで、まずフリートのごく一部が新しいバージョンに更新されます。このサブセットであるカナリアは、いわば比喩的な炭鉱のカナリアとして機能します。
アプリケーションの新しいバージョンに問題がある場合でも、影響を受けるユーザーはごく一部であり、変更は修正または迅速に元に戻すことができます。
ユースケース
カナリアデプロイは、ポッドフリートの一部にのみ機能をデプロイし、ユーザーベースの一部が一時的にデプロイされた機能を訪れる際の動作を監視したい場合に使用できます。すべてがうまくいけば、問題を引き起こさないことを知って、その機能を本番環境にデプロイできます。
カナリアデプロイは、バックエンドのリファクタリング、パフォーマンスの改善、またはユーザーインターフェースは変更されないが、パフォーマンスが維持または改善されることを確認したいその他の変更に対しても特に必要とされます。デベロッパーは、ユーザー向けの変更を含むカナリアを使用する際に注意が必要です。デフォルトでは、同じユーザーからのリクエストはカナリアポッドと非カナリアポッドの間でランダムに分散され、混乱やエラーにつながる可能性があるためです。必要に応じて、お使いのKubernetesサービス定義でservice.spec.sessionAffinityをClientIPに設定することを検討してもよいかもしれませんが、これはこのドキュメントのスコープ外です。
カナリアIngressによる高度なトラフィック制御
カナリアデプロイは、カナリアIngressを使用することでより戦略的になります。これは、ウェイト、セッション、クッキーなどの要素に基づいて、安定版とカナリア版のデプロイ間の受信HTTPリクエストを制御する高度なトラフィックルーティングサービスです。GitLabはこのサービスを自動デプロイアーキテクチャで使用し、ユーザーが新しいデプロイを迅速かつ安全にロールアウトできるようにします。
カナリアデプロイでカナリアIngressを設定する方法
お使いのAuto DevOpsパイプラインがv2.0.0+のauto-deploy-imageを使用している場合、カナリアIngressはデフォルトでインストールされます。新しいカナリアデプロイを作成するとカナリアIngressが利用可能になり、カナリアデプロイが本番環境にプロモートされると削除されます。
以下に、最初からのセットアップフローの例を示します:
- Auto DevOpsが有効なプロジェクトを準備します。
- プロジェクトでKubernetesクラスターを設定します。
- お使いのクラスターにNGINX Ingressをインストールします。
- 上記で割り当てられたIngressエンドポイントに基づいて、ベースドメインを設定します。
- お使いのAuto DevOpsパイプラインで
v2.0.0+のauto-deploy-imageが使用されているか確認します。そうでない場合は、イメージバージョンを指定するためにドキュメントに従ってください。 - 新しいAuto DevOpsパイプラインを実行し、
productionジョブが成功し、本番環境が作成されることを確認します。 - Auto DevOpsパイプライン用の
canaryデプロイメントジョブを設定します。 - 新しいAuto DevOpsパイプラインを実行し、
canaryジョブが成功し、カナリアIngressを含むカナリアデプロイが作成されることを確認します。
カナリアIngressのデプロイをデプロイボードに表示する (非推奨)
この機能はGitLab 14.5で非推奨になりました。
カナリアデプロイを表示するには、デプロイボードを適切に設定する必要があります:
- デプロイボードを有効にする手順に従ってください。
- カナリアデプロイを追跡するには、Kubernetesデプロイとポッドに
track: canaryというラベルを付ける必要があります。迅速に開始するには、GitLabが提供するカナリアデプロイ用の自動デプロイテンプレートを使用できます。
デプロイに応じて、ラベルはstableまたはcanaryのいずれかである必要があります。GitLabは、ラベルが空白または欠落している場合、追跡ラベルはstableであると想定します。その他の追跡ラベルはcanary(一時的)と見なされます。これにより、GitLabはデプロイが安定版かカナリア版(一時的)かを検出できます。
デプロイボードを設定し、パイプラインが少なくとも1回実行された後、パイプライン > 環境の下にある環境ページに移動します。パイプラインが実行されると、デプロイボードはカナリアポッドを明確にマークし、各環境とデプロイのステータスに関する迅速かつ明確なインサイトを可能にします。
カナリアデプロイはデプロイボードで黄色の点でマークされており、すぐにそれらに気づくことができます。
カナリアIngressの現在のトラフィックウェイトを確認する方法 (非推奨)
この機能はGitLab 14.5で非推奨になりました。
デプロイボードにアクセスします。
右側で現在のウェイトを表示します。
カナリアIngressのトラフィックウェイトを変更する方法 (非推奨)
この機能はGitLab 14.5で非推奨になりました。
GraphiQLを使用するか、GraphQL APIにリクエストを送信することで、環境のデプロイボードでトラフィックウェイトを変更できます。
お使いのデプロイボードを使用するには:
- プロジェクトの操作 > 環境に移動します。
- 右側のドロップダウンリストで新しいウェイトを設定します。
- 選択内容を確認します。
GraphiQLを使用した例を次に示します:
GraphiQL Explorerにアクセスします。
environmentsCanaryIngressUpdateGraphQLミューテーションを実行します:mutation { environmentsCanaryIngressUpdate(input:{ id: "gid://gitlab/Environment/29", # Your Environment ID. You can get the ID from the URL of the environment page. weight: 45 # The new traffic weight. for example, If you set `45`, 45% of traffic goes to a canary deployment and 55% of traffic goes to a stable deployment. }) { errors } }リクエストが成功した場合、
errorsレスポンスは空の配列を返します。GitLabは、カナリアIngressのウェイトパラメータを更新するために、お使いのKubernetesクラスターにPATCHリクエストを送信します。

