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

Alibaba Cloud Service Mesh:シナリオ 3:バゲージヘッダーの伝播

最終更新日:Jun 22, 2026

許容モードのトラフィックレーンを使用して、アプリケーションのバージョンを分離できます。このプロセスでは、バゲージヘッダー内のルーティングリクエストヘッダーを伝播させて、トラフィックを異なるレーンにルーティングします。トラフィックレーン内のサービスが相互に呼び出す際、ターゲットサービスが現在のレーンに存在しない場合、リクエストはベースラインレーンに転送されます。これにより、呼び出しチェーンの整合性が確保され、トラフィック管理が簡素化されます。

重要

開始する前に、「許容モードのトラフィックレーンを使用してエンドツーエンドのトラフィックを管理する」およびその関連コンテンツを読んで理解してください。

シナリオの概要

この例では、3 つのサービス (mocka、mockb、mockc) と 3 つのトラフィックレーン (s1、s2、s3) を持つ呼び出しチェーンをシミュレートします。まず、OpenTelemetry の自動イベントトラッキングを使用して、サービスのバゲージヘッダー伝播を有効にします。次に、許容モードで 3 つのトラフィックレーンを作成し、重みベースのルーティングポリシーを使用してトラフィックを誘導します。

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

  1. デフォルトの名前空間でサイドカープロキシの自動インジェクションを有効にします。詳細については、「グローバル名前空間の管理」をご参照ください。

    説明

    自動インジェクションの詳細については、「サイドカーインジェクションポリシーの設定」をご参照ください。

  2. `mock.yaml` という名前のファイルを次の内容で作成します。

    mock.yaml の内容

    apiVersion: v1
    kind: Service
    metadata:
      name: mocka
      labels:
        app: mocka
        service: mocka
    spec:
      ports:
      - port: 8000
        name: http
      selector:
        app: mocka
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mocka-v1
      labels:
        app: mocka
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mocka
          version: v1
          ASM_TRAFFIC_TAG: v1
      template:
        metadata:
          labels:
            app: mocka
            version: v1
            ASM_TRAFFIC_TAG: v1
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mocka
            - name: upstream_url
              value: "http://mockb:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mockb
      labels:
        app: mockb
        service: mockb
    spec:
      ports:
      - port: 8000
        name: http
      selector:
        app: mockb
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockb-v1
      labels:
        app: mockb
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockb
          version: v1
          ASM_TRAFFIC_TAG: v1
      template:
        metadata:
          labels:
            app: mockb
            version: v1
            ASM_TRAFFIC_TAG: v1
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mockb
            - name: upstream_url
              value: "http://mockc:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mockc
      labels:
        app: mockc
        service: mockc
    spec:
      ports:
      - port: 8000
        name: http
      selector:
        app: mockc
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockc-v1
      labels:
        app: mockc
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockc
          version: v1
          ASM_TRAFFIC_TAG: v1
      template:
        metadata:
          labels:
            app: mockc
            version: v1
            ASM_TRAFFIC_TAG: v1
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mockc
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mocka-v2
      labels:
        app: mocka
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mocka
          version: v2
          ASM_TRAFFIC_TAG: v2
      template:
        metadata:
          labels:
            app: mocka
            version: v2
            ASM_TRAFFIC_TAG: v2
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v2
            - name: app
              value: mocka
            - name: upstream_url
              value: "http://mockb:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockb-v2
      labels:
        app: mockb
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockb
          version: v2
          ASM_TRAFFIC_TAG: v2
      template:
        metadata:
          labels:
            app: mockb
            version: v2
            ASM_TRAFFIC_TAG: v2
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v2
            - name: app
              value: mockb
            - name: upstream_url
              value: "http://mockc:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockc-v2
      labels:
        app: mockc
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockc
          version: v2
          ASM_TRAFFIC_TAG: v2
      template:
        metadata:
          labels:
            app: mockc
            version: v2
            ASM_TRAFFIC_TAG: v2
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v2
            - name: app
              value: mockc
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mocka-v3
      labels:
        app: mocka
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mocka
          version: v3
          ASM_TRAFFIC_TAG: v3
      template:
        metadata:
          labels:
            app: mocka
            version: v3
            ASM_TRAFFIC_TAG: v3
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v3
            - name: app
              value: mocka
            - name: upstream_url
              value: "http://mockb:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockb-v3
      labels:
        app: mockb
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockb
          version: v3
          ASM_TRAFFIC_TAG: v3
      template:
        metadata:
          labels:
            app: mockb
            version: v3
            ASM_TRAFFIC_TAG: v3
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v3
            - name: app
              value: mockb
            - name: upstream_url
              value: "http://mockc:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockc-v3
      labels:
        app: mockc
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockc
          version: v3
          ASM_TRAFFIC_TAG: v3
      template:
        metadata:
          labels:
            app: mockc
            version: v3
            ASM_TRAFFIC_TAG: v3
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v3
            - name: app
              value: mockc
            ports:
            - containerPort: 8000

    これらのアノテーションは、サービスが Java アプリケーションであることを宣言し、OpenTelemetry Operator に default という名前のコンテナで自動計装を実行するように指示します。

  3. 次のコマンドを実行して、サンプルサービスをデプロイします。

    kubectl apply -f mock.yaml

    OpenTelemetry 自動インスツルメンテーションを有効にすると、デプロイされたサービス Pod は、呼び出しチェーン全体でバゲージヘッダーを自動的に伝播できるようになります。

