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

Alibaba Cloud Service Mesh:ASMHeaderPropagation を使用した許容モードでのトラフィックレーンの設定

最終更新日:Mar 12, 2026

トラフィックレーンは、呼び出しチェーン全体にわたってリクエストを特定のサービスバージョンにルーティングします。たとえば、v2 とタグ付けされたすべてのリクエストは、チェーン内の各サービスの v2 インスタンスに到達します。許容モードでは、対象のサービスに対して一致するバージョンが存在しない場合、トラフィックは失敗する代わりに自動的にベースラインバージョンへフォールバックします。このアプローチにより、マルチサービスアーキテクチャ全体で安全なカナリアリリースおよびバージョンベースのテストを実施できます。また、すべてのサービスにすべてのバージョンをデプロイする必要はありません。

仕組み

トラフィックレーンを実装するために、以下の 4 種類のリソースが連携して動作します。

リソース役割
OpenTelemetry Instrumentationコード変更を伴わず、サービス呼び出し間でバゲージヘッダーを自動的に伝搬します
ASMHeaderPropagationASM 固有の CRD であり、バゲージコンテキストから指定されたヘッダー(例:version)を抽出し、呼び出しチェーン全体でリクエストヘッダーとして付与します
DestinationRulePod のラベルに基づいてサービスサブセット(v1、v2、v3)を定義します
VirtualService伝搬された version ヘッダーに一致するようにリクエストを正しいサブセットにルーティングします。対象バージョンに健全なエンドポイントがない場合は、ベースラインサブセットへフォールバックします

トラフィックフロー:

バゲージ: userId=alice,serverNode=DF%2028,isProduction=false
fallback フィールドは、標準の Istio VirtualService API に対する ASM 固有の拡張機能です。対象サブセットの健全なエンドポイント数がゼロの場合にトリガーされ、エラーを返す代わりに指定されたフォールバックサブセットへトラフィックをルーティングします。このフィールドは、アップストリームの Istio には存在しません。

バゲージヘッダー

バゲージは、分散トレース内でプロセス間でキー/バリュー形式のコンテキストを伝搬するための OpenTelemetry 機構です。HTTP ヘッダーを使用します。

baggage: userId=alice,serverNode=DF%2028,isProduction=false

バゲージヘッダーは、テナント ID、トレース ID、セキュリティ認証情報などのコンテキストデータを保持し、コード変更を伴わずにトレース分析およびログ相関を可能にします。

トラフィックレーンの詳細については、「トラフィックレーンの概要」をご参照ください。

前提条件

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

ステップ 1:OpenTelemetry Operator のデプロイおよび自動インストルメンテーションの構成

OpenTelemetry Operator は、サービス Pod を自動的にインストルメント化し、コード変更を伴わずバゲージヘッダーを呼び出し間で伝搬します。

OpenTelemetry Operator のデプロイ

  1. kubectl を使用して Kubernetes クラスターに接続し、opentelemetry-operator-system 名前空間を作成します。

    kubectl create namespace opentelemetry-operator-system
  2. Helm を使用して OpenTelemetry Operator をインストールします。

    helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
    helm install  \
        --namespace=opentelemetry-operator-system \
        --version=0.46.0 \
        --set admissionWebhooks.certManager.enabled=false \
        --set admissionWebhooks.certManager.autoGenerateCert=true \
        --set manager.image.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/opentelemetry-operator" \
        --set manager.image.tag="0.92.1" \
        --set kubeRBACProxy.image.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/kube-rbac-proxy" \
        --set kubeRBACProxy.image.tag="v0.13.1" \
        --set manager.collectorImage.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/opentelemetry-collector" \
        --set manager.collectorImage.tag="0.97.0" \
        --set manager.opampBridgeImage.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/operator-opamp-bridge" \
        --set manager.opampBridgeImage.tag="0.97.0" \
        --set manager.targetAllocatorImage.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/target-allocator" \
        --set manager.targetAllocatorImage.tag="0.97.0" \
        --set manager.autoInstrumentationImage.java.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/autoinstrumentation-java" \
        --set manager.autoInstrumentationImage.java.tag="1.32.1" \
        --set manager.autoInstrumentationImage.nodejs.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/autoinstrumentation-nodejs" \
        --set manager.autoInstrumentationImage.nodejs.tag="0.49.1" \
        --set manager.autoInstrumentationImage.python.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/autoinstrumentation-python" \
        --set manager.autoInstrumentationImage.python.tag="0.44b0" \
        --set manager.autoInstrumentationImage.dotnet.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/autoinstrumentation-dotnet" \
        --set manager.autoInstrumentationImage.dotnet.tag="1.2.0" \
        --set manager.autoInstrumentationImage.go.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/opentelemetry-go-instrumentation" \
        --set manager.autoInstrumentationImage.go.tag="v0.10.1.alpha-2-aliyun" \
        opentelemetry-operator open-telemetry/opentelemetry-operator
  3. Operator Pod が実行中であることを確認します。期待される出力例:

    kubectl get pod -n opentelemetry-operator-system
    NAME                                      READY   STATUS    RESTARTS   AGE
    opentelemetry-operator-854fb558b5-pvllj   2/2     Running   0          1m

