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

Alibaba Cloud Service Mesh:シナリオ 3: トレースのバゲージヘッダーのパススルー

最終更新日:Jan 13, 2025

許可モードのトラフィックレーンを使用して、アプリケーションのバージョンを分離し、特定の比率に基づいてトラフィックを異なるレーンにルーティングできます。アプリケーションは、リクエストに対応するトレース全体で透過的に送信できるヘッダーを追加する必要があり、このようなヘッダーは異なる値を持ちます。これらのリクエストヘッダーは、エンドツーエンド(E2E)パススルーリクエストヘッダーと呼ばれます。この例では、バゲージヘッダーが E2E パススルーリクエストヘッダーとして使用されます。レーン内のサービスが相互に呼び出すとき、呼び出されるサービスがレーンに存在しない場合、リクエストはベースラインレーン内の同じサービスに転送されます。この機能は、トレースの整合性を確保し、トラフィック管理を簡素化します。

重要

開始する前に、「許可モードのトラフィックレーンを使用してエンドツーエンドトラフィックを管理する」のトピックと関連コンテンツを読み、理解していることを確認してください。

シナリオの説明

この例では、3 つのサービス(mocka、mockb、mockc)と 3 つのレーン(s1、s2、s3)を使用してトレースをシミュレートします。 s1 は、v1 の 3 つのサービスすべてを含むベースラインレーンです。 s2 には、v2 の mocka と mockc のみ含まれています。 s3 には、v3 の mockb のみ含まれています。まず、OpenTelemetry の自動インストゥルメンテーション機能を使用して、サービスの Pod がバゲージヘッダーをパススルーできるようにします。次に、許可モードで 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"  // Java で実装されていることを宣言します。
            instrumentation.opentelemetry.io/container-names: "default" // default という名前のコンテナを自動インストゥルメントする必要があることを OpenTelemetry Operator に宣言します。
        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" // Java で実装されていることを宣言します。
            instrumentation.opentelemetry.io/container-names: "default" // default という名前のコンテナを自動インストゥルメントする必要があることを OpenTelemetry Operator に宣言します。
        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" // Java で実装されていることを宣言します。
            instrumentation.opentelemetry.io/container-names: "default" // default という名前のコンテナを自動インストゥルメントする必要があることを OpenTelemetry Operator に宣言します。
        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" // Java で実装されていることを宣言します。
            instrumentation.opentelemetry.io/container-names: "default" // default という名前のコンテナを自動インストゥルメントする必要があることを OpenTelemetry Operator に宣言します。
        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" // Java で実装されていることを宣言します。
            instrumentation.opentelemetry.io/container-names: "default" // default という名前のコンテナを自動インストゥルメントする必要があることを OpenTelemetry Operator に宣言します。
        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" // Java で実装されていることを宣言します。
            instrumentation.opentelemetry.io/container-names: "default" // default という名前のコンテナを自動インストゥルメントする必要があることを OpenTelemetry Operator に宣言します。
        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" // Java で実装されていることを宣言します。
            instrumentation.opentelemetry.io/container-names: "default" // default という名前のコンテナを自動インストゥルメントする必要があることを OpenTelemetry Operator に宣言します。
        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" // Java で実装されていることを宣言します。
            instrumentation.opentelemetry.io/container-names: "default" // default という名前のコンテナを自動インストゥルメントする必要があることを OpenTelemetry Operator に宣言します。
        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" // Java で実装されていることを宣言します。
            instrumentation.opentelemetry.io/container-names: "default" // default という名前のコンテナを自動インストゥルメントする必要があることを OpenTelemetry Operator に宣言します。
        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

    アノテーション instrumentation.opentelemetry.io/inject-java: "true"instrumentation.opentelemetry.io/container-names: "default" は、対応するサービスが Java で実装されており、default という名前のコンテナを自動インストゥルメントするために OpenTelemetry Operator が必要であることを宣言するために、各サービス Pod に追加されます。

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

    kubectl apply -f mock.yaml

    OpenTelemetry の自動インストゥルメンテーションメカニズムに基づいて、サービスの Pod はトレース内のバゲージヘッダーを自動的にパススルーできます。