ステップ 2:レーングループとそのトラフィックレーンの作成

  1. レーングループを作成します。

    1. ASM コンソールにログインします。左側のナビゲーションウィンドウで、Service Mesh > メッシュ管理を選択します。

    2. メッシュ管理ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、トラフィック管理センター > トラフィックレーンを選択します。

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

      パラメーター

      説明

      Name of swim lane group

      test と入力します。

      Entrance gateway

      ingressgateway を選択します。

      Lane Mode

      Permissive Modeを選択します。

      Pass-through Mode of Trace Context

      Pass Through Baggage Headerを選択します。

      Routing Request Header

      x-asm-prefer-tag と入力します。

      Swimlane Services

      ターゲットの Kubernetes クラスターと default 名前空間を選択します。サービスリストで mockamockbmockc を選択し、image.png アイコンをクリックしてサービスをselectedエリアに追加します。

  2. s1、s2、s3 のトラフィックレーンを作成し、それぞれ v1、v2、v3 バージョンにバインドします。

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

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

    パラメーター

    説明

    Swimlane Name

    3 つのトラフィックレーンにそれぞれ s1s2s3 と入力します。

    Configure Service Tag

    Label KeyASM_TRAFFIC_TAG と入力します。

    Label Value:3 つのトラフィックレーンにそれぞれ v1v2v3 と入力します。

    Add Service

    • s1 レーン:mocka(default)mockb(default)mockc(default) を選択します。

    • s2 レーン:mocka(default)mockc(default) を選択します。

    • s3 レーン:mockb(default) を選択します。

    デフォルトでは、ASM はレーングループで最初に作成したトラフィックレーンをベースラインレーンとして設定します。ベースラインレーンを変更することもできます。他のトラフィックレーンに存在しないサービスにトラフィックが送信されると、フォールバックメカニズムがリクエストをベースラインレーンに転送します。ベースラインレーンの変更方法の詳細については、「許容モードでベースラインレーンを変更する」をご参照ください。

    コンソールの左側のナビゲーションウィンドウで、Traffic Management Center > DestinationRule または VirtualService を選択して、ASM がレーングループ内の各サービスに対して自動的に生成する DestinationRule および VirtualService リソースを表示できます。たとえば、次の DestinationRule と VirtualService は、mocka サービスに対して自動的に作成されます。

    DestinationRule と VirtualService

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      labels:
        asm-system: 'true'
        provider: asm
        swimlane-group: test
      name: trafficlabel-dr-test-default-mocka
      namespace: istio-system
    spec:
      host: mocka.default.svc.cluster.local
      subsets:
        - labels:
            ASM_TRAFFIC_TAG: v1
          name: s1
        - labels:
            ASM_TRAFFIC_TAG: v2
          name: s2
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      labels:
        asm-system: 'true'
        provider: asm
        swimlane-group: test
      name: trafficlabel-vs-test-default-mocka
      namespace: istio-system
    spec:
      hosts:
        - mocka.default.svc.cluster.local
      http:
        - match:
            - headers:
                x-asm-prefer-tag:
                  exact: s1
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: s1
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: s1
        - match:
            - headers:
                x-asm-prefer-tag:
                  exact: s2
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: s2
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: s1
        - match:
            - headers:
                x-asm-prefer-tag:
                  exact: s3
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: s3
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: s1
  3. 統一された重みベースのルーティングルールを作成します。

    1. トラフィックレーンページで、トラフィックルール定義セクションのルーティングポリシーセクションにある [重みベースのルーティング] をクリックします。

    2. [統一ルーティングルールの設定] ダイアログボックスで、パラメーターを設定し、[OK] をクリックします。次の例は、レーンサービスのエントリ API が /mock であると仮定して、3 つのトラフィックレーンに統一ルーティングルールを設定する方法を示しています。

      パラメーター

      説明

      realm name

      これを * に設定します。

      Matching request URI

      MethodPrefixに、Content/ に設定します。

  4. 3 つのトラフィックレーンのルーティングの重みを設定します。重みは、各レーンに送信されるトラフィックの割合を決定します。

    1. Traffic Lane ページの Traffic Rule Definition セクションで、各スイムレーンの Traffic Routing Weight 列にある数値の横の image.png アイコンをクリックします。Edit Traffic Routing Weight ダイアログボックスで、パラメーターを設定して OK をクリックします。

      パラメーター

      説明

      Ingress service

      3 つのトラフィックレーンすべてで、これを mocka.default.svc.cluster.local に設定します。

      Weight Value

      • s1 レーンには 60 と入力します。

      • s2 レーンには 20 と入力します。

      • s3 レーンには 20 と入力します。

