複数のマイクロサービスの新バージョンを同時にリリースする場合、本番トラフィックをすべて新バージョンに切り替える前に、それらを統合してテストする必要があります。エンドツーエンドカナリアリリースでは、呼び出しチェーン内のすべてのサービスのカナリアバージョンに対して特定の特性を持つリクエストをルーティングし、通常のトラフィックはベースバージョンを通じて継続的に流れます。サービスにカナリアバージョンが存在しない場合は、トラフィックが自動的にそのベースバージョンにフォールバックします。
Microservices Engine (MSE) は、クラウドネイティブゲートウェイとマイクロサービスガバナンスを組み合わせることで、エンドツーエンドカナリアリリースを実現します。アプリケーションのカナリアバージョン向けに分離されたトラフィックレーンを定義し、ゲートウェイでルーティングルールを設定すると、MSE がこれらのルールを呼び出しチェーン全体に伝播させます。ビジネスコードの変更は一切不要です。
基本概念
| 概念 | 説明 |
|---|---|
| トラフィックレーン(レーン) | 同一バージョンのアプリケーション向けに分離された実行環境です。特定のルーティングルールに一致するリクエストのみが、レーン内のタグ付きアプリケーションに到達します。アプリケーションとレーンの間には多対多の関係があります。 |
| レーングループ | 異なるチームやシナリオを区別するためのレーンのコレクションです。 |
| ベース環境 | タグなしアプリケーションが実行される環境です。他の環境に対するディザスタリカバリ機能を提供します。 |
| MSE クラウドネイティブゲートウェイ | Kubernetes Ingress と互換性のあるゲートウェイで、Container Service for Kubernetes (ACK) クラスターおよび Nacos インスタンスなど、複数のソースからのサービス検出をサポートします。 |
サンプル シナリオ
以下の e コマース注文処理のシナリオでは、MSE クラウドネイティブゲートウェイから Spring Cloud バックエンドへのエンドツーエンドカナリアリリースを実証します。
アーキテクチャには、以下の 3 つのアプリケーションが含まれます:
| アプリケーション | 役割 | ポート |
|---|---|---|
| アプリケーション A | トランザクションセンター | 20001 |
| アプリケーション B | 商品センター | 20002 |
| アプリケーション C | 在庫センター | 20003 |
呼び出しチェーンは次のとおりです:クライアント > MSE クラウドネイティブゲートウェイ > A > B > C
サービス検出には MSE Nacos インスタンスを使用します。クライアントおよび HTML を介したバックエンドアプリケーションへのアクセスの両方がサポートされます。
アプリケーション A およびアプリケーション C の新バージョンがリリースされます。本番環境への適用前に、エンドツーエンドカナリアリリースを通じてカナリアバージョンをテストします。アプリケーション B にはカナリアバージョンがないため、引き続きベースバージョンでサービスを提供します。

