トラフィックレーンは、特定のサービスバージョンを独立した実行環境に分離し、アプリケーションコードの変更を一切行わずに、リクエストを完全な呼び出しチェーン全体にルーティングします。これにより、複数のサービスにまたがるエンドツーエンドカナリアリリースを同時に実行できます。
トラフィックレーンを利用する理由
標準的な Kubernetes カナリアデプロイメントでは、トラフィックのディストリビューションとレプリカ数が密接に連動しています。たとえば、10 % のトラフィックをカナリア環境に送信するには、1 台のカナリアレプリカと 9 台の安定版レプリカを同時に起動する必要があります。このアプローチは、以下の 2 つのシナリオで機能しなくなります。
マルチサービス呼び出しチェーン。 サービス A → B → C へと流れるリクエストは、各ホップで一貫したバージョンルーティングを保証する必要があります。Kubernetes には、このような要件を満たす組み込みの仕組みは存在しません。
独立したスケーリング。 トラフィックレーンでは、トラフィックのディストリビューションとレプリカ数が完全に分離されています。単一のカナリアレプリカでも、指定したパーセンテージのトラフィックを正確に受信でき、安定版レプリカの稼働台数には一切影響されません。
ASM トラフィックレーンは、イングレスゲートウェイでリクエストにタグを付与し、そのタグを呼び出しチェーン全体に伝播させることで、上記の両方の課題を解決します。
仕組み
コンソールからトラフィックレーンを構成すると、自動的に 3 つの Istio リソースが生成されます。
| リソース | 目的 |
|---|---|
| TrafficLabel | ASM_TRAFFIC_TAG Pod ラベルに基づき、各リクエストにラベルを割り当てます |
| DestinationRule | レーン名をサービスバージョンのサブセットにマッピングします |
| VirtualService | x-asm-prefer-tag ヘッダーおよび URI に基づき、リクエストを適切なサブセットにルーティングします |
ルーティングの流れは以下のとおりです。
ヘッダー
x-asm-prefer-tag: <lane-name>を含むリクエストがイングレスゲートウェイに到着します。VirtualService がヘッダーおよび URI を照合し、最初のサービスの対応するサブセットにリクエストをルーティングします。
TrafficLabel が、後続のサービス間通信においてもレーンタグを伝播させ、リクエストを呼び出しチェーン全体を通じて同一のレーン内に維持します。
シナリオの概要
本チュートリアルでは、3 つのレーン(s1、s2、s3)をデプロイし、それぞれ異なるバージョンに紐付けられた 3 つのサービス(mocka、mockb、mockc)を含めます。
| レーン | サービスタグ | サービス |
|---|---|---|
| s1 | v1 | mocka、mockb、mockc |
| s2 | v2 | mocka、mockb、mockc |
| s3 | v3 | mocka、mockb、mockc |
設定完了後、x-asm-prefer-tag: s1 を含むリクエストは、すべての 3 つのサービスで v1 のみを通過し、s2 を含むリクエストは v2、s3 を含むリクエストは v3 を通過します。

前提条件
開始する前に、以下の条件を満たしていることを確認してください。
Enterprise Edition または Ultimate Edition の ASM インスタンス(バージョン 1.17.2.22 以降)。詳細については、「ASM インスタンスの作成」または「ASM インスタンスの更新」をご参照ください。
ASM インスタンスに追加されたクラスター。詳細については、「ASM インスタンスへのクラスターの追加」をご参照ください。
ingressgatewayという名前の ASM ゲートウェイ。詳細については、「イングレスゲートウェイサービスの作成」をご参照ください。ingressgatewayという名前の Istio ゲートウェイ(istio-system名前空間内)。詳細については、「Istio ゲートウェイの管理」をご参照ください。
ステップ 1:サンプルサービスのデプロイ
自動サイドカープロキシ注入の有効化
ASM コンソール にログインします。左側のナビゲーションウィンドウで、Service Mesh > Mesh Management を選択します。
Mesh Management ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、ASM Instance > Global Namespace を選択します。
Global Namespace ページで、default 名前空間を見つけ、Automatic Sidecar Injection 列の Enable Automatic Sidecar Injection をクリックします。Submit メッセージで、OK をクリックします。
詳細については、「自動サイドカープロキシ注入の有効化」をご参照ください。
サービスのデプロイ
ACK クラスター内で、サンプルサービスの v1、v2、v3 をデプロイします。
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v1/application-v1.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v2/application-v2.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v3/application-v3.yamlステップ 2:レーングループおよびレーンの作成
レーングループの作成
ASM コンソール にログインします。左側のナビゲーションウィンドウで、Service Mesh > Mesh Management を選択します。
Mesh Management ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、Traffic Management Center > Traffic Lane を選択します。
Traffic Lane ページで、Create Swimlane Group をクリックします。Create Swimlane Group パネルで、以下のパラメーターを設定し、OK をクリックします。
| パラメーター | 値 |
|---|---|
| Swim lane group の名前 | test |
| 入口ゲートウェイ | ingressgateway |
| Swimlane Services | Kubernetes Clusters ドロップダウンリストから ACK クラスターを選択し、名前空間ドロップダウンリストから default を選択します。サービス一覧から mocka、mockb、mockc を選択し、 |
レーングループを作成すると、ASM により TrafficLabel リソースが自動生成されます。
レーンの作成
3 つのレーン(s1、s2、s3)を作成し、それぞれに対応するサービスバージョンを紐付けます。以下は s1 レーンの作成手順です。s2(サービスタグ:v2)、s3(サービスタグ:v3)についても同様の手順を繰り返します。
Traffic Lane ページの Traffic Rule Definition セクションで、Create swimlanes をクリックします。
Create swimlanes ダイアログボックスで、以下のパラメーターを設定し、OK をクリックします。
| パラメーター | 値 |
|---|---|
| Swimlane Name | s1 |
| Configure Service Tag | v1 |
| Add Service | mocka(default)、mockb(default)、mockc(default) |
ヘッダー x-asm-prefer-tag: s1 を含むリクエストは、各サービスの v1 サブセットにルーティングされます。

