すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:トラフィックレーンを用いたエンドツーエンドカナリアリリース

最終更新日:Mar 12, 2026

トラフィックレーンは、特定のサービスバージョンを独立した実行環境に分離し、アプリケーションコードの変更を一切行わずに、リクエストを完全な呼び出しチェーン全体にルーティングします。これにより、複数のサービスにまたがるエンドツーエンドカナリアリリースを同時に実行できます。

トラフィックレーンを利用する理由

標準的な Kubernetes カナリアデプロイメントでは、トラフィックのディストリビューションとレプリカ数が密接に連動しています。たとえば、10 % のトラフィックをカナリア環境に送信するには、1 台のカナリアレプリカと 9 台の安定版レプリカを同時に起動する必要があります。このアプローチは、以下の 2 つのシナリオで機能しなくなります。

  • マルチサービス呼び出しチェーン。 サービス A → B → C へと流れるリクエストは、各ホップで一貫したバージョンルーティングを保証する必要があります。Kubernetes には、このような要件を満たす組み込みの仕組みは存在しません。

  • 独立したスケーリング。 トラフィックレーンでは、トラフィックのディストリビューションとレプリカ数が完全に分離されています。単一のカナリアレプリカでも、指定したパーセンテージのトラフィックを正確に受信でき、安定版レプリカの稼働台数には一切影響されません。

ASM トラフィックレーンは、イングレスゲートウェイでリクエストにタグを付与し、そのタグを呼び出しチェーン全体に伝播させることで、上記の両方の課題を解決します。

仕組み

コンソールからトラフィックレーンを構成すると、自動的に 3 つの Istio リソースが生成されます。

リソース目的
TrafficLabelASM_TRAFFIC_TAG Pod ラベルに基づき、各リクエストにラベルを割り当てます
DestinationRuleレーン名をサービスバージョンのサブセットにマッピングします
VirtualServicex-asm-prefer-tag ヘッダーおよび URI に基づき、リクエストを適切なサブセットにルーティングします

ルーティングの流れは以下のとおりです。

  1. ヘッダー x-asm-prefer-tag: <lane-name> を含むリクエストがイングレスゲートウェイに到着します。

  2. VirtualService がヘッダーおよび URI を照合し、最初のサービスの対応するサブセットにリクエストをルーティングします。

  3. TrafficLabel が、後続のサービス間通信においてもレーンタグを伝播させ、リクエストを呼び出しチェーン全体を通じて同一のレーン内に維持します。

シナリオの概要

本チュートリアルでは、3 つのレーン(s1、s2、s3)をデプロイし、それぞれ異なるバージョンに紐付けられた 3 つのサービス(mocka、mockb、mockc)を含めます。

レーンサービスタグサービス
s1v1mocka、mockb、mockc
s2v2mocka、mockb、mockc
s3v3mocka、mockb、mockc

設定完了後、x-asm-prefer-tag: s1 を含むリクエストは、すべての 3 つのサービスで v1 のみを通過し、s2 を含むリクエストは v2、s3 を含むリクエストは v3 を通過します。

Lane mode end-to-end canary release

前提条件

開始する前に、以下の条件を満たしていることを確認してください。

サンプルゲートウェイ YAML

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: ingressgateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway        # ASM イングレスゲートウェイと一致
  servers:
    - port:
        number: 80               # ポート 80 でリッスン
        name: http
        protocol: HTTP
      hosts:
        - '*'                    # すべてのホストからのトラフィックを受け入れる

ステップ 1:サンプルサービスのデプロイ

自動サイドカープロキシ注入の有効化

  1. ASM コンソール にログインします。左側のナビゲーションウィンドウで、Service MeshMesh Management を選択します。

  2. Mesh Management ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、ASM InstanceGlobal Namespace を選択します。

  3. 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:レーングループおよびレーンの作成

レーングループの作成

  1. ASM コンソール にログインします。左側のナビゲーションウィンドウで、Service MeshMesh Management を選択します。

  2. Mesh Management ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、Traffic Management CenterTraffic Lane を選択します。

  3. Traffic Lane ページで、Create Swimlane Group をクリックします。Create Swimlane Group パネルで、以下のパラメーターを設定し、OK をクリックします。

パラメーター
Swim lane group の名前test
入口ゲートウェイingressgateway
Swimlane ServicesKubernetes Clusters ドロップダウンリストから ACK クラスターを選択し、名前空間ドロップダウンリストから default を選択します。サービス一覧から mockamockbmockc を選択し、move アイコンをクリックして selected セクションに追加します

レーングループを作成すると、ASM により TrafficLabel リソースが自動生成されます。

生成された TrafficLabel YAML