ステップ 2: レーングループと対応するレーンを作成する

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

    1. ASM コンソール にログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

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

    3. [トラフィックレーン] ページで、[スイムレーングループの作成] をクリックします。 [スイムレーングループの作成] パネルで、必要なパラメーターを設定し、[OK] をクリックします。

      パラメーター

      説明

      [スイムレーングループの名前]

      この例では、test と入力します。

      [イングレスゲートウェイの Istio ゲートウェイ]

      [ingressgateway] を選択します。

      [レーンモード]

      [許可モード] を選択します。

      [トレースコンテキストのパススルーモード]

      [バゲージヘッダーのパススルー] を選択します。

      [ルーティングリクエストヘッダー]

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

      [スイムレーンサービス]

      [Kubernetes クラスタ] ドロップダウンリストから mocka、mockb、mockc サービスが存在するクラスタを選択し、[名前空間] ドロップダウンリストから [default] を選択します。リストで [mocka][mockb][mockc] サービスを選択し、image.png アイコンをクリックして、これらのサービスを [選択済み] セクションに追加します。

  2. s1、s2、s3 という名前のレーンを作成し、s1 レーンをサンプルサービスの v1 バージョンに、s2 レーンをサンプルサービスの v2 バージョンに、s3 レーンをサンプルサービスの v3 バージョンにバインドします。

    1. [トラフィックレーンの定義] セクションの [トラフィックレーン] ページで、[スイムレーンの作成] をクリックします。

    2. [スイムレーンの作成] ダイアログボックスで、必要なパラメーターを設定し、[OK] をクリックします。

    パラメーター

    説明

    [スイムレーン名]

    3 つのレーンをそれぞれ s1s2s3 という名前で指定します。

    [サービスタグの設定]

    [ラベルキー]: ASM_TRAFFIC_TAG に設定します。

    [ラベル値]: s1 レーンの場合は v1、s2 レーンの場合は v2、s3 レーンの場合は v3 に設定します。

    [サービスの追加]

    • s1 レーンでは、mocka(default)mockb(default)、および mockc(default) を選択します。

    • s2 レーンの場合は、mocka(デフォルト)mockc(既定) と を選択します。

    • s3 レーンの場合は、mockb(デフォルト)。 を選択します。

    次の図は、s1 レーンの構成を示しています。

    image

    3 つのレーンが作成されると、次の図に示すように、[トラフィックレーンの定義] セクションでそれらを表示できます。

    image

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

    ASM コンソールの左側のナビゲーションペインで、[トラフィック管理センター] > [destinationrule] または [virtualservice] を選択して、レーングループ内の各サービスに対して自動的に生成されるデスティネーションルールまたは仮想サービスを表示します。たとえば、次のデスティネーションルールと仮想サービスは、mocka サービスに対して自動的に作成されます。

    mocka サービスに対して自動的に作成されるデスティネーションルールと仮想サービスを表示

    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] をクリックします。次の例では、レーン内のすべてのサービスの受信リクエストパスが /mock であり、レーンごとに同じトラフィックルーティング規則が構成されていることを前提としています。

      パラメーター

      説明

      [レルム名]

      * に設定します。

      [リクエスト URI の一致]

      [メソッド] パラメーターを [プレフィックス] に設定し、[コンテンツ] パラメーターを / に設定します。

      次の図は、統一トラフィックルーティングルールを設定する例を示しています。

      image

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

    1. [トラフィックレーンの定義] セクションの [トラフィックレーン] ページで、image.png[トラフィックルーティングの重み] 列の数値の横にある トラフィックルーティングの重みを編集OK ボタンをクリックします。 ダイアログボックスで、必要なパラメーターを設定し、 をクリックします。

      パラメーター

      説明

      [イングレスサービス]

      3 つのレーンすべてで mocka.default.svc.cluster.local に設定します。

      [重み値]

      • s1 レーンの場合は、値を 60 に設定します。

      • s2 レーンの場合は、値を 20 に設定します。

      • s3 レーンの場合は、値を 20 に設定します。

      次の図は、トラフィックルーティングの重みを設定する例を示しています。

      image

ステップ 3: エンドツーエンドカナリーリリース機能が有効になっていることを確認する

  1. イングレスゲートウェイのパブリック IP アドレスを取得します。詳細については、「ステップ 2: 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;

      期待される出力:

      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      // 以降同様の出力
      

      出力は、トラフィックが約 6:2:2 の比率で s1、s2、s3 レーンに送信され、s1 がベースラインレーンとして使用されていることを示しています。トレースに特定のバージョンのサービスが存在しない場合、s1 レーンの対応するサービスが呼び出されます。