阿里云服务网格ASM的流量标签及路由功能之(1): 流量标签定义

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 服务网格ASM新增扩展了流量标签TrafficLabel 自定义资源CRD。 通过该CRD定义具体的流量标签逻辑,实现为命名空间、工作负载进行设置流量标签。

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

在服务网格ASM中,流量标签是指将流量进行标记以便进行更细致的流量控制和管理。通过为应用服务之间的流量请求打上特定的标签,可以将它们划分到不同的服务或者版本中,并根据标签来进行流量控制、熔断降级、限流等操作。

服务网格ASM新增扩展了流量标签TrafficLabel 自定义资源CRD。 通过该CRD定义具体的流量标签逻辑,实现为命名空间、工作负载进行设置流量标签。

TrafficLabel 定义说明

  • 若ASM实例版本为1.17或以上,支持使用apiVersion: istio.alibabacloud.com/v1。若您在ACK集群进行了相关配置,请将对应的TrafficLabel CRD中的apiVersion: istio.alibabacloud.com/v1beta1修改为apiVersion: istio.alibabacloud.com/v1,再重新进行部署。
  • 若ASM实例版本为1.17之前的版本,建议升级到1.17版本, 或提交工单获得支持。

例如, 在1.17或以上版本中使用如下参数定义:

apiVersion: istio.alibabacloud.com/v1
kind: TrafficLabel
metadata:
  name: example
  namespace: default
spec:
  workloadSelector:
    labels:
      app: httpbin
  rules:
  - labels:
      - name: asm-labels-test
        valueFrom:
        - $getLabel(ASM_TRAFFIC_TAG)

版本1.17或更新版本

如果ASM实例版本升级为1.17或以上,使用apiVersion: istio.alibabacloud.com/v1

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)

Spec定义说明

字段 类型 描述 是否必须
workloadSelector WorkloadSelector 表示作用于的工作负载范围。选择器决定在哪里应用该流量标签。如果未设置,选择器将匹配当前命名空间下的所有工作负载。
rules []TrafficLabelRule 表示设置标签的规则描述

WorkloadSelector 属性字段

字段 类型 描述 是否必须
labels map《string, string》 一个或多个标签,表示应在其上应用流量标签

TrafficLabelRule 属性字段

字段 类型 描述 是否必须
labels []Label 表示要设置的标签名称与值

Label 属性字段

字段 类型 描述 是否必须
name string 标签名称, 符合http 请求头的命名规范
valueFrom []string 标签值。 valueFrom的参数值采用自然顺序的优先级, 优先从第一行获取标签值,当获取不到时才会从第二行获取标签值, 以此类推。具体说明参见下面的valueFrom 属性值定义。

valueFrom 属性值定义

支持 $getInboundRequestHeader(headerName)、$getExternalInboundRequestHeader(headerName, contextId)、$getLocalOutboundRequestHeader(headerName)、$getLabel(labelName) 4种变量。
简要说明如下:

变量定义 支持的工作负载类型 描述
$getInboundRequestHeader(headerName) 网关 从进入网关的请求头中获取名称为headerName的标头值
$getExternalInboundRequestHeader(headerName, contextId) Sidecar代理 从进入Sidecar代理的请求中获取名称为headerName的标头值
$getLocalOutboundRequestHeader(headerName) Sidecar代理 从由应用服务发出至Sidecar代理的请求中获取名称为headerName的标头值
$getLabel(labelName) 网关或者Sidecar代理 从网关Pod/Sidecar容器所属Pod的标签中获取名称为labelName的标签值

详细说明如下:

$getInboundRequestHeader(headerName)

$getInboundRequestHeader(headerName)是个函数型变量,需要从出口请求头中获取,其中参数headerName是指请求头的关键字key。如果参数值为空, 默认为x-asm-prefer-tag。
说明 仅针网关生效, 对于对Sidecar代理不生效。

对于入口网关来说, 如下图所示,会为出口请求中附加1个新请求头:

  • 名称为流量标签TrafficLabel CRD中定义的标签名(如上述示例中的asm-labels-test-a), 值为tagValue;

