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/v1beta1をapiVersion: istio.alibabacloud.com/v1に変更してから、TrafficLabel を再設定してください。ASM インスタンスのバージョンが 1.17 より前の場合は、ASM インスタンスをバージョン 1.17 以降に更新するか、チケットを送信する してテクニカルサポートを受けることをお勧めします。
フィールドの説明
このセクションでは、バージョン 1.17 以降の ASM インスタンスの CRD フィールドについて説明します。
Spec
フィールド | タイプ | 必須 | 説明 |
workloadSelector | いいえ | セレクターがトラフィックラベルを適用するワークロード範囲を示します。 このフィールドを空のままにすると、セレクターは現在の名前空間のすべてのワークロードにトラフィックラベルを適用します。 | |
rules | はい | トラフィックラベルのルールを定義します。 |
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) | ゲートウェイまたはサイドカープロキシ |
設定例
次の例では、ASM インスタンスのバージョンは 1.17 以降です。 ASM インスタンスの更新方法の詳細については、「ASM インスタンスを更新する」をご参照ください。
例 1:ワークロードのトラフィックのラベル付け
workloadSelector を定義してラベルに基づいてワークロードを選択し、名前空間内のワークロードのトラフィックにラベルを付けることができます。
Bookinfo アプリケーションをデプロイします。 詳細については、「ASM インスタンスに追加された ACK クラスターにアプリケーションをデプロイする」をご参照ください。
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)次のコマンドを実行して、
productpageワークロードのトラフィックにラベルを付けます。kubectl apply -n default -f productpage-trafficlabel.yaml次のコマンドを実行して、
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_listenersのtype.googleapis.com/envoy.config.listener.v3.Listener/envoy.filters.network.http_connection_manager/http_filtersで確認できます。 これは、トラフィックラベルが設定されていることを示します。次のコマンドを実行して、他のワークロード(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 名前空間内のすべてのワークロードのトラフィックにラベルを付けます。
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)次のコマンドを実行して、default 名前空間内のすべてのワークロードのトラフィックにラベルを付けます。
kubectl apply -n default -f all-workload-for-ns-trafficlabel.yaml次のコマンドを実行して、ワークロード(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",上記の出力は、トラフィックラベルが設定されていることを示します。
である受信リクエストヘッダーから値を取得し、この値をトラフィックのラベル値 として使用します。