制限事項
エンドツーエンドカナリアリリース機能は、マイクロサービスガバナンスのタグベースルーティングと統合されています。同じアプリケーションに対して、カナリアリリースルールとタグベースルーティングルールの両方を設定しないでください。
Java フレームワークの互換性については、「マイクロサービスガバナンスでサポートされる Java フレームワーク」をご参照ください。
MSE クラウドネイティブゲートウェイのバージョンは 2.0.6 以降である必要があります。アップグレード手順については、「MSE クラウドネイティブゲートウェイのアップグレード」をご参照ください。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
ACK クラスターが存在すること。詳細については、「ACK 専用クラスターの作成」または「ACK マネージドクラスターの作成」をご参照ください。
マイクロサービスガバナンスページで、MSE マイクロサービスガバナンス Professional Edition が有効化されていること。
ACK クラスター内のアプリケーションに対して、MSE マイクロサービスガバナンスが有効化されていること。詳細については、「ACK または ACS クラスター内の Java マイクロサービスアプリケーションに対するマイクロサービスガバナンスの有効化」をご参照ください。
MSE クラウドネイティブゲートウェイ(バージョン 2.0.6 以降)が存在すること。詳細については、「MSE クラウドネイティブゲートウェイの作成」をご参照ください。
クラウドネイティブゲートウェイがサービスソース(ACK クラスターまたは MSE Nacos インスタンス)に関連付けられていること。詳細については、「サービスソースの追加」をご参照ください。
MSE Java エージェントのバージョンは 3.2.3 以降である必要があります。それより前のバージョンでは問題が発生する可能性があります。
操作手順 1:バックエンドアプリケーションのベースバージョンのデプロイ
ACK コンソールにログインします。
左側のナビゲーションウィンドウで、[クラスター] をクリックし、対象のクラスター名をクリックします。
左側のナビゲーションウィンドウで、[ワークロード] > [デプロイメント] を選択します。
[名前空間] を選択し、[YAML から作成] をクリックします。
アプリケーション A、アプリケーション B、アプリケーション C の YAML コードを貼り付けます。使用する YAML は、サービスソースに応じて適切なものを選択してください。
MSE Nacos インスタンスをサービスソースとして使用する場合
{nacos server address} を、ご使用の MSE Nacos インスタンスの内部エンドポイントに置き換え、中括弧 {} を削除してください。
ACK クラスターをサービスソースとして使用する場合
サービスレジストリとして、自己管理型の Nacos インスタンスをデプロイします。
以下の YAML コードでは、ベースバージョンのエンドポイントを自己管理型の Nacos インスタンスに登録します。
アプリケーション A、アプリケーション B、アプリケーション C のベースバージョンをデプロイします。
ゲートウェイがアプリケーション A にトラフィックをルーティングできるように、アプリケーション A の Kubernetes サービスを作成します。
操作手順 2:ゲートウェイ経由でのアプリケーション A の公開
MSE クラウドネイティブゲートウェイを構成して、外部トラフィックをアプリケーション A にルーティングします。サービスが既に追加済みかどうかに応じて、以下のいずれかの方法を選択してください。
新しいサービスを追加する場合
アプリケーション A がゲートウェイに追加されていない場合は、まず追加してください。
MSE コンソールにログインします。左側のナビゲーションウィンドウで、[クラウドネイティブゲートウェイ] > [ゲートウェイ] を選択し、ゲートウェイ名をクリックします。左側のナビゲーションウィンドウで、[ルート] をクリックします。[サービス] タブで、[サービスの追加] をクリックします。詳細については、「サービスの追加」をご参照ください。
ACK クラスターをサービスソースとする場合:[サービスソース] を [Container Service] に、[名前空間] を [default] に、[サービス] を [sc-a] に設定します。
MSE Nacos インスタンスをサービスソースとする場合:[サービスソース] を [MSE Nacos] に、[名前空間] を [public] に、[サービス] を [sc-A] に設定します。
[ルート] タブで、[ルートの追加] をクリックして、[sc-a](または [sc-A])のルートを作成します。詳細については、「ルートの作成」をご参照ください。
パラメーター 値 パス [プレフィックス] を選択し、 /aルートポイント [単一サービス] バックエンドサービス [sc-A]
既存のサービスを使用する場合
アプリケーション A がすでにインポート済みの場合は、既存のルートを変更します。
MSE コンソールにログインします。左側のナビゲーションウィンドウで、[クラウドネイティブゲートウェイ] > [ゲートウェイ] を選択し、ゲートウェイ名をクリックします。[ルート] タブで、ルートを変更します。
パラメーター 値 パス [プレフィックス] を選択し、 /aルートポイント 単一サービス バックエンドサービス [sc-A]
操作手順 3:ベースバージョンのトラフィックの検証
MSE コンソールにログインします。上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、[クラウドネイティブゲートウェイ] > [ゲートウェイ] を選択し、ゲートウェイ名をクリックします。
左側のナビゲーションウィンドウで、[概要] をクリックします。[エンドポイント] タブで、Server Load Balancer (SLB) インスタンスの Ingress IP アドレスを確認します。
以下のコマンドを実行して、トラフィックがベースバージョンを通過していることを検証します。
# x.x.1.1 を SLB の Ingress IP アドレスに置き換えます
curl x.x.1.1/a期待される出力:
A[10.0.3.178][config=base] -> B[10.0.3.195] -> C[10.0.3.201]アプリケーション B およびアプリケーション C にバージョンサフィックスが付いていないことから、すべてのトラフィックがベースバージョンを通過していることが確認できます。
操作手順 4:アプリケーション A およびアプリケーション C のカナリアバージョンのデプロイ
アプリケーション A およびアプリケーション C に新機能の更新が適用されます。アプリケーション B は変更されず、引き続きベースバージョンのみで実行されます。
ACK コンソールにログインします。
左側のナビゲーションウィンドウで、[クラスター] をクリックし、対象のクラスター名をクリックします。
左側のナビゲーションウィンドウで、[ワークロード] > [デプロイメント] を選択します。
[名前空間] を選択し、[YAML から作成] をクリックします。
アプリケーション A およびアプリケーション C のカナリアバージョンの YAML コードを貼り付けます。使用する YAML は、サービスソースに応じて適切なものを選択してください。
MSE Nacos インスタンスをサービスソースとして使用する場合
{nacos server address} を、ご使用の MSE Nacos インスタンスの内部エンドポイントに置き換え、中括弧 {} を削除してください。
ACK クラスターをサービスソースとして使用する場合
カナリア用 YAML では、alicloud.service.tag: gray を spec.template.metadata.labels に追加することで、カナリアノードとベースノードを区別します。
カナリアバージョンのエンドポイントは、自己管理型の Nacos インスタンスに登録されます。
操作手順 5:レーングループの作成
レーングループは、カナリアリリースに参加するアプリケーションのセットを定義します。
MSE コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、[マイクロサービスガバナンス] > [フルリンクグレースケール] を選択します。
[レーングループとレーンの作成] をクリックします。選択したマイクロサービス名前空間に既にレーングループが存在する場合は、[レーングループの作成] をクリックします。
[レーングループの作成] パネルで、以下のパラメーターを設定し、[OK] をクリックします。
パラメーター 値 [レーングループ名] レーングループの名前を入力します [Ingress タイプ] MSE Cloud-native Gateway [Ingress ゲートウェイ] ターゲットのクラウドネイティブゲートウェイを選択します [レーングループアプリケーション] spring-cloud-a、spring-cloud-b、およびspring-cloud-c 
作成後、レーングループは [フルリンクグレースケール] ページの [レーングループ] セクションに表示されます。編集するには、編集アイコンをクリックします。
操作手順 6:レーンの作成
レーンは、アプリケーションのカナリアバージョンに特定のトラフィックをルーティングするルーティングルールを定義します。
- カナリアアプリケーションノードをベースノードと区別するためにタグを付与します。コンテナ環境では、
alicloud.service.tag: ${tag}をspec.template.metadata.labelsに追加します。Elastic Compute Service (ECS) 環境では、Java 起動パラメーター-Dalicloud.service.tag=${tag}を追加します。 - レーングループ内のすべてのレーンで、レーンのルーティングモードは同一である必要があります。このモードは、最初のレーンを作成するときにのみ設定できます。
イングレスタイプが MSE クラウドネイティブゲートウェイの場合、MSE は以下の 2 つのルーティングモードをサポートします。
| ルーティングモード | 使用タイミング | 動作 |
|---|---|---|
| リクエスト内容によるルーティング | リクエストの内容(ヘッダー、パラメーター)によってカナリアトラフィックを識別できる場合 | カナリアリクエストは、呼び出しチェーン全体で同一の環境内に留まります |
| 割合によるルーティング | リクエストの内容でカナリアトラフィックを識別できず、システムを変更して識別子を追加できない場合 | 同一のソースからのリクエストが異なるレーンにルーティングされる場合があります |
リクエスト内容によるルーティングでレーンを作成する場合
[フルリンクグレースケール] ページ下部で、[最初の分割レーンの作成](既にレーンが存在する場合は [レーンの作成])をクリックします。
[レーンの作成] パネルで、以下のパラメーターを設定し、[OK] をクリックします。
パラメーター 設定 [ノードタグの追加] カナリアアプリケーションノードにタグを付与して、ベースノードと区別します [レーン情報の入力] [レーンタグ] を、このレーンにルーティングされるリクエストのタグ値に設定します。[一致関係の確認] を使用して、予期されるタグ付きノード数を検証します [カナリアリリースルールの追加] [カナリアリリースモード] を [コンテンツによるカナリアリリース] に設定します。[カナリアリリース条件] を [すべての条件を満たす] に設定します。条件を次のように構成します:[パラメータータイプ] = Header、[パラメーター] =canary、[条件] ===、[値] =gray
カナリアリリース条件
| 条件 | 効果 |
|---|---|
| [すべての条件を満たす] | 指定されたすべての条件を満たすトラフィックをルーティングします |
| [いずれかの条件を満たす] | 指定された条件のうち少なくとも 1 つを満たすトラフィックをルーティングします |
条件演算子
| 演算子 | 説明 |
|---|---|
== | 完全一致。トラフィックの値は、条件の値と完全に一致する必要があります。 |
!= | 不一致。トラフィックの値は、条件の値と異なっている必要があります。 |
in | 包含一致。トラフィックの値は、指定されたリスト内に存在する必要があります。 |
| 割合 | ハッシュベースの一致。式 hash(get(key)) % 100 < value が成立した場合にトラフィックをルーティングします。 |
| 正規表現 | 正規表現による一致。トラフィックの値は、指定されたパターンに一致する必要があります。 |
割合によるルーティングでレーンを作成する場合
[フルリンクグレースケール] ページ下部で、[最初の分割レーンの作成](既にレーンが存在する場合は [レーンの作成])をクリックします。
[レーンの作成] パネルで、以下のパラメーターを設定し、[OK] をクリックします。
パラメーター 設定 [ノードタグの追加] カナリアアプリケーションノードにタグを付与して、ベースノードと区別します [レーン情報の入力] [レーンタグ] を、このレーンにルーティングされるリクエストのタグ値に設定します。[一致関係の確認] を使用して、予期されるタグ付きノード数を検証します [ルーティングおよびカナリアリリースルールの構成] [カナリアリリースモード] を [割合によるカナリアリリース] に設定します。[フロー比率] を 30(パーセンテージ) に設定します
レーンの管理
レーンを作成すると、[フルリンクグレースケール] ページの [トラフィック配分] セクションに表示されます。利用可能な操作は以下のとおりです。
| 操作 | 効果 |
|---|---|
| [有効化] | レーンを有効化して、レーンの構成に基づいてトラフィックをルーティングします。条件に一致するトラフィックは、タグ付きアプリケーションバージョンに送信されます。タグ付きバージョンが存在しない場合は、トラフィックがタグなしバージョンにフォールバックします。 |
| [無効化] | レーンを無効化します。すべてのトラフィックは、タグなしアプリケーションバージョンにルーティングされます。 |
また、このページからレーンのトラフィック割合を確認したり、レーン内のアプリケーションのステータスを構成したりすることもできます。
操作手順 7:カナリアトラフィックの検証
リクエスト内容によるルーティングの検証
以下のコマンドを実行して、canary: gray ヘッダーを含むリクエストを送信し、トラフィックがカナリアバージョンを通過していることを検証します。
# x.x.x.x をクラウドネイティブゲートウェイの SLB IP アドレスに置き換えます
curl -H "canary: gray" x.x.x.x/a期待される出力:
Agray[10.0.3.177][config=base] -> B[10.0.3.195] -> Cgray[10.0.3.180]アプリケーション A およびアプリケーション C の gray サフィックスにより、カナリアトラフィックがカナリアバージョンに到達していることが確認できます。アプリケーション B にはカナリアバージョンがないため、トラフィックはそのベースバージョンにルーティングされます。
割合によるルーティングの検証
以下の Python スクリプトを実行して、トラフィックの配分をテストします。コード内の x.x.x.x を、クラウドネイティブゲートウェイの SLB IP アドレスに置き換えてください。
pip3 install requests
python3 traffic.py期待される結果:約 30% のリクエストがカナリア環境にルーティングされます。