自動インストルメンテーションの構成

バゲージ伝搬プロパゲーターを宣言する instrumentation.yaml ファイルを作成します。環境に OpenTelemetry Collector がデプロイされているかどうかに応じて、適切な構成を選択してください。

OpenTelemetry Collector が未デプロイの場合 — コレクターのエンドポイントが利用できない場合のエラーを回避するため、メトリックエクスポートおよびトレーシングを無効化します。

apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: demo-instrumentation
spec:
  env:
  - name: OTEL_METRICS_EXPORTER
    value: none
  propagators:
  - baggage
  sampler:
    argument: "1"
    type: always_off

OpenTelemetry Collector がデプロイ済みの場合 — 親ベースのサンプリングを用いた完全なトレーシングを有効化します。

apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: demo-instrumentation
spec:
  propagators:
    - baggage
  sampler:
    type: parentbased_traceidratio
    argument: "1"

インストルメンテーションリソースを default 名前空間に適用します。

kubectl apply -f instrumentation.yaml
OpenTelemetry Collector をデプロイして可観測性データを収集することは、ベストプラクティスです。詳細については、「ASM トレースデータを OpenTelemetry 向けマネージドサービスに収集する」をご参照ください。

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

このステップでは、mockamockbmockc の 3 つのサービスをそれぞれ v1、v2、v3 の 3 つのバージョンでデプロイします。これらのサービスは mockamockbmockc という呼び出しチェーンを形成します。各 Pod には Java 自動インストルメンテーション用のアノテーションが付与されているため、バゲージヘッダーが自動的に伝搬します。

  1. default 名前空間に対して自動サイドカープロキシ注入を有効化します。詳細については、「グローバル名前空間の管理」をご参照ください。

    サイドカーインジェクションの詳細については、「自動サイドカープロキシ注入を有効にする」をご参照ください。
  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

    YAML マニフェストの主なポイント:

    構成目的
    ASM_TRAFFIC_TAG ラベルトラフィックレーンルーティングのために各 Pod をそのバージョン(v1、v2、または v3)でタグ付けします
    instrumentation.opentelemetry.io/inject-java: "true"Java コンテナに対する OpenTelemetry 自動インストルメンテーションをトリガーします
    instrumentation.opentelemetry.io/container-names: "default"インストルメント化対象のコンテナを指定します
    upstream_url 環境変数呼び出しチェーンを定義します:mockamockbmockc
  3. サービスをデプロイします。自動インストルメンテーションが有効化されているため、Pod は呼び出しチェーン全体で自動的にバゲージヘッダーを伝搬します。

    kubectl apply -f mock.yaml

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

このステップでは、宛先ルール、ASMHeaderPropagation CRD、仮想サービス、およびイングレスゲートウェイルールを作成します。これらのリソースを組み合わせることで、伝搬された version ヘッダーに基づいてリクエストを正しいサービスバージョンにルーティングし、バージョンが存在しない場合には v1 へフォールバックします。

宛先ルールの作成

宛先ルールは、Pod のラベルに基づいてサービスサブセットを定義します。すべてのサービスが 3 つのバージョンすべてを備えているわけではありません。これは意図的な設計であり、許容モードのフォールバック動作を実証するものです。

