阿里云服务网格ASM的流量标签及路由功能之(3): 泳道模式下的流量管理

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文介绍如何在ASM中使用泳道模式下的流量管理功能。具体关于ASM中的全链路灰度相关概念可以参考https://help.aliyun.com/document_detail/375313.html。

本文介绍如何在ASM中使用泳道模式下的流量管理功能。具体关于ASM中的全链路灰度相关概念可以参考https://help.aliyun.com/document_detail/375313.html

前提条件

  • 已创建ASM企业版或旗舰版实例,且版本为v1.17.2.22或以上。具体操作,请参见创建ASM实例
  • 已创建ACK集群, 并已添加集群到ASM实例。具体操作,请参见添加集群到ASM实例
  • 已创建了名称为ingressgateway的ASM网关。具体操作,请参见创建入口网关服务
  • 已经创建了名称为ingressgateway且命名空间为istio-system的规则配置, 定义如下:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: ingressgateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - '*'

功能介绍

灰度发布的核心思想是根据请求内容或者请求流量的比例将线上流量的一小部分转发至新版本,待灰度验证通过后,逐步调大新版本的请求流量,是一种循序渐进的发布方式。全链路灰度治理策略主要专注于整个调用链,它不关心链路上经过具体哪些微服务,流量控制视角从服务转移至请求链路上,仅需要少量的治理规则即可构建出从网关到整个后端服务的多个流量隔离环境,有效保障了多个服务顺利安全发布以及服务多版本并行开发,进一步促进业务的快速发展。

本文示例场景如下,图中有三个泳道s1、s2、s3,分别包含三个服务mocka、mockb、mockc。在ASM控制台部署泳道后,查看各个泳道的流量分布是否符合预期。

image.png

步骤一:部署示例服务

  1. 为命名空间default开启自动注入。
    1. 登录ASM控制台。在左侧导航栏,选择服务网格 > 网格管理
    2. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    3. 在网格详情页面左侧导航栏,选择网格实例 > 全局命名空间
    4. 在命名空间default右侧的自动注入列下,单击启用Sidecar自动注入。关于自动注入的更多信息,请参见多种方式灵活开启自动注入
  2. 在ACK集群中执行如下命令,部署示例服务。
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v1/application-v1.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v2/application-v2.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v3/application-v3.yaml

步骤二:创建泳道组和对应泳道

  1. 创建泳道组。
    1. 登录ASM控制台。在左侧导航栏,选择服务网格 > 网格管理
    2. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    3. 在网格详情页面左侧导航栏选择流量管理中心 > 全链路灰度
    4. 全链路灰度页面,单击创建泳道组,在创建泳道组面板,配置相关参数,然后单击确定。部分参数说明如下:
参数 说明
泳道组名称 本文配置为test。
入口网关 本文配置为ingressgateway
泳道服务 选择目标Kubernetes集群命名空间,在下方列表中选中mockamockbmockc服务,单击image.png图标,添加目标服务到已选择区域。

此时, 会生成对应的流量标签TrafficLabel:

apiVersion: istio.alibabacloud.com/v1beta1
kind: TrafficLabel
metadata:
  labels:
    asm-system: 'true'
    provider: asm
  name: asm-trafficlabel-global
  namespace: istio-system
spec:
  rules:
    - labels:
        - name: asm-label
          valueFrom:
            - $getLabel(ASM_TRAFFIC_TAG)
  1. 创建s1、s2、s3泳道,并分别绑定v1、v2、v3版本。本文以创建s1泳道为例进行说明,请参照以下步骤创建s2和s3泳道。
    1. 全链路灰度页面的流量分配区域,单击创建泳道
    2. 创建泳道对话框中,配置相关参数,然后单击确定image.png

部分参数说明如下:创建完成后,示例效果如下:image.png

参数 说明
泳道名称 支持配置1~63个字符,可包含数字、字母和短划线(-)。本文配置为s1。说明 访问服务时,带上对应的Header请求('x-asm-prefer-tag: 泳道名称')会路由到对应的版本。
配置服务标签 配置为v1。
添加服务 选择mocka(default)mockb(default)mockc(default)

每创建一个泳道, 会创建对应的目标规则DestinationRule。例如创建完泳道s1之后, 将会创建如下类似内容的目标规则DestinationRule:

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  creationTimestamp: '2023-05-29T09:06:09Z'
  generation: 3
  labels:
    asm-system: 'true'
    provider: asm
    swimlane-group: test
  name: trafficlabel-dr-test-default-mocka
  namespace: istio-system
  resourceVersion: '1310364657'
  uid: 7112ce64-0176-4ff3-b5f3-6626308510d4
spec:
  host: mocka.default.svc.cluster.local
  subsets:
    - labels:
        ASM_TRAFFIC_TAG: v1
      name: s1
    - labels:
        ASM_TRAFFIC_TAG: v1
      name: v1
    - labels:
        ASM_TRAFFIC_TAG: v2
      name: v2
    - labels:
        ASM_TRAFFIC_TAG: v2
      name: s2
    - labels:
        ASM_TRAFFIC_TAG: v3
      name: v3
    - labels:
        ASM_TRAFFIC_TAG: v3
      name: s3
  1. 创建各个泳道对应的引流规则。
    1. 全链路灰度页面的流量分配区域,单击目标泳道右侧操作列下的引流规则
    2. 添加引流规则对话框中,配置相关参数,然后单击确定。本文以泳道服务对应入口API均为/mock为例,为每个泳道配置相同的引流规则,配置信息如下。各个泳道的引流规则创建成功后,示例效果如下:image.png