(任意)カナリアトラフィックの監視
早期に問題を特定するために、以下のいずれかの場所からカナリアトラフィックを監視できます。
クラウドネイティブゲートウェイからの監視
MSE クラウドネイティブゲートウェイの [ルート] ページで、[サービス] タブをクリックします。対象のサービス名をクリックし、[監視] タブでメトリックデータを確認します。

マイクロサービスガバナンスからの監視
[フルリンクグレースケール] ページで、対象のアプリケーションをクリックします。[QPS データ] セクションで、ベースバージョンおよびカナリアバージョンのトラフィックデータを確認します。
| メトリクス | 説明 |
|---|---|
| 合計 QPS | アプリケーションの 1 秒あたりの合計クエリ数 |
| 例外 QPS | アプリケーションのエラー発生リクエスト数 |
| GrayQPS | カナリアバージョンの 1 秒あたりのクエリ数 |

Application Real-Time Monitoring Service(ARMS)からの監視
アプリケーションが ARMS に接続されている場合、ARMS コンソールの [シナリオベース分析] ページの [フルリンクグレースケール] タブで、カナリアトラフィックデータを確認できます。このデータを活用して、ロールバックまたは本番環境への完全リリースを判断できます。

次のステップ
カナリアバージョンの安定性が確認できた後、ベースデプロイメントを新しいイメージバージョンに更新し、カナリアデプロイメントを削除することで、カナリアバージョンを本番環境に昇格させます。
ロールバックを行う場合は、レーンを無効化し、カナリアデプロイメントを削除します。これにより、すべてのトラフィックが自動的にベースバージョンに戻ります。