サービス利用可能なサブセット
mockav1、v2、v3
mockbv1、v3
mockcv1、v2
  1. 以下の内容で dr-mock.yaml ファイルを作成します。

    dr-mock.yaml の表示

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: dr-mock-default-mocka
    spec:
      host: mocka.default.svc.cluster.local
      subsets:
        - labels:
            version: v1
          name: v1
        - labels:
            version: v2
          name: v2
        - labels:
            version: v3
          name: v3
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: dr-mock-default-mockb
    spec:
      host: mockb.default.svc.cluster.local
      subsets:
        - labels:
            version: v1
          name: v1
        - labels:
            version: v3
          name: v3
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: dr-mock-default-mockc
    spec:
      host: mockc.default.svc.cluster.local
      subsets:
        - labels:
            version: v1
          name: v1
        - labels:
            version: v2
          name: v2
  2. kubectl を使用して ASM インスタンスに接続し、宛先ルールを適用します。

    kubectl apply -f dr-mock.yaml

ASMHeaderPropagation CRD の作成

ASMHeaderPropagation CRD は、ASM に対してバゲージコンテキストからどのヘッダーを抽出し、呼び出しチェーン全体で伝搬させるかを指示します。この例では、version ヘッダーを抽出することで、ダウンストリームサービスが正しいルーティングコンテキストを受信できるようにします。

  1. propagation.yaml ファイルを作成します。

    フィールド説明
    apiVersionistio.alibabacloud.com/v1beta1 — ASM 固有の API グループ
    kindASMHeaderPropagation — バゲージコンテキストからのヘッダー伝搬のための CRD
    spec.headersバゲージから抽出し、リクエストヘッダーとして伝搬するヘッダー名のリスト
    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMHeaderPropagation
    metadata:
      name: version-propagation
    spec:
      headers:
        - version
  2. kubectl を使用して ASM インスタンスに接続し、CRD を適用します。

    kubectl apply -f propagation.yaml

仮想サービスの作成

仮想サービスは、version ヘッダーに一致するようにリクエストを正しいサブセットにルーティングします。各ルールには、v1(ベースラインバージョン)を指す fallback ターゲットが含まれています。許容モードでは、リクエストが存在しないバージョン(例:mockb には v2 が存在しない)をターゲットとする場合、ASM はエラーを返す代わりにフォールバックサブセットへルーティングします。

  1. 以下の内容で vs-mock.yaml ファイルを作成します。

    vs-mock.yaml の表示

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-mock-default-mocka
    spec:
      hosts:
        - mocka.default.svc.cluster.local
      http:
        - match:
            - headers:
                version:
                  exact: v1
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: v1
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: v1
        - match:
            - headers:
                version:
                  exact: v2
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: v2
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: v1
        - match:
            - headers:
                version:
                  exact: v3
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: v3
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: v1
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-mock-default-mockb
    spec:
      hosts:
        - mockb.default.svc.cluster.local
      http:
        - match:
            - headers:
                version:
                  exact: v1
          route:
            - destination:
                host: mockb.default.svc.cluster.local
                subset: v1
              fallback:
                target:
                  host: mockb.default.svc.cluster.local
                  subset: v1
        - match:
            - headers:
                version:
                  exact: v2
          route:
            - destination:
                host: mockb.default.svc.cluster.local
                subset: v2
              fallback:
                target:
                  host: mockb.default.svc.cluster.local
                  subset: v1
        - match:
            - headers:
                version:
                  exact: v3
          route:
            - destination:
                host: mockb.default.svc.cluster.local
                subset: v3
              fallback:
                target:
                  host: mockb.default.svc.cluster.local
                  subset: v1
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-mock-default-mockc
    spec:
      hosts:
        - mockc.default.svc.cluster.local
      http:
        - match:
            - headers:
                version:
                  exact: v1
          route:
            - destination:
                host: mockc.default.svc.cluster.local
                subset: v1
              fallback:
                target:
                  host: mockc.default.svc.cluster.local
                  subset: v1
        - match:
            - headers:
                version:
                  exact: v2
          route:
            - destination:
                host: mockc.default.svc.cluster.local
                subset: v2
              fallback:
                target:
                  host: mockc.default.svc.cluster.local
                  subset: v1
        - match:
            - headers:
                version:
                  exact: v3
          route:
            - destination:
                host: mockc.default.svc.cluster.local
                subset: v3
              fallback:
                target:
                  host: mockc.default.svc.cluster.local
                  subset: v1

    各サービスのルーティングパターンは、以下の構造に従います。

    # 各バージョン一致に対し、プライマリ送信先とフォールバックを指定
    - match:
        - headers:
            version:
              exact: v2        # 伝搬されたバージョンヘッダーに一致
      route:
        - destination:
            host: <service>.default.svc.cluster.local
            subset: v2         # プライマリ:一致するバージョンへルーティング
          fallback:
            target:
              host: <service>.default.svc.cluster.local
              subset: v1       # フォールバック:v2 に健全なエンドポイントがない場合、ベースラインへルーティング
  2. kubectl を使用して ASM インスタンスに接続し、仮想サービスを適用します。

    kubectl apply -f vs-mock.yaml