参数 说明
入口服务 配置为mocka.default.svc.cluster.local
引流规则 配置名称仅为作为路由名称, 例如可以分别定义为rule1、rule2或者rule3等。域名表示流量路由发送的目标主机名, 例如可以定义*
匹配URI 配置匹配方式精确,本示例中匹配内容为/mock。

对应生成如下类似内容的虚拟服务:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  creationTimestamp: '2023-05-29T09:13:00Z'
  generation: 3
  labels:
    asm-system: 'true'
    istioGateway: ingressgateway
    provider: asm
  name: ingressgateway
  namespace: istio-system
  resourceVersion: '1310388638'
  uid: d60baa2f-3a12-472f-881a-15d21004748f
spec:
  gateways:
    - istio-system/ingressgateway
  hosts:
    - '*'
  http:
    - match:
        - headers:
            x-asm-prefer-tag:
              exact: s2
          uri:
            exact: /mock
      name: swimelane-ingress-route-test-s2-rule2
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s2
    - match:
        - headers:
            x-asm-prefer-tag:
              exact: s3
          uri:
            exact: /mock
      name: swimelane-ingress-route-test-s3-rule3
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s3
    - match:
        - headers:
            x-asm-prefer-tag:
              exact: s1
          uri:
            exact: /mock
      name: swimelane-ingress-route-test-s1-rule1
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s1

步骤三:验证全灰度链路功能是否生效

  1. 通过ASM控制台获取网关的公网IP,执行以下命令。

    export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx
    
  2. 以s1和s2泳道进行验证全灰度链路功能是否生效,您可以参照以下步骤自行验证s3泳道。

执行以下命令,查看s1泳道的访问效果。其中x-asm-prefer-tag对应的值s1步骤2创建s1泳道时配置的泳道名称。

for i in {
   
   1..100};  do curl   -H 'x-asm-prefer-tag: s1' http://${
   
   ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

预期输出:

-> mocka(version: v1, ip: 172.17.0.54)-> mockb(version: v1, ip: 172.17.0.129)-> mockc(version: v1, ip: 172.17.0.130)

通过设置HTTP标头 x-asm-prefer-tag: s1声明流量应该流向泳道s1下的相关服务,由预期输出得到,符合预期。

  1. 执行以下命令,查看s2泳道的访问效果。s2步骤2创建s2泳道时配置的泳道名称。
    for i in {
         
         1..100};  do curl   -H 'x-asm-prefer-tag: s2' http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;
    
    预期输出:
    -> mocka(version: v2, ip: 172.17.0.9)-> mockb(version: v2, ip: 172.17.0.126)-> mockc(version: v2, ip: 172.17.0.128)
    
    通过设置HTTP标头 x-asm-prefer-tag: s2声明流量应该流向泳道s2下的相关服务,由预期输出得到,符合预期。

4.执行以下命令,查看s2泳道的访问效果。s3步骤2创建s3泳道时配置的泳道名称。

for i in {
   
   1..100};  do curl   -H 'x-asm-prefer-tag: s3' http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

预期输出:

-> mocka(version: v3, ip: 172.17.0.132)-> mockb(version: v3, ip: 172.17.0.127)-> mockc(version: v3, ip: 172.17.0.69)

通过设置HTTP标头 x-asm-prefer-tag: s2声明流量应该流向泳道s2下的相关服务,由预期输出得到,符合预期。

步骤四:查看网格拓扑

如果已经通过ASM控制台开启网格拓扑的可观测性, 参见文档https://help.aliyun.com/document_detail/200336.html?spm=a2c4g.158935.0.0.794e5a84b04yWj,
那么可以查看在上述请求下的网格拓扑, 类似结果如下。

image.png

相关文章
|
1月前
|
人工智能 自然语言处理 安全
使用阿里云服务网格高效管理LLM流量:(一)流量路由
ASM支持通过LLMProvider和LLMRoute资源管理大型语言模型流量。LLMProvider负责注册LLM服务,LLMRoute负责设定流量规则,应用可灵活切换模型,满足不同场景需求。
|
2月前
|
负载均衡 测试技术 网络安全
阿里云服务网格ASM多集群实践(一)多集群管理概述
服务网格多集群管理网络打通和部署模式的多种最佳实践
|
1月前
|
Cloud Native 测试技术 开发者
阿里云服务网格ASM多集群实践(二):高效按需的应用多环境部署与全链路灰度发布
介绍服务网格ASM提出的一种多集群部署下的多环境部署与全链路灰度发布解决方案。
|
2月前
|
人工智能 安全 Go
使用阿里云服务网格 ASM LLMProxy 插件保障大模型用户数据安全
本文介绍如何使用ASM LLMProxy动态为LLM请求添加API_KEY、使用模式匹配以及私有大模型判别请求敏感信息并根据判别结果拒绝请求等功能,帮助用户提升LLM场景下的安全水位。
|
3月前
|
Oracle 关系型数据库
oracle asm 磁盘显示offline
oracle asm 磁盘显示offline
179 2
|
3月前
|
存储 Oracle 关系型数据库
【数据库数据恢复】Oracle数据库ASM磁盘组掉线的数据恢复案例
oracle数据库ASM磁盘组掉线,ASM实例不能挂载。数据库管理员尝试修复数据库,但是没有成功。
【数据库数据恢复】Oracle数据库ASM磁盘组掉线的数据恢复案例
|
SQL Oracle 关系型数据库
Oracle ASM磁盘和磁盘组的常用SQL语句
Oracle ASM磁盘和磁盘组的常用SQL语句
259 0
|
文字识别 Oracle NoSQL
oracle 11g 单机asm配置
oracle 11g 单机asm配置
614 0
|
Oracle 关系型数据库
❤️Oracle ASM加磁盘及剔盘操作❤️
❤️Oracle ASM加磁盘及剔盘操作❤️
276 0