在服务网格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",- 输出如上内容,表明流量标签配置成功。 