イングレスゲートウェイルールの作成

イングレスゲートウェイは、重みに基づいて着信トラフィックをサービスバージョン間で分散し、各リクエストに対して対象バージョンに一致する version ヘッダーを設定します。

  1. 以下の内容で gw-mock.yaml ファイルを作成します。

    gw-mock.yaml の表示

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: mockgw
      namespace: default
    spec:
      selector:
        istio: ingressgateway
      servers:
        - hosts:
            - '*'
          port:
            name: http
            number: 80
            protocol: HTTP
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: swimlane-ingress-vs-weighted-mock
      namespace: default
    spec:
      gateways:
        - default/mockgw
      hosts:
        - '*'
      http:
        - name: mock-weighted
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: v1
              headers:
                request:
                  set:
                    version: v1
              weight: 40
            - destination:
                host: mocka.default.svc.cluster.local
                subset: v2
              headers:
                request:
                  set:
                    version: v2
              weight: 30
            - destination:
                host: mocka.default.svc.cluster.local
                subset: v3
              headers:
                request:
                  set:
                    version: v3
              weight: 30

    この構成では、mocka の v1、v2、v3 へのトラフィックを 40:30:30 の比率で分散します。各リクエストに対して、ゲートウェイは version ヘッダーを対象バージョンに設定し、呼び出しチェーン内のダウンストリームサービスがバゲージ伝搬を通じて正しいルーティングコンテキストを受信できるようにします。

  2. kubectl を使用して ASM インスタンスに接続し、ゲートウェイルールを適用します。

    kubectl apply -f gw-mock.yaml

ステップ 4:トラフィックレーンルーティングの検証

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

  2. ゲートウェイ IP を環境変数に設定します。<gateway-ip> を実際の IP アドレスに置き換えてください。

    export ASM_GATEWAY_IP=<gateway-ip>
  3. 繰り返しリクエストを送信してトラフィックの分散状況を確認します。出力例:

    for i in {1..100}; do curl http://${ASM_GATEWAY_IP}; echo ''; sleep 1; done
    -> mocka(version: v1, ip: 192.168.1.27)-> mockb(version: v1, ip: 192.168.1.30)-> mockc(version: v1, ip: 192.168.1.14)
    -> mocka(version: v2, ip: 192.168.1.28)-> mockb(version: v1, ip: 192.168.1.30)-> mockc(version: v2, ip: 192.168.1.1)
    -> mocka(version: v3, ip: 192.168.1.26)-> mockb(version: v3, ip: 192.168.1.29)-> mockc(version: v1, ip: 192.168.1.14)
  4. 結果を検証します。出力は以下の 2 つの動作を確認できます。重み付き分散:トラフィックは約 40:30:30 の比率で v1、v2、v3 に分割されます。許容モードフォールバック:サービスに対してバージョンが存在しない場合、トラフィックは v1 へフォールバックします。

    • v2 レーン:mocka-v2mockb-v1mockb-v2 は存在しないため、v1 へフォールバック)→ mockc-v2

    • v3 レーン:mocka-v3mockb-v3mockc-v1mockc-v3 は存在しないため、v1 へフォールバック)

    レーンmockamockbmockc
    v1v1v1v1
    v2v2v1(v2 なし、フォールバック)v2
    v3v3v3v1(v3 なし、フォールバック)