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