Knative Serviceの新しいバージョンをリリースする際、すべてのトラフィックを一度に新しいバージョンにルーティングすると、そのバージョンに問題があった場合にダウンタイムのリスクがあります。トラフィック分割を使用すると、まずリクエストのごく一部を新しいRevisionにルーティングし、安定性を検証してから、その割合を徐々に増やすことができます。どの段階で問題が発生した場合でも、すぐに以前のRevisionにトラフィックを戻してください。
仕組み
Alibaba Cloud Service Mesh (ASM) 上の Knative では、すべての Knative Service に1つ以上のRevisionがあります。
Knative Serviceを作成すると、Knativeは最初のRevisionを自動的に作成します。
サービス構成を更新するたびに、Knativeは新しいRevisionを作成します。
各Revisionにルーティングされるトラフィックの割合を制御します。すべてのRevisionの割合の合計は100%である必要があります。
一般的なカナリアリリースは、次の進行に従います。
新しいRevisionを作成し、トラフィックの0%を割り当てます。
新しいRevisionが正しく機能することを確認します。
以前のRevisionから新しいRevisionへトラフィックを徐々にシフトします (例: 10% -> 50% -> 100%)。
新しいRevisionでどの段階でも問題が発生した場合は、そのトラフィックを0%に戻し、以前のRevisionを100%に復元します。
前提条件
開始する前に、以下を準備してください。
Knative on ASM を介してデプロイされた Knative Service。詳細については、「Knative on ASM を使用したサーバーレスアプリケーションのデプロイ」をご参照ください。
このトピックでは、デフォルトドメイン名 example.com を使用します。カスタムドメイン名を使用するには、「Knative on ASM でのカスタムドメイン名の設定」をご参照ください。
ステップ1: トラフィック0%での新しいRevisionの作成
本番トラフィックを送信せずに新しいRevisionを作成します。これにより、Revisionをユーザーに公開する前に、正常にデプロイされたことを確認できます。
「ACK コンソール」にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、[アプリケーション] > [Knative] を選択します。
[サービス] タブをクリックします。 サービスを探し、その名前をクリックします。 右上隅にある [リビジョンを作成] をクリックします。
[基本情報] ステップで、下部にある [詳細設定] をクリックします。 [環境変数] の横にある [追加] をクリックして以下の設定を行い、[次へ] をクリックします。
パラメーター 値 タイプ カスタム 変数キー TARGET値/ValueFrom Knative on ASM[トラフィック分割設定] ステップで、[最新リビジョン] の [パーセント %] を
0に、前のリビジョンを100に設定し、[作成] をクリックします。説明すべてのRevisionのトラフィックの割合の合計は100%である必要があります。
リビジョンが作成されたら、[サービス] タブをクリックして、サービス名をクリックします。[リビジョン情報] セクションで、新しいリビジョンが表示されることを確認します。
次のコマンドを実行して、すべてのトラフィックが引き続き以前のRevisionに送られていることを確認します。予想される出力: すべてのリクエストが
Hello World!を返します。これは、以前のRevisionが引き続きトラフィックの100%を処理していることを確認します。for i in $(seq 20); do curl http://helloworld-go.default.example.com; doneHello World!
ステップ2: 新しいRevisionへのトラフィックシフト
問題をモニタリングしながら、新しいRevisionのトラフィックの割合を段階的に増やします。
ACK コンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター]をクリックします。
[クラスター] ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、[アプリケーション] > [Knative] を選択します。
[サービス] タブをクリックし、サービス名をクリックします。右上隅の [トラフィックの分割] をクリックします。「トラフィックの分割」ダイアログボックスで、最新のリビジョンと前のリビジョンの両方で [パーセント %] を
50に設定し、[OK] をクリックします。トラフィックの分割を保存したら、[サービス] タブをクリックして、サービス名をクリックします。[リビジョン情報] セクションで、更新されたトラフィックの割合を確認します。
複数のリクエストを送信して、トラフィックが両方のRevision間で分散されていることを確認します。予想される出力 (省略): レスポンスは
Hello World!(以前のRevision) とHello Knative on ASM!(新しいRevision) の間で交互に表示され、おおよそ50/50の分割に一致します。for i in $(seq 20); do curl http://helloworld-go.default.example.com; doneHello Knative on ASM! Hello Knative on ASM! Hello World! Hello Knative on ASM! Hello World! ...新しいRevisionが安定している場合は、ステップ3を繰り返してトラフィックの割合を増やします。新しいRevisionがトラフィックの100%を処理するまで続行します。
新しいRevisionが100%に達したら、切り替えを確認します。予想される出力: すべてのリクエストが
Hello Knative on ASM!を返します。これは、カナリアリリースが完了したことを確認します。for i in $(seq 20); do curl http://helloworld-go.default.example.com; doneHello Knative on ASM! Hello Knative on ASM! Hello Knative on ASM! ...
以前のRevisionへのロールバック
カナリアリリース中に新しいRevisionでエラー、高レイテンシー、または予期しない動作が検出された場合は、すぐにロールバックしてください。
サービスの詳細ページで、右上隅の[トラフィックを分割]をクリックします。
「トラフィックの分割」ダイアログボックスで、[パーセント %] を、新しいリビジョンでは
0に、前のリビジョンでは100に設定します。[OK] をクリックします。リクエストを送信してロールバックを確認します。すべてのレスポンスが
Hello World!を返します。これは、トラフィックが以前のRevisionに完全に復元されたことを確認します。for i in $(seq 20); do curl http://helloworld-go.default.example.com; done
次のステップ
カナリアリリース後、Pod数がトラフィック量に応じて自動的に調整されるようにオートスケーリングを構成します。Knative Servingは、同時実行メトリックを Knative Pod Autoscaler (KPA) に報告する Queue Proxyコンテナを各Podに追加します。KPAは、同時リクエスト量に基づいてPodの数をスケーリングします。詳細については、「リクエスト数に基づくPodのオートスケーリングの有効化」をご参照ください。