フロントエンドアプリケーションのカナリアリリースをモニタリングおよびロールバックポリシーと組み合わせることで、システムの安定性を確保する強力なメカニズムを構築できます。これら 3 つのポリシーを連携させることで、アプリケーションの継続的な反復と更新を行いながら、フロントエンドアプリケーションの高いパフォーマンスと安定性を維持できます。このトピックでは、Microservices Engine (MSE) クラウドネイティブゲートウェイを設定して、フロントエンドアプリケーションでカナリアリリースを実装する方法について説明します。
エンドツーエンドカナリアリリースの実装
マイクロサービスシナリオでは、アプリケーション間の呼び出しはランダムです。デプロイした Spring Cloud アプリケーションまたは Dubbo アプリケーションに新しいバージョンがある場合、特定の特性を持つトラフィックが新しいバージョンのアプリケーションにルーティングされないことがあります。エンドツーエンドカナリアリリースを実装するには、フロントエンドアプリケーションのカナリアリリースと、MSE が提供するクラウドネイティブゲートウェイに基づくエンドツーエンドカナリアリリースを併用します。
フロントエンドユーザーからの各リクエストは Cloud-native Gateway を通過する際に権限システムによって認証され、リクエストの Cookie に userid: 001 などの一意のユーザー識別子が追加されます。
ゲートウェイには、設定されたルールに基づいてグレースケールトラフィックをマップし転送する frontend-gray プラグインが設定されています。
前提条件
Container Service for Kubernetes (ACK) マネージドクラスターが作成されていること。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
MSE クラウドネイティブゲートウェイが作成されていること。詳細については、「MSE クラウドネイティブゲートウェイの作成」をご参照ください。
MSE Ingress ゲートウェイを使用したフロントエンドアプリケーションのカナリアリリースの実装
MSE Ingress Controller をインストールし、MSE Ingress ゲートウェイを使用して ACK クラスターにアクセスします。詳細については、「MSE Ingress ゲートウェイを使用して ACK クラスターおよび ACS クラスターのサービスにアクセスする」をご参照ください。
ステップ 1:ACK クラスターへのアプリケーションのデプロイ
アプリケーションのデプロイ方法の詳細については、「Deployment を使用してステートレスアプリケーションを作成する」をご参照ください。
ステップ 2:MSE コンソールでの frontend-gray プラグインの設定
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの ID をクリックします。
-
左側のナビゲーションウィンドウで、Plug-in Marketplace をクリックします。
Plug-in Marketplace ページで、
frontend-grayを検索し、frontend-grayプラグインカードをクリックします。表示されたページで、Plug-in Configuration タブをクリックし、ルールレベル セクションで Domain-level plug-in rules を選択し、次に Add Rule をクリックします。 Add Rule パネルで、次のルールを構成します。 構成の詳細については、「ルールの構成」をご参照ください。
grayKey: userid rules: - name: beta-user grayKeyValue: - "00000002" - "00000003" baseDeployment: version: base grayDeployments: - name: beta-user version: gray enabled: true[有効] スイッチをオンにし、[ターゲット] ドロップダウンリストで
*(すべてのドメイン) を選択して、[OK] をクリックします。
ステップ 3:結果の検証
Container Service for Kubernetes (ACK) コンソールにログインします。 左側のナビゲーションウィンドウで、Clusters をクリックします。 Clusters ページで、対象のクラスターをクリックします。 クラスター詳細ページで、Network > Routes に移動してパブリックエンドポイントを確認します。
ルートリストには、MSE ゲートウェイベースの 2 つの Ingress が表示されます:frontend-base-ingress (ルール:
/→ frontend-base-svc) と frontend-gray-ingress (ルール:/→ frontend-gray-svc)。後の検証のために、frontend-base-ingress の [エンドポイント] 列からエンドポイントアドレスをコピーします。パブリックエンドポイント
nlb-qv04p*******cn-hangzhou.nlb.aliyuncsslb.comにアクセスします。admin/iceアカウントでログインして、ベースバージョンにアクセスします。ユーザー ID は 00000001 です。パブリックエンドポイント
nlb-qv04p*******cn-hangzhou.nlb.aliyuncsslb.comにアクセスします。カナリアバージョンにアクセスするには、標準ユーザーアカウントuser/iceでログインします。ユーザー ID は 00000002 です。
ACK クラスターを使用したフロントエンドアプリケーションのカナリアリリースの実装
ステップ 1:ACK クラスターへのアプリケーションのデプロイ
アプリケーションのデプロイ方法の詳細については、「Deployment を使用してステートレスアプリケーションを作成する」をご参照ください。
ステップ 2:MSE コンソールでの frontend-gray プラグインの設定
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト の順に選択します。[ゲートウェイ] ページで、ゲートウェイの ID をクリックします。
-
左側のナビゲーションウィンドウで、Plug-in Marketplace をクリックします。
Plug-in Marketplace ページで、
frontend-grayを検索し、frontend-grayプラグイン カードをクリックします。表示されたページで、Plug-in Configuration タブをクリックし、ルールレベルセクションで Domain-level plug-in rules を選択して、Add Rule をクリックします。Add Rule パネルで、次のルールを設定します。構成の詳細については、「ルールを設定する」をご参照ください。
grayKey: userid rules: - name: beta-user grayKeyValue: - "00000002" - "00000003" baseDeployment: version: base grayDeployments: - name: beta-user version: gray enabled: true[有効化] スイッチをオンにします。 [ターゲット] ドロップダウンリストで、
*(すべてのドメイン) を選択します。 [OK] をクリックします。
ステップ 3:ゲートウェイへのサービスソースの追加
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの ID をクリックします。
-
左側のナビゲーションウィンドウで、Routes をクリックします。 次に、[ソース] タブをクリックします。
Add Source をクリックします。Add Source パネルで、Source Type を Container Service に設定します。ACK/ASK/ACS Cluster には、作成した ACK クラスターを選択し、OK をクリックします。
[K8s Ingress のリッスン] スイッチをオンにします。デフォルトでは、ゲートウェイはすべての名前空間にある Ingress リソースをリッスンします。これを変更するには、[カスタム] をクリックします。[セキュリティグループの承認] セクションで、セキュリティグループとポート範囲 (デフォルトは
1/65535) を確認します。
ステップ 4:サービスの追加
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。
-
ゲートウェイリスト ページで、ゲートウェイの ID をクリックします。
-
左側のナビゲーションウィンドウでRoutesをクリックし、次に[サービス]タブをクリックします。
Add Service をクリックします。Add Service パネルで、サービスパラメーターを設定し、OK をクリックします。
[サービスソース] を [コンテナサービス] に設定します。[名前空間] で、[default] を選択します。サービスリストで、frontend-base-svc と frontend-gray-svc のチェックボックスを選択します。
ステップ 5:ベースルートの追加
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択し、[ゲートウェイ] ページでゲートウェイの ID をクリックします。
-
左側のナビゲーションウィンドウで、Routes をクリックします。Routes タブで、Add Route をクリックします。
Add Route ページで、パラメーターを設定し、Save and Advertise をクリックします。
[ルート名] を
base-routeに設定します。[パス] には、[プレフィックス] を選択し、/を入力します。[宛先] には、[単一サービス] を選択します。[サービス名] には、frontend-base-svcを選択します。[サービスプロトコル] をHTTPに、[サービスポート] を80に、[タイムアウト] を60秒に設定します。
ステップ 6:カナリアルートの追加
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの ID をクリックします。
-
左側のナビゲーションウィンドウで、Routes をクリックします。Routes タブで、Add Route をクリックします。
Add Route ページで、パラメーターを設定し、Save and Advertise をクリックします。
[ルート名] を
gray-routeに、[ドメイン] を*に設定します。[パス] には、プレフィックス一致を選択して/を入力します。[リクエストヘッダー] セクションで新しいエントリを追加し、ヘッダー名をx-higress-tagに、条件をプレフィックスに、値をgrayに設定します。宛先には、[単一サービス] を選択し、[サービス名] としてfrontend-gray-svcを選択します。サービスプロトコルを HTTP に、ポートを 80 に設定します。説明値
grayはカナリアバージョンを表し、frontend-grayプラグイン構成のgrayDeployments.version設定に対応します。
ステップ 7:結果の検証
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの ID をクリックします。
Overview ページで、アクセスポイント タブをクリックして、パブリックエンドポイントを表示します。
NLB インスタンスのエンドポイントアドレスが生成され、[関連付けステータス] が [関連付け済み] であることを確認します。
パブリックエンドポイント
nlb-qv04p*******cn-hangzhou.nlb.aliyuncsslb.comにアクセスし、admin/iceアカウントでログインすると、ベースバージョンにアクセスできます。ユーザー ID は 00000001 です。パブリックエンドポイント
nlb-qv04p*******cn-hangzhou.nlb.aliyuncsslb.comにアクセスします。標準ユーザーアカウントuser/iceでログインし、カナリアバージョンにアクセスします。ユーザー ID は 00000002 です。
ECS インスタンスを使用したフロントエンドアプリケーションのカナリアリリースの実装
ステップ 1:ECS インスタンスへの 2 つのフロントエンドアプリケーションバージョンのデプロイ
ベースアプリケーションのエンドポイント:
120.***.137.243:80カナリアアプリケーションのエンドポイント:
120.***.137.243:8081
ステップ 2:サービスの追加
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。
-
ゲートウェイリスト ページで、ゲートウェイの ID をクリックします。
-
左側のナビゲーションウィンドウで、Routes をクリックします。次に、[サービス] タブをクリックします。
Add Service をクリックします。Add Service パネルで、Fixed Address を Fixed Address に設定し、サービスパラメーターを設定した後、OK をクリックします。
[サービス名] を
frontend-base-svcに設定します。[サービスアドレス] には、サーバーの IP アドレスとポートをip:port形式で入力します。各アドレスは改行して入力します。パブリック IP アドレスを使用する場合、VPC で NAT ゲートウェイを設定する必要があります。[TLS モード] を [無効] に設定し、次に [OK] をクリックします。
ステップ 3:ベースルートの追加
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。
-
ゲートウェイリスト ページで、ゲートウェイの ID をクリックします。
-
左側のナビゲーションウィンドウで、Routes をクリックします。Routes タブで、Add Route をクリックします。
Add Route ページで、パラメーターを設定し、Save and Advertise をクリックします。
[ルート名] を
base-routeに設定し、[パス] には [プレフィックスが] を選択して/を入力します。[宛先] には [単一サービス] を選択し、[サービス名] にはfrontend-base-svcを選択します。[サービスプロトコル] をHTTPに、[サービスポート] を80に、[タイムアウト] を60秒に設定します。
このセクションでは、カナリアサービスのパラメーターについて説明します。[サービス名] を frontend-gray-svc に設定します。[サービスアドレス] には、対象のサービスの IP アドレスとポートを ip:port フォーマットで入力します。各アドレスは改行して入力します。パブリック IP アドレスを使用する場合は、VPC で NAT ゲートウェイを設定する必要があります。[TLS モード] を [無効] に設定します。
ステップ 4:カナリアルートの追加
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。
-
ゲートウェイリスト ページで、ゲートウェイの ID をクリックします。
-
左側のナビゲーションウィンドウで、Routes をクリックします。Routes タブで、Add Route をクリックします。
Add Route ページで、パラメーターを設定し、Save and Advertise をクリックします。
説明値
grayはカナリアバージョンを表し、frontend-grayプラグイン構成のgrayDeployments.version設定に対応します。[ルート名] を
gray-routeに、[ドメイン] を*に設定します。[パス] では、プレフィックス一致を選択して/を入力します。[リクエストヘッダー] セクションで新しいエントリを追加し、ヘッダー名をx-higress-tagに、条件を「前方一致」に、値をgrayに設定します。宛先では [単一サービス] を選択し、[サービス名] としてfrontend-gray-svcを選択します。サービスプロトコルを HTTP に、ポートを 80 に設定します。
ステップ 5:MSE コンソールでの frontend-gray プラグインの設定
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト の順に選択します。
-
ゲートウェイリスト ページで、ゲートウェイの ID をクリックします。
-
左側のナビゲーションウィンドウで、Plug-in Marketplace をクリックします。
Plug-in Marketplace ページで、
frontend-grayを検索し、frontend-grayプラグインカードをクリックします。表示されたページで、Plug-in Configuration タブをクリックし、ルールレベルセクションで Domain-level plug-in rules を選択して、Add Rule をクリックします。Add Rule パネルで、次のルールを構成します。構成の詳細については、「ルールの構成」をご参照ください。
grayKey: userid rules: - name: beta-user grayKeyValue: - "00000002" - "00000003" baseDeployment: version: base grayDeployments: - name: beta-user version: gray enabled: true[有効化] スイッチをオンにします。[ターゲット] ドロップダウンリストで、
*(すべてのドメイン) を選択します。[OK] をクリックします。
ステップ 6:結果の検証
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの ID をクリックします。
Overview ページで、アクセスポイント タブをクリックすると、パブリックエンドポイントが表示されます。
NLB インスタンスのエンドポイントアドレスが生成され、[関連付けステータス] が [関連付け済み] であることを確認します。
パブリックエンドポイント
nlb-qv04p*******cn-hangzhou.nlb.aliyuncsslb.comにアクセスします。admin/iceアカウントでログインして、ベースバージョンにアクセスします。 ユーザー ID は 00000001 です。パブリックエンドポイント
nlb-qv04p*******cn-hangzhou.nlb.aliyuncsslb.comにアクセスします。 標準ユーザーアカウントuser/iceでログインして、カナリアバージョンにアクセスします。 ユーザー ID は 00000002 です。
CDN または OSS を使用したフロントエンドアプリケーションのカナリアリリースの実装
ステップ 1:OSS ファイルの準備
ステップ 2:サービスの追加
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。
-
ゲートウェイリスト ページで、ゲートウェイの ID をクリックします。
-
左側のナビゲーションウィンドウで、Routes をクリックします。次に、[サービス] タブをクリックします。
Add Service をクリックします。Add Service パネルで、DNS Domain Name を DNS Domain Name に設定し、ドメインリストに OSS アドレスを入力してから、OK をクリックします。
[サービス名] を
static-ossに、 [サービスポート] を80に、 [TLS モード] を [無効] に設定します。重要OSS とゲートウェイが同じリージョンにデプロイされている場合は、OSS の内部エンドポイントを入力することを推奨します。OSS とゲートウェイが異なるリージョンにデプロイされている場合は、パブリックエンドポイントを入力します。
ステップ 3:ルートの追加
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。
-
ゲートウェイリスト ページで、ゲートウェイの ID をクリックします。
-
左側のナビゲーションウィンドウで、Routes をクリックします。Routes タブで、Add Route をクリックします。
Add Route ページで、パラメーターを設定し、Save and Advertise をクリックします。
パラメーターの例: [ルート名] に
project-a-app-1を、[ドメイン] に [*] を設定します。[パス] では、[プレフィックス] を選択し、/app1と入力して、[大文字と小文字を区別] チェックボックスを選択します。[宛先] では、[単一サービス] を選択します。[バックエンドサービス] セクションで、[サービス名] として static-oss を、[サービスプロトコル] として HTTP を、[サービスポート] として 80 を選択します。[タイムアウト] を 60 秒に設定します。
ステップ 4:MSE コンソールでの frontend-gray プラグインの設定
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。
-
ゲートウェイリスト ページで、ゲートウェイの ID をクリックします。
-
左側のナビゲーションウィンドウで、Plug-in Marketplace をクリックします。
Plug-in Marketplace ページで、
frontend-grayを検索し、frontend-grayプラグインカードをクリックします。表示されたページで、Plug-in Configuration タブをクリックし、「ルールレベル」セクションで Domain-level plug-in rules を選択して、Add Rule をクリックします。Add Rule パネルで、次のルールを構成します。構成の詳細については、「ルールの構成」をご参照ください。
grayKey: userid rules: - name: beta-user grayKeyValue: - "00000002" - "00000003" rewrite: host: xx.oss-cn-shanghai.aliyuncs.com ## OSS エンドポイント indexRouting: "/app1": "/project-a/app1/{version}/index.html" # HTML ホームページのパス書き換え fileRouting: "/app1": "/project-a/app1/{version}" # CSS プロパティ、JavaScript スクリプト、画像などのリソースのパス書き換え baseDeployment: version: dev grayDeployments: - name: beta-user version: 0.0.1 enabled: true
ステップ 5:結果の検証
-
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの ID をクリックします。
Overview ページで、アクセスポイント タブをクリックしてパブリックエンドポイントを表示します。
NLB インスタンスのエンドポイントアドレスが生成され、[関連付けステータス] が [関連付け済み] であることを確認します。
パブリックエンドポイント
nlb-qv04p*******cn-hangzhou.nlb.aliyuncsslb.comにアクセスします。admin/iceアカウントでログインして、ベースバージョンにアクセスします。ユーザー ID は 00000001 です。パブリックエンドポイント
nlb-qv04p*******cn-hangzhou.nlb.aliyuncsslb.comにアクセスします。標準ユーザーアカウントuser/iceでログインして、カナリアバージョンにアクセスします。ユーザー ID は 00000002 です。
よくある質問
書き換えポリシーとフロントエンドアプリケーションのカナリアリリースを同時に設定できますか?
サービスソースが CDN または OSS でない場合、フロントエンドアプリケーションのカナリアリリースと書き換えポリシーを同時に設定し、有効にすることができます。
サービスソースが CDN または OSS の場合、フロントエンドアプリケーションのカナリアリリースと書き換えポリシーを同時に設定することはできません。これは、関連する書き換えポリシーがすでに frontend-gray プラグインに実装されているためです。書き換えポリシーを設定すると、競合が発生する可能性があります。その結果、状態コード 403 などのエラーが返されます。
HTML ホームページにグローバル変数を注入できますか?
HTML ページの <head> タグ (通常は CSS スタイルなどのプロパティ) または HTML ページの <body> タグの最初と最後の位置に、いくつかのグローバルな JavaScript スクリプトを注入します。
injection を使用して、HTML ホームページにコードを注入します。コードは <head> タグ、または <body> タグの最初と最後の位置に注入できます。
grayKey: userid
rules:
- name: inner-user
grayKeyValue:
- '00000001'
- '00000005'
baseDeployment:
version: base
grayDeployments:
- name: beta-user
version: gray
enabled: true
weight: 80
injection:
head:
- <script>console.log('Header')</script>
body:
first:
- <script>console.log('hello world before')</script>
- <script>console.log('hello world before1')</script>
last:
- <script>console.log('hello world after')</script>
- <script>console.log('hello world after2')</script>カナリアバージョンはいつ有効になりますか?
あるユーザーがフロントエンドアプリケーションのバージョン 0.0.1 を使用しているとします。バージョン 0.0.2 をリリースし、そのユーザーがカナリアルールに一致した場合、新しいバージョンはすぐに有効になりますか?
これには、以下の理由があります:
カナリアバージョンをリアルタイムで有効にする必要がある場合、バックエンドは動的にバージョンを制御する必要があります。フロントエンドのリリースはバックエンドのリリースから切り離すことができません。ページの安定性はインターフェイスに強く依存するため、CDN アクセラレーションは実行できません。
カナリアバージョンがリアルタイムで有効になると、顧客が特定の機能を使用しているときに、使用中のボタンがいつでも利用できなくなる可能性があります。これにより、ユーザーエクスペリエンスが低下します。
ページはいつリフレッシュできますか?
ほとんどの場合、セッションがタイムアウトした後にウェブサイトに再ログインする必要があります。
ログインページでアプリケーションにログインできます。
したがって、ログインプロセス中にページをリフレッシュして、最新のカナリアリリース情報をフェッチする必要があります。以下の例は、フロントエンドのログインコードを示しています:
async function handleLogin(values: LoginParams) {
try {
const result = await login(values);
if (result.success) {
message.success ('ログインに成功しました。');
await updateUserInfo();
const urlParams = new URL(window.location.href).searchParams;
window.location.href = `${urlParams.get('redirect') || '/'}`;
return;
}
console.log(result);
// ログイン失敗時に返されるエラーメッセージを設定します。以下のコードはエラーメッセージのサンプルです。
setLoginResult(result);
} catch (error) {
message.error('ログインに失敗しました。もう一度お試しください。');
console.log(error);
}
}