在服務網格ASM中,流量標籤(TrafficLabel)支援標記流量,以便您更細緻地進行流量控制和管理。應用服務之間的流量請求被打上特定的標籤後,可以被劃分到不同的服務或者版本中。您可以根據標籤來進行流量控制、熔斷降級、限流等操作。ASM新增並擴充了流量標籤TrafficLabel自訂資源CRD,並通過該CRD定義具體的流量標籤邏輯,為命名空間和工作負載設定流量標籤。本文介紹流量標籤的配置說明、欄位說明和配置樣本。
配置說明
若ASM執行個體版本為1.17及以上,TrafficLabel CRD支援使用
apiVersion: istio.alibabacloud.com/v1。若您在ACK叢集進行了TrafficLabel的相關配置,請將對應的TrafficLabel CRD中的apiVersion: istio.alibabacloud.com/v1beta1修改為apiVersion: istio.alibabacloud.com/v1,再重新進行部署。若ASM執行個體版本為1.17以下,建議您將版本升級到1.17及以上,或提交工單擷取支援人員。
欄位說明
ASM執行個體版本為1.17及以上的欄位說明如下。
Spec
欄位 | 類型 | 是否必選 | 說明 |
workloadSelector | 否 | 作用的工作負載範圍。選取器決定在哪裡應用該流量標籤。 如果未設定,選取器將匹配當前命名空間下的所有工作負載。 | |
rules | 是 | 設定標籤的規則定義。 |
WorkloadSelector
欄位 | 類型 | 是否必選 | 說明 |
labels | map<string, string> | 否 | 在工作負載上應用的流量標籤。支援配置一個或多個標籤。 |
TrafficLabelRule
欄位 | 類型 | 是否必選 | 說明 |
labels | Label[] | 是 | 需要設定的標籤名稱與值。 |
Label
欄位 | 類型 | 是否必選 | 說明 |
name | string | 是 | 標籤名稱。該名稱需要符合HTTP要求標頭的命名規範。 |
valueFrom | string[] | 是 | 標籤值。取值採用自然順序的優先順序,優先從第一行擷取標籤值,當擷取不到時才會從第二行擷取標籤值,以此類推。 更多資訊,請參見valueFrom。 |
valueFrom
valueFrom支援以下四種變數。您可以展開表格下方的摺疊面板,查看變數的詳細說明。
變數 | 支援的工作負載類型 |
$getInboundRequestHeader(headerName) | 網關 |
$getExternalInboundRequestHeader(headerName, contextId) | Sidecar代理 |
$getLocalOutboundRequestHeader(headerName) | Sidecar代理 |
$getLabel(labelName) | 網關或者Sidecar代理 |
配置樣本
以下樣本的ASM執行個體版本為1.17及以上。關於升級執行個體的具體操作,請參見升級ASM執行個體。
樣本一:按照工作負載進行流量打標籤
通過定義workloadSelector根據標籤選擇對應的工作負載,可以實現對某個命名空間下的工作負載進行流量打標籤。
部署bookinfo應用。具體操作,請參見在ASM執行個體關聯的叢集中部署應用。
使用以下內容,建立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", } },在對應的Listener Config(
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,可以看到上述的filter配置內容,表明流量標籤配置成功。執行以下命令,查看其他工作負載(例如details Pod)對應的代理配置。
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,符合預期。
樣本二:按照命名空間進行流量打標籤
如果不定義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 Pod)對應的代理的配置。
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",輸出如上內容,表明流量標籤配置成功。