image.png

$getExternalInboundRequestHeader(headerName, contextId)

$getExternalInboundRequestHeader(headerName,contextId)是个函数型变量,需要从流量请求的上下文中获取,其中:

  • 参数headerName是指请求头的关键字key,必填项, 且值不能为空, 例如x-asm-prefer-tag。
  • 参数contextId是指一个贯穿整个调用链路的请求头字段, 其值可以是某一个用户指定的入口请求头, 或者可以使用Tracing系统中的Trace ID。必填项, 且值不能为空。

说明 仅针对Sidecar代理生效, 对于网关不生效。

Sidecar包含入口和出口两种类型的流量,流量打标本质上是对出口流量设置标签。默认情况下, Sidecar代理从入口请求头(名称为headerName)中获取对应的值, 并以此作为流量打标的标签值tagValue。

image.png

为将标签值tagValue附加到出口流量请求中, 在Sidecar代理的内部逻辑中维持一个map, 其中contextId需要是一个贯穿整个调用链路的请求头字段, 其值可以是某一个用户指定的入口请求头, 或者使用x-request-id作为contextId。

当业务容器发起出口请求时,Sidecar代理会通过contextId查找上下文map。若找到关联tagValue,则Sidecar代理会为出口请求中附加2个新请求头:

  • 名称为headerName, 值为tagValue;
  • 名称为流量标签TrafficLabel CRD中定义的标签名(如上述示例中的asm-labels-test-a), 值为tagValue;

说明

  • map存储在Envoy内存中,默认30秒过期。
  • 业务应用接入Trace系统时, TraceID会贯穿整个调用链路的请求, 因此可以使用TraceID作为上述contextId。 具体来说, 采用不同的Trace系统则会有不同TraceID。更多信息参见Tracing
  • 虽然Istio代理能够自动发送Tracing Span信息,但是应用程序仍然需要传播相关的HTTP标头,以便在代理发送Span时,可以将Span正确地关联到单个跟踪中, 具体参见:https://help.aliyun.com/document_detail/149551.html?spm=a2c4g.375313.0.0.56a356279kDUsS#h2-url-2
  • 若没有传播对应的HTTP标头,则出口流量会因为找不到关联的contextId, Sidecar代理将无法从map 找到对应的流量标签值。

$getLocalOutboundRequestHeader(headerName)

$getLocalOutboundRequestHeader(headerName)是个函数型变量,需要从出口请求头中获取,其中参数headerName是指请求头的关键字key,可以根据业务容器实际的请求头进行指定。
说明 仅针对Sidecar代理生效, 对于网关不生效。

当注入了Sidecar代理的业务容器发起出口请求时, 如下图所示,Sidecar代理会为出口请求中附加1个新请求头:

  • 名称为流量标签TrafficLabel CRD中定义的标签名(如上述示例中的asm-labels-test-a), 值为tagValue;

image.png

$getLabel(labelName)

$getLabel(labelName)是指从Sidecar代理所属的Pod或网关Pod(注意不是Deployment)中获取名称为labelName的标签对应的值,并将该值附加到出口流量上。如果labelName为空, 即默认从工作负载Pod上的标签ASM_TRAFFIC_TAG取值.
例如以下工作负载定义了ASM_TRAFFIC_TAG值为test, 那么通过$getLabel(ASM_TRAFFIC_TAG)可以获取标签值为test。

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: {
   
   }

版本1.16或之前

建议升级到1.17版本, 或提交工单获得支持。

使用示例

注意: 以下示例基于1.17版本或以上。

示例1:按照工作负载进行流量打标签

通过定义workloadSelector根据标签选择对应的工作负载, 可以实现对某个命名空间下的工作负载进行流量打标签。

例如, 按照入门文档https://help.aliyun.com/document_detail/149547.html 部署bookinfo应用之后, 以下示例是针对productpage工作负载进行打标签。

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)

