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

Alibaba Cloud Service Mesh:トラフィックのラベル付け

最終更新日:Jan 13, 2025

Service Mesh(ASM)では、トラフィックラベルを設定して、ラベルに基づいてトラフィックを管理できます。 特定のラベルが付いたアプリケーショントラフィックを異なるサービスまたはバージョンにルーティングできます。 ラベルに基づいて、サーキットブレーキングやスロットリングなどのトラフィック制御を実行できます。 ASM は TrafficLabel CustomResourceDefinition(CRD)を追加します。 この CRD を使用して、トラフィックラベルロジックを定義し、名前空間とワークロードのトラフィックラベルを設定できます。 このトピックでは、トラフィックラベルを設定する方法と、CRD のフィールドの説明と設定例を示します。

使用上の注意

  • バージョン 1.17 以降の ASM インスタンスは、TrafficLabel CRD で apiVersion: istio.alibabacloud.com/v1 をサポートしています。 Container Service for Kubernetes(ACK)クラスターで TrafficLabel を設定している場合は、TrafficLabel CRD の apiVersion: istio.alibabacloud.com/v1beta1apiVersion: istio.alibabacloud.com/v1 に変更してから、TrafficLabel を再設定してください。

    バージョン 1.17 の ASM インスタンスでの TrafficLabel 設定のサンプル YAML コードを表示する

    apiVersion: istio.alibabacloud.com/v1
    kind: TrafficLabel
    metadata:
      name: example
      namespace: default
    spec:
      workloadSelector:
        labels:
          app: httpbin
      rules:
      - labels:
          - name: asm-labels-test-a
            valueFrom:
            - $getInboundRequestHeader(headerName)
            - $getExternalInboundRequestHeader(contextId, headerName) 
            - $getLocalOutboundRequestHeader(headerName)
            - $getLabel(labelName)  
  • ASM インスタンスのバージョンが 1.17 より前の場合は、ASM インスタンスをバージョン 1.17 以降に更新するか、チケットを送信する してテクニカルサポートを受けることをお勧めします。

フィールドの説明

このセクションでは、バージョン 1.17 以降の ASM インスタンスの CRD フィールドについて説明します。

Spec

フィールド

タイプ

必須

説明

workloadSelector

WorkloadSelector

いいえ

セレクターがトラフィックラベルを適用するワークロード範囲を示します。

このフィールドを空のままにすると、セレクターは現在の名前空間のすべてのワークロードにトラフィックラベルを適用します。

rules

TrafficLabelRule[]

はい

トラフィックラベルのルールを定義します。

WorkloadSelector

フィールド

タイプ

必須

説明

labels

map<string, string>

いいえ

ワークロードに適用されるトラフィックラベル。 1 つ以上のラベルを設定できます。

TrafficLabelRule

フィールド

タイプ

必須

説明

labels

Label[]

はい

設定するラベルの名前と値。

Label

フィールド

タイプ

必須

説明

name

string

はい

トラフィックラベルの名前。 名前は HTTP リクエストヘッダーの命名規則に準拠している必要があります。

valueFrom

string[]

はい

トラフィックラベルの値。 値は、設定した変数の順序に基づいて取得されます。 ラベル値は、優先的に最初の変数から取得されます。 使用できない場合は、2 番目の変数がチェックされます。 最初と 2 番目の変数で値が見つからない場合は、3 番目の変数がチェックされます。 最後に、最初、2 番目、3 番目の変数で値が見つからない場合は、4 番目の変数から取得されます。

詳細については、「valueFrom」をご参照ください。

valueFrom

valueFrom フィールドでは、次の 4 つの変数がサポートされています。表の下にある対応する展開アイコンをクリックすると、変数の説明を表示できます。

変数

サポートされているワークロード

$getInboundRequestHeader(headerName)

ゲートウェイ

$getExternalInboundRequestHeader(headerName, contextId)

サイドカープロキシ

$getLocalOutboundRequestHeader(headerName)

サイドカープロキシ

$getLabel(labelName)

ゲートウェイまたはサイドカープロキシ

$getInboundRequestHeader(headerName) の説明を表示する

この変数は、headerName という名前のヘッダーの値が、ゲートウェイに入るリクエストから取得されることを示します。この関数変数に従って、トラフィックラベルの値は、受信リクエストヘッダーから取得されます。 headerName パラメーターは、リクエストヘッダーのキーです。パラメーターが空のままの場合、デフォルトで x-asm-prefer-tag が使用されます。

