Spring Cloud Gateway と Zuul は、マイクロサービスアーキテクチャで一般的に使用される API ゲートウェイであり、ルート転送とフィルター処理をサポートしています。ルーティングルールを設定して、カナリアバージョンの検証とテストのためにリクエストをカナリア環境にルーティングできます。Microservices Engine (MSE) のエンドツーエンドカナリアリリース機能を使用すると、ビジネスコードを変更することなく、エンドツーエンドのトラフィック制限を実装できます。このトピックでは、Spring Cloud Gateway または Zuul ゲートウェイを設定して、エンドツーエンドカナリアリリースを有効にする方法について説明します。
前提条件
背景情報
このトピックでは、MSE を使用して、実際のサービスコールチェーンをシミュレートすることにより、エンドツーエンドカナリアリリースを実行する方法を説明します。アプリケーションコードを変更することなく、この機能を実現できます。Ingress アプリケーションのトラフィックルールを設定するだけで、MSE はこのタグをサービスコールチェーン全体に伝播させます。各サービスコール中、MSE はカナリア条件に一致するトラフィックを対応するカナリアバージョンに優先的にルーティングします。対応するカナリアバージョンが存在しない場合、トラフィックは自動的にベースバージョン (安定バージョンとも呼ばれます) にフォールバックします。
この例では、4 つのビジネスアプリケーション (spring-cloud-gateway、spring-cloud-a、spring-cloud-b、spring-cloud-c) と、レジストリとして機能する Nacos Server がデプロイされています。サービスコールチェーンは、spring-cloud-gateway->A->B->C です。
アプリケーション間の呼び出しには、Spring Cloud と Dubbo の両方のサービス呼び出しが含まれます。
エンドツーエンドカナリアリリースでは、トラフィックマークを使用してカナリアトラフィックをカナリアノードに優先的にルーティングします。これにより、制御されたカナリア検証を実行し、システムの安定性を確保できます。
エンドツーエンドカナリアリリースの検証では、通常、次の戦略が使用されます。
-
テストのために、本番環境のライブトラフィックのわずかな割合をカナリアバージョンに誘導します。
-
指定されたヘッダーや Cookie などの特定のルールに基づいて、本番環境のライブトラフィックをフィルタリングします。
このトピックでは、マイクロサービスアーキテクチャ内のさまざまなカナリアリリースシナリオをサポートするために、これら両方の戦略を設定する方法について説明します。
ステップ 1:アプリケーションを MSE に接続
Container Service for Kubernetes (ACK) クラスター内のマイクロサービスアプリケーションを Microservice Engine (MSE) に接続します。要件に応じて接続メソッドを選択できます。詳細については、「ACK クラスター内のマイクロサービスアプリケーションを Microservice Engine (MSE) に接続する」をご参照ください。
名前空間による接続
-
Microservice Engine (MSE) コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
-
左側のナビゲーションウィンドウで、Microservices Governance > Application Governance の順に選択します。
-
Application list ページで、ACK Application Access をクリックします。
-
ACK Application Access ダイアログボックスで、パラメーターを設定し、OK をクリックします。
パラメーター
説明
Cluster type
ACK Cluster、ACK Serverless Cluster、または ACS Cluster を選択します。
説明Container Service が Microservice Engine (MSE) にアクセスすることを認可していない場合は、[認可] をクリックします。
Cluster Name/ID
ターゲットクラスターの Cluster Name/ID を選択します。キーワードで検索できます。
ack-onepilot
ack-onepilot の接続ステータスが表示されます。ack-onepilot コンポーネントとそのアップグレード方法の詳細については、「ack-onepilot コンポーネント」および「Microservice Engine (MSE) コンポーネントのインストールとアップグレード」をご参照ください。
-
ack-onepilot がインストールされていない場合、ACK クラスターを選択すると、システムが自動的にインストールを開始します。「インストールには約 1 分かかります」というメッセージが表示されます。
RAM ユーザー を使用していて権限エラーが発生した場合は、Container Service for Kubernetes コンソールにログインし、ターゲットクラスターに移動して [コンポーネント管理] をクリックし、ack-onepilot を見つけて [インストール] をクリックします。
-
ack-onepilot がすでにインストールされている場合、コンソールには「インストール済み」というステータスとバージョン番号が表示されます (例:インストール済み 4.2.0)。
説明-
このステップでは、ack-onepilot コンポーネントを接続します。詳細を表示するには、Container Service for Kubernetes コンソールにログインし、ターゲットクラスターに移動して、[運用保守] > [コンポーネント管理] を選択します。
-
ack-onepilot がインストールされると、自動的にプローブが注入され、アプリケーションの起動時間が最大 10 秒増加する可能性があります。
-
名前空間ベースのメソッドを使用してアプリケーションを接続する場合、ターゲットクラスターが次のいずれかのリージョンにない場合は、クラスターがパブリックネットワークにアクセスし、acm.aliyun.com:8080 に接続できることを確認してください:中国 (青島)、中国 (杭州)、中国 (北京)、中国 (上海)、中国 (上海-金融)、中国 (深セン)、中国 (香港)、シンガポール、ドイツ (フランクフルト)、オーストラリア (シドニー)、米国 (シリコンバレー)、米国 (バージニア)。
Access Type
Namespace Access を選択します。
Cluster Namespace
Cluster Namespace を選択します。
Microservices Governance Namespace
Microservices Governance Namespace を選択します。
-
単一アプリケーションによる接続
-
Microservice Engine (MSE) コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
-
左側のナビゲーションウィンドウで、Microservices Governance > Application Governance の順に選択します。
-
Application list ページで、ACK Application Access をクリックします。
-
ACK Application Access ダイアログボックスで、パラメーターを設定し、OK をクリックします。
パラメーター
説明
Cluster type
ACK Cluster、ACK Serverless Cluster、または ACS Cluster を選択します。
説明Container Service が Microservice Engine (MSE) にアクセスすることを認可していない場合は、[認可] をクリックします。
Cluster Name/ID
ターゲットクラスターの Cluster Name/ID を選択します。キーワードで検索できます。
ack-onepilot
ack-onepilot の接続ステータスが表示されます。ack-onepilot コンポーネントとそのアップグレード方法の詳細については、「ack-onepilot コンポーネント」および「Microservice Engine (MSE) コンポーネントのインストールとアップグレード」をご参照ください。
-
ack-onepilot がインストールされていない場合、ACK クラスターを選択すると、システムが自動的にインストールを開始します。「インストールには約 1 分かかります」というメッセージが表示されます。
RAM ユーザー を使用していて権限エラーが発生した場合は、Container Service for Kubernetes コンソールにログインし、ターゲットクラスターに移動して [コンポーネント管理] をクリックし、ack-onepilot を見つけて [インストール] をクリックします。
-
ack-onepilot がすでにインストールされている場合、コンソールには「インストール済み」というステータスとバージョン番号が表示されます (例:インストール済み 4.2.0)。
説明-
このステップでは、ack-onepilot コンポーネントを接続します。詳細を表示するには、Container Service for Kubernetes コンソールにログインし、ターゲットクラスターに移動して、[運用保守] > [コンポーネント管理] を選択します。
-
ack-onepilot がインストールされると、自動的にプローブが注入され、アプリケーションの起動時間が最大 10 秒増加する可能性があります。
-
名前空間ベースのメソッドを使用してアプリケーションを接続する場合、ターゲットクラスターが次のいずれかのリージョンにない場合は、クラスターがパブリックネットワークにアクセスし、acm.aliyun.com:8080 に接続できることを確認してください:中国 (青島)、中国 (杭州)、中国 (北京)、中国 (上海)、中国 (上海-金融)、中国 (深セン)、中国 (香港)、シンガポール、ドイツ (フランクフルト)、オーストラリア (シドニー)、米国 (シリコンバレー)、米国 (バージニア)。
Access Type
Single Application Access を選択します。
Access Procedure
表示される手順に従います。
ステップ 1:クラスターの [ワークロード] > [デプロイメント] ページに移動し、アプリケーションの名前空間に切り替えます。
ステップ 2:ターゲットアプリケーションを見つけて [YAML の表示] をクリックします。
ステップ 3:次の形式でラベルを編集し、[更新] をクリックします。
spec: template: metadata: labels: # 接続を有効にするには "on" に設定します。値は二重引用符で囲む必要があります。 msePilotAutoEnable: "on" # ガバナンス名前空間を指定します。名前空間が存在しない場合は、自動的に作成されます。 mseNamespace: default # MSE に接続するアプリケーション名を指定します。名前は二重引用符で囲む必要があります。 msePilotCreateAppName: "your-deployment-name" -
ステップ 2:アプリケーションのデプロイ
-
Container Service for Kubernetes (ACK) コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト を選択します。
-
クラスターリスト ページで、ターゲットクラスターをクリックします。左側のナビゲーションウィンドウで、 の順に選択します。
-
[デプロイメント] ページで、Namespaces を選択し、[YAML から作成] をクリックします。
この例では、レジストリとして Nacos Server をデプロイし、4 つのビジネスアプリケーション (spring-cloud-gateway、spring-cloud-a、spring-cloud-b、spring-cloud-c) をデプロイします。ソースコードは デモからも入手できます。
-
Nacos Server (レジストリ) の YAML
-
spring-cloud-c アプリケーションの YAML
-
spring-cloud-b アプリケーションの YAML
-
spring-cloud-a アプリケーションの YAML
-
spring-cloud-gateway アプリケーションの YAML
次のコマンドを実行して、デプロイメントのステータスを確認します。
kubectl get svc,deploy期待される出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 172.16.x.x <none> 443/TCP 23h service/nacos-server ClusterIP 172.16.x.x <none> 8848/TCP,9848/TCP 94s service/spring-cloud-gateway-slb LoadBalancer 172.16.x.x 8.130.x.x 80:32641/TCP 57s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nacos-server 1/1 1 1 94s deployment.apps/spring-cloud-a 1/1 1 1 66s deployment.apps/spring-cloud-b 1/1 1 1 74s deployment.apps/spring-cloud-c 1/1 1 1 83s deployment.apps/spring-cloud-gateway 1/1 1 1 57s -
ステップ 3:spring-cloud-c と spring-cloud-a のカナリアバージョンをデプロイ
-
ACK コンソールにログインします。 次の YAML を使用して、spring-cloud-c アプリケーションのカナリアバージョンをデプロイします。
-
次の YAML を使用して、spring-cloud-a アプリケーションのカナリアバージョンをデプロイします。
ステップ 4:カナリアレーングループの作成
-
MSE ガバナンスセンターコンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
-
左側のナビゲーションウィンドウで、 の順に選択します。
-
End-to-end Canary Release ページで、ページ上部のマイクロサービス名前空間を選択します。選択したマイクロサービス名前空間にレーングループが存在しない場合は、[レーングループとレーンの作成] をクリックします。レーングループが既に存在する場合は、[+ レーングループの作成] をクリックします。
-
[レーングループの作成] パネルで、[+ レーングループの作成] をクリックします。[レーングループの作成] ページで、次のパラメーターを設定し、OK をクリックします。
パラメーター
説明
レーングループ名
レーングループのカスタム名を入力します。
Ingress タイプ
[Java サービスゲートウェイ] を選択します。
Ingress アプリケーション
[spring-cloud-gateway] を選択します。
レーングループアプリケーション
spring-cloud-a、spring-cloud-b、および spring-cloud-c を選択します。
レーングループが作成されると、End-to-end Canary Release ページの [レーングループ] セクションで表示できます。レーングループを編集するには、
アイコンをクリックします。
ステップ 5:カナリアレーンの作成
-
エンドツーエンドカナリアリリース機能を使用するには、他のノードと区別するために、カナリアアプリケーションに特別な
tagを追加します。コンテナ環境では、spec.template.metadata.labelsの下にalicloud.service.tag: ${tag}を追加します。ECS 環境では、Java 起動パラメーター-Dalicloud.service.tag=${tag}を追加します。 -
エンドツーエンドカナリアリリースの Ingress として Java マイクロサービスゲートウェイを使用する場合、MSE は 2 つのレーンルーティングモードをサポートします。
-
コンテンツによるカナリアリリース:リクエストのコンテンツからカナリアトラフィックを識別できる場合に推奨されるモードです。識別できない場合は、システムを変更してリクエストに一意の識別子を含めるようにしてください。これにより、セッション内のすべてのリクエストが一貫してルーティングされるようになります。
-
比率によるカナリアリリース:リクエストのコンテンツからカナリアトラフィックを識別できず、レガシーシステムを変更できない場合のフォールバックとしてこのモードを使用します。欠点は、同じソースからのリクエストが異なるレーンにルーティングされ、動作に一貫性がなくなる可能性があることです。
-
-
レーンルーティングモードは、レーングループ内のすべてのレーンで一貫している必要があります。ゲートウェイルーティングルールのパスとレーンルーティングモードは、グループ内の最初のレーンを作成するときにのみ調整できます。
-
End-to-end Canary Release ページの下部で、[最初の分割スイムレーンを作成] をクリックします。選択したマイクロサービススペースにスイムレーンがすでに存在する場合は、[スイムレーンを作成] をクリックします。
-
[レーンの作成] パネルで、レーンのパラメーターを設定し、OK をクリックします。
|
パラメーター |
説明 |
|
ノードタグの追加 |
カナリアアプリケーションノードに手動でタグを追加して、通常のノードと区別します。 |
|
レーン情報の入力 |
レーンタグ:レーンルールに一致するトラフィックの宛先タグ。 一致関係の確認:このタグを持つアプリケーションノードの数が正しいことを確認します。 |
|
ルーティングとカナリアリリースルールの設定 |
このレーンにトラフィックをルーティングするためのルールを定義します。
説明
ゲートウェイパスごとに異なるトラフィックの割合を設定することもできます。この機能を使用する場合、すべてのレーングループにわたる同じパスの合計トラフィック割合が 100% を超えないようにしてください。 |
コンテンツによるルート
|
パラメーター |
説明 |
|
ノードタグの追加 |
カナリアアプリケーションノードに手動でタグを追加して、通常のノードと区別します。 |
|
レーン情報の入力 |
レーンタグ:このレーンの条件に一致するトラフィックの宛先タグ。この例では、レーンタグを gray に設定します。 一致関係の確認:このタグを持つアプリケーションノードの数が正しいことを確認します。 |
|
ルーティングとカナリアリリースルールの設定 |
ルーティングルールの条件を設定します。
|
比率によるルート
MSE Java エージェントがバージョン 3.2.3 以降であることを確認してください。そうでない場合、パーセンテージベースのカナリアリリースが正しく機能しない可能性があります。
|
パラメーター |
説明 |
|
ノードタグの追加 |
カナリアアプリケーションノードに手動でタグを追加して、通常のノードと区別します。 |
|
レーン情報の入力 |
レーンタグ:このレーンの条件に一致するトラフィックの宛先タグ。この例では、レーンタグを gray に設定します。 一致関係の確認:このタグを持つアプリケーションノードの数が正しいことを確認します。 |
|
ルーティングとカナリアリリースルールの設定 |
ルーティングルールの条件を設定します。
|
レーンを作成した後、End-to-end Canary Release ページの [トラフィック分散] セクションでその詳細を表示し、次の操作を実行できます。
-
Actions 列で、[有効化] をクリックします。これにより、レーンがアクティブになり、そのルールに従ってトラフィックがルーティングされます。ルールに一致するトラフィックは、対応するレーンタグを持つアプリケーションバージョンに優先的にルーティングされます。そのようなバージョンが存在しない場合、トラフィックはタグ付けされていないアプリケーションバージョンにルーティングされます。
-
Actions 列で、Close をクリックします。これにより、レーンが無効になり、後続のトラフィックはタグ付けされていないアプリケーションバージョンにルーティングされます。
-
アイコンをクリックして、レーンのトラフィックの割合を表示します。 -
アイコンをクリックして、レーン内のアプリケーションのステータスを設定します。
ステップ 6:ベーストラフィックとカナリアトラフィックのテスト
リクエストコンテンツ別
-
次の
curlコマンドを実行して、ベーストラフィックをテストします。curl 8.130.x.x/A/a A[192.168.x.x][config=base] -> B[192.168.x.x] -> C[192.168.x.x]説明コマンド内の
8.130.x.xは、Spring Cloud Gateway によって公開されるパブリック IP アドレスです。 -
次の
curlコマンドを実行して、カナリアトラフィックをテストします。curl 8.130.x.x/A/a?name=xiaoming Agray[192.168.x.x][config=base] -> B[192.168.x.x] -> Cgray[192.168.x.x]説明-
リクエストにパラメーター
name=xiaomingが含まれている場合、それはカナリアタグに一致し、そのタグがダウンストリームに伝播されます。 -
たとえば、アプリケーション A と C に送信されたカナリアタグ付きのリクエストは、アプリケーション A と C のカナリアノードにルーティングされます。
-
リクエストがアプリケーション B に到達すると、アプリケーション B のカナリアノードが存在しないため、ベースノードにルーティングされます。
-
比率別
比率によるトラフィック分割をテストするには、次の Python 3 スクリプトを使用します。requests パッケージがインストールされていることを確認し、x.x.x.x をご利用の Spring Cloud Gateway の Ingress SLB アドレスに置き換えてください。
# pip3 install requests
# python3 traffic.py
import requests
TOTAL_REQUEST = 100
ENTRY_URL = 'http://x.x.x.x/A/a'
def parse_tag(text:str):
'''
A[10.0.23.64][config=base] -> B[10.0.23.65] -> C[10.0.23.61]
Agray[10.0.23.64][config=base] -> B[10.0.23.65] -> Cgray[10.0.23.61]
Ablue[10.0.23.64][config=base] -> B[10.0.23.65] -> Cblue[10.0.23.61]
'''
print(text)
app_parts = text.split(' -> ')
# tag_app: C[10.0.23.61] / Cgray[10.0.23.61]
tag_app = app_parts[-1]
splits = tag_app.split('[')
# tag_part: C / Cgray
tag_part = splits[0]
tag = tag_part[1:]
return tag if len(tag) > 0 else 'base'
def get_tag(url:str):
resp = requests.get(url)
resp.encoding = resp.apparent_encoding
return parse_tag(resp.text)
def cal_tag_count(url:str, total_request:int):
count_map = {}
for i in range(total_request):
tag = get_tag(url)
if tag not in count_map:
count_map[tag] = 1
else:
count_map[tag] += 1
print()
print('Total Request:', total_request)
print('Traffic Distribution:', count_map)
if __name__ == '__main__':
cal_tag_count(ENTRY_URL, TOTAL_REQUEST)
スクリプトを実行すると、出力にはトラフィックの約 30% がカナリア環境にルーティングされていることが示されます。
ステップ 7:可観測性
アプリケーションの問題が発生した場合、MSE の可観測性を使用して例外データを表示し、問題を迅速に特定します。
マイクロサービスガバナンスの可観測性
MSE マイクロサービスガバナンスの End-to-end Canary Release ページで、ターゲットアプリケーションをクリックします。[アプリケーション QPS モニタリング] セクションには、対応するレーンのベースバージョンとカナリアバージョンのトラフィックデータが表示されます。

-
合計 QPS:アプリケーションの合計秒間クエリ数 (QPS)。
例外 QPS:アプリケーションの失敗したリクエスト数。
-
カナリアQPS:アプリケーションのカナリアバージョンの秒間クエリ数 (QPS)。