ステップ 3:エンドツーエンドカナリアリリースの検証

  1. ASM イングレスゲートウェイのパブリック IP アドレスを取得します。詳細については、「ASM イングレスゲートウェイの IP アドレスの取得」をご参照ください。

  2. 次のコマンドを実行して環境変数を設定します。`xxx.xxx.xxx.xxx` を前のステップで取得した IP アドレスに置き換えます。

    export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx
  3. エンドツーエンドカナリアリリースを検証します。

    1. 次のコマンドを実行して、3 つのトラフィックレーン間のアクセス動作を観察します。

      for i in {1..100};  do curl http://${ASM_GATEWAY_IP}/ ;  echo ''; sleep 1; done;

      期待される出力:

      # レーン s1 (ベースライン) へのトラフィック:すべてのサービスが v1 です。
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      
      # レーン s2 へのトラフィック:mocka と mockc は v2 で、mockb はベースラインレーンの v1 にフォールバックします。
      -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189)
      
      # レーン s3 へのトラフィック:mockb は v3 で、mocka と mockc はベースラインレーンの v1 にフォールバックします。
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190)
      
      # 出力は上記のパターンの混合を示し、s1:s2:s3 のディストリビューションは約 6:2:2 になります。

      出力は、トラフィックが s1、s2、s3 のトラフィックレーンに約 6:2:2 の比率で分散されていることを示しています。s1 はベースラインレーンとして機能します。呼び出しチェーン内のサービスがターゲットレーンに存在しない場合、リクエストはベースラインレーン (s1) の対応するサービスにフォールバックします。