次の図に示すように、イングレス ゲートウェイはアウトバウンド リクエストに新しいリクエスト ヘッダーを追加します。リクエスト ヘッダーの名前は、TrafficLabel CRD で定義されているラベル名(たとえば、userDefinedLabel)で、値は tagValue です。$getInboundRequestHeader(headerName)..png

説明

この変数は、ゲートウェイに対してのみ有効です。 サイドカープロキシには有効ではありません。

$getExternalInboundRequestHeader(headerName, contextId) の説明を表示する

この変数は、headerName という名前のヘッダーの値が、サイドカープロキシに入るリクエストから取得されることを示します。この関数変数に従って、トラフィックラベルの値はトラフィックリクエストのコンテキストから取得されます。変数には、次のパラメーターが含まれています。

  • headerName: リクエストヘッダーのキー。このパラメーター値は必須です (例: x-asm-prefer-tag)。

  • contextId: コールチェーン全体で実行されるリクエストヘッダーフィールド。値は、指定された受信リクエストヘッダー、またはトレースシステムのトレース ID にすることができます。このパラメーターは必須であり、空にすることはできません。

サイドカープロキシには、受信トラフィックと送信トラフィックが関係します。 トラフィックのラベル付けは、送信トラフィックにラベルを付けることです。 デフォルトでは、サイドカープロキシは、名前が headerNameタグ値$getExternalInboundRequestHeader(headerName, contextId)..png である受信リクエストヘッダーから値を取得し、この値をトラフィックのラベル値 として使用します。

アウトバウンドリクエストに tagValue を追加するために、サイドカープロキシはその内部ロジックで map<contextId, tagValue> を保持します。 contextId は、コールチェーン全体を通るリクエストヘッダーフィールドです。値は、指定されたインバウンドリクエストヘッダーまたは x-request-id にすることができます。

アプリケーションコンテナがアウトバウンドリクエストを開始すると、サイドカープロキシは contextId を使用してコンテキストマップを検索します。関連付けられた tagValue が見つかった場合、サイドカープロキシは次の 2 つのリクエストヘッダーをアウトバウンドリクエストに追加します。

  • 1 つの要求ヘッダーの名前は headerName で、値は tagValue です。

  • もう 1 つのリクエストヘッダーの名前は、TrafficLabel CRD で定義されているラベル名(例:ユーザー定義ラベルタグ値)で、値は です。

説明
  • この変数は、サイドカープロキシに対してのみ有効です。 ゲートウェイには有効ではありません。

  • デフォルトでは、map<contextId, tagValue> は Envoy プロキシのメモリに 30 秒間保存されます。

  • アプリケーションがトレースシステムに接続されている場合、トレース ID はコールチェーン全体のリクエストで使用されます。 したがって、トレース ID を contextId として使用できます。 トレースシステムごとに異なるトレース ID が使用されます。 詳細については、「Tracing」をご参照ください。

  • Istio プロキシはトレーススパンを自動的に送信できますが、トレース全体を結び付けるにはヒントが必要です。 アプリケーションは、Istio プロキシによって送信されたスパンを 1 つのトレースに正しく関連付けることができるように、関連する HTTP ヘッダーを伝達する必要があります。 詳細については、「ASM で分散トレースを有効にする」をご参照ください。

  • 対応する HTTP ヘッダーが伝播されない場合、送信トラフィックを contextId と関連付けることができません。その結果、サイドカープロキシは map<contextId,tagValue> から対応するトラフィックラベル値を取得できません。

$getLocalOutboundRequestHeader(headerName) の説明を表示する

この変数は、headerName という名前のヘッダーの値が、アプリケーションがサイドカープロキシに送信するリクエストから取得されることを示します。この関数変数に従って、トラフィックラベルの値は受信リクエストヘッダーから取得されます。 headerName パラメーターは、リクエストヘッダーのキーです。アプリケーションコンテナの実際の要求ヘッダーに基づいてパラメーターを指定できます。

次の図に示すように、サイドカープロキシが挿入されたアプリケーションコンテナがアウトバウンドリクエストを開始すると、サイドカープロキシはアウトバウンドリクエストにリクエストヘッダーを追加します。リクエストヘッダーの名前は、TrafficLabel CRD で定義されているラベル名(たとえば、userDefinedLabel)で、値は tagValue です。$getLocalOutboundRequestHeader(headerName)..png

説明

この変数は、サイドカープロキシに対してのみ有効です。 ゲートウェイには有効ではありません。

$getLabel(labelName) の説明を表示する

この変数は、labelName という名前のラベルの値がゲートウェイ ポッドまたはサイドカー コンテナのポッドから取得され、その値がアウトバウンド トラフィックに追加されることを示します。 labelName が空のままの場合、この変数はデフォルトでワークロード ポッドから ASM_TRAFFIC_TAG ラベルの値を取得します。