1)将上述内容保存为文件productpage-trafficlabel.yaml, 并执行如下命令:

 kubectl apply -n default  -f productpage-trafficlabel.yaml

2) 查看productpage工作负载对应的代理的配置:

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

在对应的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配置内容:

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

              }
             },

3) 此外, 查看其他工作负载如details Pod对应的代理的配置, 可以看到没有相关的filter出现:

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

执行上述命令之后, 返回结果为空。

示例2:按照命名空间进行流量打标签

如果不定义workloadSelector字段, 将对命名空间下所有的工作负载进行流量打标签。 例如, 如下配置将对命名空间default下的所有工作负载进行流量打标签。

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)

1)将上述内容保存为文件all-workload-for-ns-trafficlabel.yaml, 并执行如下命令:

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

2) 此时, 查看工作负载如details Pod对应的代理的配置, 可以看到有相关的filter出现:

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",

相关文章
|
17天前
|
弹性计算 运维 监控
解密阿里云弹性计算:探索云服务器ECS的核心功能
阿里云ECS是核心计算服务,提供弹性云服务器资源,支持实例按需配置、集群管理和监控,集成安全防护,确保服务稳定、安全,助力高效业务运营。
290 0
|
5天前
|
弹性计算 运维 Serverless
阿里云Elasticsearch Serverless帮助某视觉科技公司平稳应对流量激增
某视觉科技公司借助阿里云Elasticsearch Serverless应对创意资源平台的流量激增,通过服务自动扩缩容,确保流量高峰时的快速响应,降低至少50%的成本。同时,它提供弹性数据容量支持,简化运维,提升开发效率,并保证高精确度的搜索体验。
|
16天前
|
存储 SQL 分布式计算
|
17天前
|
SQL 数据管理 API
数据管理DMS产品使用合集之阿里云DMS提供API接口来进行数据导出功能吗
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
17天前
|
人工智能 定位技术 云计算
阿里云+Salesforce:更多功能,上新!
阿里云+Salesforce:更多功能,上新!
27 1
|
17天前
|
应用服务中间件 API 开发工具
阿里云视频点播功能
阿里云视频点播功能
22 0
|
17天前
|
弹性计算 Ubuntu 网络协议
阿里云CDN功能Quick Start
本文通过在国外Region ECS创建ECS,通过ECS部署应用,然后使用CDN加速部署应用,全链路测试体验阿里云CDN通过IP加速服务的功能。
|
3天前
|
存储 固态存储 安全
阿里云4核CPU云服务器价格参考,最新收费标准和活动价格
阿里云4核CPU云服务器多少钱?阿里云服务器核数是指虚拟出来的CPU处理器的核心数量,准确来讲应该是vCPU。CPU核心数的大小代表了云服务器的运算能力,CPU越高,云服务器的性能越好。阿里云服务器1核CPU就是一个超线程,2核CPU2个超线程,4核CPU4个超线程,这样云服务器可以同时处理多个任务,计算性能更强。如果网站流程较小,少量图片展示的企业网站,建议选择2核及以上CPU;如果网站流量较大,动态页面比较多,有视频等,建议选择4核、8核以上CPU。
阿里云4核CPU云服务器价格参考,最新收费标准和活动价格
|
5天前
|
存储 弹性计算 缓存
阿里云2核CPU云服务器租用收费标准与活动价格参考
阿里云2核CPU云服务器多少钱?阿里云服务器核数是指虚拟出来的CPU处理器的核心数量,准确来讲应该是vCPU。CPU核心数的大小代表了云服务器的运算能力,CPU越高,云服务器的性能越好。阿里云服务器1核CPU就是一个超线程,2核CPU2个超线程,4核CPU4个超线程,这样云服务器可以同时处理多个任务,计算性能更强。如果网站流程较小,少量图片展示的企业网站,建议选择2核及以上CPU;如果网站流量较大,动态页面比较多,有视频等,建议选择4核、8核以上CPU。
阿里云2核CPU云服务器租用收费标准与活动价格参考
http://www.vxiaotou.com