3 つのレーンの作成が完了すると、Traffic Rule Definition セクションに以下のように表示されます。

各レーンの作成時に DestinationRule が生成されます。以下は s1 レーンの DestinationRule の例です。
イングレストラフィックルールの作成
各レーンに対してトラフィックルーティングルールを作成します。以下は s1 レーンのルール作成手順です。s2 および s3 についても同様の手順を繰り返します。
本例では、すべてのレーンサービスがインバウンドリクエストパス /mock を共有していると仮定します。
Traffic Lane ページの Traffic Rule Definition セクションで、対象のレーンを見つけ、Actions 列の Ingress traffic rules をクリックします。
Add drainage rule ダイアログボックスで、以下のパラメーターを設定し、OK をクリックします。
| パラメーター | 値 |
|---|---|
| Ingress service | mocka.default.svc.cluster.local |
| Ingress traffic rules | Name: r1、realm name: * |
| Matching request URI | Method: Exact、Content: /mock |
3 つのレーンすべてに対するトラフィックルーティングルールを作成すると、Traffic Rule Definition セクションに以下のように表示されます。

ASM は、x-asm-prefer-tag ヘッダーに基づいてリクエストをルーティングする VirtualService を生成します。
ステップ 3:エンドツーエンドカナリアリリースの検証
ゲートウェイ IP アドレスの取得
ASM イングレスゲートウェイのパブリック IP アドレスを取得します。詳細については、「クラウドネイティブ推論サービス KServe と ASM の統合」のステップ 2 をご参照ください。
IP アドレスを環境変数として設定します。<gateway-ip-address> を実際のパブリック IP アドレスに置き換えます。
export ASM_GATEWAY_IP=<gateway-ip-address>各レーンのテスト
各レーンに 100 回のリクエストを送信し、トラフィックが期待されるサービスバージョン内に留まっていることを確認します。
レーン s1(期待結果:すべて v1):
for i in {1..100}; do curl -H 'x-asm-prefer-tag: s1' http://${ASM_GATEWAY_IP}/mock; echo ''; sleep 1; done;期待される出力:
-> mocka(version: v1, ip: 172.17.0.54)-> mockb(version: v1, ip: 172.17.0.129)-> mockc(version: v1, ip: 172.17.0.130)3 つのサービスすべてが v1 を返すため、x-asm-prefer-tag: s1 でタグ付けされたリクエストが s1 レーン内でのみルーティングされることを確認できます。
レーン s2(期待結果:すべて v2):
for i in {1..100}; do curl -H 'x-asm-prefer-tag: s2' http://${ASM_GATEWAY_IP}/mock; echo ''; sleep 1; done;期待される出力:
-> mocka(version: v2, ip: 172.17.0.9)-> mockb(version: v2, ip: 172.17.0.126)-> mockc(version: v2, ip: 172.17.0.128)レーン s3(期待結果:すべて v3):
for i in {1..100}; do curl -H 'x-asm-prefer-tag: s3' http://${ASM_GATEWAY_IP}/mock; echo ''; sleep 1; done;期待される出力:
-> mocka(version: v3, ip: 172.17.0.132)-> mockb(version: v3, ip: 172.17.0.127)-> mockc(version: v3, ip: 172.17.0.69)ルーティング問題のトラブルシューティング
いずれかのリクエストで不正なバージョンが返された場合、以下の項目を確認してください。
| 症状 | 考えられる原因 | 解決策 |
|---|---|---|
| 応答に誤ったバージョンが表示される | ASM_TRAFFIC_TAG Pod ラベルが、レーンで構成されたサービスタグと一致していない | kubectl get pods --show-labels を使用して Pod ラベルを確認し、レーン構成と一致することを確認します |
| 応答がない、または 404 エラーが発生する | VirtualService のルートが、x-asm-prefer-tag ヘッダー値または URI と一致していない | VirtualService YAML を確認し、ヘッダーの照合ルールおよび URI パスが正しいことを確認します |
| レーン間でトラフィックが漏洩する | DestinationRule のサブセットが、レーン名とバージョンラベルを正しくマッピングしていない | DestinationRule YAML を確認し、各サブセットが正しい ASM_TRAFFIC_TAG 値をマッピングしていることを確認します |
| ルーティング失敗が断続的に発生する | 一部の Pod にサイドカープロキシが注入されていない | kubectl get pods -o jsonpath='{.items[*].spec.containers[*].name}' を実行し、すべての Pod に istio-proxy コンテナが存在することを確認します |
(任意)ステップ 4:メッシュトポロジーの確認
ASM コンソールで「Mesh Topology」が有効になっている場合、トポロジーグラフを確認することで、レーン間のリクエストパスを可視化できます。詳細については、「ASM コンソールで ASM インスタンスを観測するための Mesh Topology の有効化」をご参照ください。
次のステップ
トラフィックのラベル付け — トラフィックラベリングの概念および詳細設定について詳しく学習します