apiVersion: istio.alibabacloud.com/v1beta1
kind: TrafficLabel
metadata:
  labels:
    asm-system: 'true'
    provider: asm
  name: asm-trafficlabel-global
  namespace: istio-system
spec:
  rules:
    - labels:
        - name: asm-label
          valueFrom:
            - $getLabel(ASM_TRAFFIC_TAG)   # 各 Pod の ASM_TRAFFIC_TAG ラベルを読み取ります

レーンの作成

3 つのレーン(s1、s2、s3)を作成し、それぞれに対応するサービスバージョンを紐付けます。以下は s1 レーンの作成手順です。s2(サービスタグ:v2)、s3(サービスタグ:v3)についても同様の手順を繰り返します。

  1. Traffic Lane ページの Traffic Rule Definition セクションで、Create swimlanes をクリックします。

  2. Create swimlanes ダイアログボックスで、以下のパラメーターを設定し、OK をクリックします。

パラメーター
Swimlane Names1
Configure Service Tagv1
Add Servicemocka(default)mockb(default)mockc(default)
説明

ヘッダー x-asm-prefer-tag: s1 を含むリクエストは、各サービスの v1 サブセットにルーティングされます。

Create lane

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

Lanes overview

各レーンの作成時に DestinationRule が生成されます。以下は s1 レーンの DestinationRule の例です。

生成された DestinationRule YAML(s1 レーン)

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  labels:
    asm-system: 'true'
    provider: asm
    swimlane-group: test                              # 「test」レーングループに属する
  name: trafficlabel-dr-test-default-mocka
  namespace: istio-system
spec:
  host: mocka.default.svc.cluster.local               # 対象サービス
  subsets:
    - labels:
        ASM_TRAFFIC_TAG: v1                            # レーン s1 はバージョン v1 にマップ
      name: s1
    - labels:
        ASM_TRAFFIC_TAG: v1
      name: v1
    - labels:
        ASM_TRAFFIC_TAG: v2                            # レーン s2 はバージョン v2 にマップ
      name: v2
    - labels:
        ASM_TRAFFIC_TAG: v2
      name: s2
    - labels:
        ASM_TRAFFIC_TAG: v3                            # レーン s3 はバージョン v3 にマップ
      name: v3
    - labels:
        ASM_TRAFFIC_TAG: v3
      name: s3

イングレストラフィックルールの作成

各レーンに対してトラフィックルーティングルールを作成します。以下は s1 レーンのルール作成手順です。s2 および s3 についても同様の手順を繰り返します。

本例では、すべてのレーンサービスがインバウンドリクエストパス /mock を共有していると仮定します。

  1. Traffic Lane ページの Traffic Rule Definition セクションで、対象のレーンを見つけ、Actions 列の Ingress traffic rules をクリックします。

  2. Add drainage rule ダイアログボックスで、以下のパラメーターを設定し、OK をクリックします。

パラメーター
Ingress servicemocka.default.svc.cluster.local
Ingress traffic rulesName: r1realm name: *
Matching request URIMethod: ExactContent: /mock

3 つのレーンすべてに対するトラフィックルーティングルールを作成すると、Traffic Rule Definition セクションに以下のように表示されます。

Ingress traffic rules

ASM は、x-asm-prefer-tag ヘッダーに基づいてリクエストをルーティングする VirtualService を生成します。

生成された VirtualService YAML

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  labels:
    asm-system: 'true'
    istioGateway: ingressgateway
    provider: asm
  name: ingressgateway
  namespace: istio-system
spec:
  gateways:
    - istio-system/ingressgateway                      # イングレスゲートウェイにバインド
  hosts:
    - '*'                                              # すべてのホストと一致
  http:
    - match:
        - headers:
            x-asm-prefer-tag:
              exact: s1                                # レーン s1 用にタグ付けされたリクエストと一致
          uri:
            exact: /mock                               # /mock パスと一致
      name: swimelane-ingress-route-test-s1-rule1
      route:
        - destination:
            host: mocka.default.svc.cluster.local      # mocka にルーティング
            subset: s1                                 # s1 サブセット(バージョン v1)を使用
    - match:
        - headers:
            x-asm-prefer-tag:
              exact: s2                                # レーン s2 用にタグ付けされたリクエストと一致
          uri:
            exact: /mock
      name: swimelane-ingress-route-test-s2-rule2
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s2                                 # s2 サブセット(バージョン v2)を使用
    - match:
        - headers:
            x-asm-prefer-tag:
              exact: s3                                # レーン s3 用にタグ付けされたリクエストと一致
          uri:
            exact: /mock
      name: swimelane-ingress-route-test-s3-rule3
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s3                                 # s3 サブセット(バージョン v3)を使用

ステップ 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 の有効化」をご参照ください。

次のステップ