次の例では、ワークロードの ASM_TRAFFIC_TAG の値は test です。 $getLabel(ASM_TRAFFIC_TAG) 変数を使用して、値 test を取得できます。

サンプル YAML コードを表示する

apiVersion: apps/v1
kind: Deployment
metadata:
  name: productpage-v1
  labels:
    app: productpage
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: productpage
      version: v1
  template:
    metadata:
      annotations:
        sidecar.istio.io/logLevel: debug
      labels:
        app: productpage
        version: v1
        ASM_TRAFFIC_TAG: test
    spec:
      serviceAccountName: bookinfo-productpage
      containers:
      - name: productpage
        image: docker.io/istio/examples-bookinfo-productpage-v1:1.16.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
      volumes:
      - name: tmp
        emptyDir: {}

設定例

次の例では、ASM インスタンスのバージョンは 1.17 以降です。 ASM インスタンスの更新方法の詳細については、「ASM インスタンスを更新する」をご参照ください。

例 1:ワークロードのトラフィックのラベル付け

workloadSelector を定義してラベルに基づいてワークロードを選択し、名前空間内のワークロードのトラフィックにラベルを付けることができます。

  1. Bookinfo アプリケーションをデプロイします。 詳細については、「ASM インスタンスに追加された ACK クラスターにアプリケーションをデプロイする」をご参照ください。

  2. productpage-trafficlabel.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    apiVersion: istio.alibabacloud.com/v1
    kind: TrafficLabel
    metadata:
      name: productpage
      namespace: default
    spec:
      workloadSelector:
        labels:
          app: productpage
      rules:
      - labels:
          - name: asm-labels-test-a
            valueFrom:
            - $getExternalInboundRequestHeader(header1, x-request-id)
            - $getLabel(header2)
  3. 次のコマンドを実行して、productpage ワークロードのトラフィックにラベルを付けます。

     kubectl apply -n default  -f productpage-trafficlabel.yaml
  4. 次のコマンドを実行して、productpage ワークロードのプロキシ設定を表示します。

    kubectl exec -it -n default deploy/productpage-v1 -c istio-proxy -- curl localhost:15000/config_dump

    予期される出力:

    {
                  "name": "com.aliyun.traffic_label",
                  "typed_config": {
                   "@type": "type.googleapis.com/envoy.config.filter.traffic_label.v3alpha.TrafficLabel",
                   
                  }
                 },

    上記の filter 設定は、リスナー設定(type.googleapis.com/envoy.admin.v3.ListenersConfigDump)または dynamic_listenerstype.googleapis.com/envoy.config.listener.v3.Listener/envoy.filters.network.http_connection_manager/http_filters で確認できます。 これは、トラフィックラベルが設定されていることを示します。

  5. 次のコマンドを実行して、他のワークロード(details ポッドなど)のプロキシ設定を表示します。

    kubectl exec -it -n default deploy/details-v1 -c istio-proxy -- curl localhost:15000/config_dump |grep type.googleapis.com/envoy.config.filter.traffic_label.v3alpha.TrafficLabel

    返される結果は空で、関連する filter がないことを示しています。 結果は予想どおりです。

例 2:名前空間レベルでのトラフィックのラベル付け

workloadSelector フィールドを空のままにすると、ラベルは名前空間内のすべてのワークロードのトラフィックに追加されます。 次の例では、default 名前空間内のすべてのワークロードのトラフィックにラベルを付けます。

  1. all-workload-for-ns-trafficlabel.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    apiVersion: istio.alibabacloud.com/v1
    kind: TrafficLabel
    metadata:
      name: all-workload-for-ns
      namespace: default
    spec:
      rules:
      - labels:
          - name: asm-labels-test-b
            valueFrom:
            - $getExternalInboundRequestHeader(header1, x-request-id)
            - $getLabel(header2)
  2. 次のコマンドを実行して、default 名前空間内のすべてのワークロードのトラフィックにラベルを付けます。

     kubectl apply -n default -f all-workload-for-ns-trafficlabel.yaml

  3. 次のコマンドを実行して、ワークロード(details ポッドなど)のプロキシ設定を表示します。

    kubectl exec -it -n default deploy/details-v1 -c istio-proxy -- curl localhost:15000/config_dump |grep type.googleapis.com/envoy.config.filter.traffic_label.v3alpha.TrafficLabel

    予期される出力:

     "@type": "type.googleapis.com/envoy.config.filter.traffic_label.v3alpha.TrafficLabel",

    上記の出力は、トラフィックラベルが設定されていることを示します。