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

本文涉及的产品
容器镜像服务 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

相关文章
|
2月前
|
域名解析 移动开发 负载均衡
阿里云DNS常见问题之DNS负载均衡调加权模式失败如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
11天前
|
弹性计算 供应链
阿里云服务器付费模式包年包月、按量付费、抢占式实例选择说明
阿里云ECS提供包年包月、按量付费和抢占式实例三种计费方式。选择建议:稳定需求选包年包月,动态需求选按量付费,无状态应用选抢占式实例以降低成本。可结合使用按量付费、预留实例券和节省计划以平衡灵活性和成本。需要资源保障则组合按量付费和资源保障。具体详情和规定可参考阿里云ECS官方文档
40 7
|
13天前
使用阿里云语音通知http批量推送模式获取用户回执短信内容
本文使用阿里云语音通知配置http批量推送模式获取用户回执信息,并进行测试
37 0
|
2月前
|
存储 域名解析 应用服务中间件
阿里云OSS对象存储,实现内网访问,免流量费用
阿里云OSS对象存储,实现内网访问,免流量费用
457 2
|
3月前
|
弹性计算
2024阿里云服务器带宽计费价格表_流量费用_固定带宽报价
2024阿里云服务器带宽计费价格表_流量费用_固定带宽报价,北京地域服务器按固定带宽计费一个月23元/M,按使用流量计费0.8元/GB
374 5
|
3月前
|
弹性计算
阿里云服务器“带宽计费模式”详细说明_2024固定带宽和流量详解
阿里云服务器“带宽计费模式”详细说明_2024固定带宽和流量详解,按固定带宽是指直接购买多少M带宽,比如1M、5M、10M、100M等,阿里云直接分配用户所购买的带宽值,根据带宽大小先付费再使用;按使用流量是先设置一个带宽峰值,然后根据实际公网产生的出流量来计算费用,先使用后付费
|
3月前
|
弹性计算
阿里云服务器的带宽计费模式是什么意思?咋收费的?
阿里云服务器带宽计费模式分为“按固定带宽”和“按使用流量”,有什么区别?按固定带宽是指直接购买多少M带宽,比如1M、5M、10M、100M等,阿里云直接分配用户所购买的带宽值,根据带宽大小先付费再使用;按使用流量是先设置一个带宽峰值,然后根据实际公网产生的出流量来计算费用,先使用后付费。阿里云百科分享阿里云服务器“带宽计费模式”详细区别、计费及注意事项
|
3月前
|
弹性计算
阿里云带宽计费模式是怎么回事?
阿里云带宽计费模式是怎么回事?带宽计费模式分为“按固定带宽”和“按使用流量”,有什么区别?按固定带宽是指直接购买多少M带宽,比如1M、5M、10M、100M等,阿里云直接分配用户所购买的带宽值,根据带宽大小先付费再使用;按使用流量是先设置一个带宽峰值,然后根据实际公网产生的出流量来计算费用,先使用后付费
|
11天前
|
存储 弹性计算 固态存储
阿里云服务器CPU内存配置详细指南,如何选择合适云服务器配置?
阿里云服务器配置选择涉及CPU、内存、公网带宽和磁盘。个人开发者或中小企业推荐使用轻量应用服务器或ECS经济型e实例,如2核2G3M配置,适合低流量网站。企业用户则应选择企业级独享型ECS,如通用算力型u1、计算型c7或通用型g7,至少2核4G配置,公网带宽建议5M,系统盘可选SSD或ESSD云盘。选择时考虑实际应用需求和性能稳定性。
117 6
|
13天前
|
域名解析 弹性计算 Linux
阿里云购买云服务器、注册域名、备案及绑定图文教程参考
本文为大家介绍了2024年购买阿里云服务器和注册域名,绑定以及备案的教程,适合需要在阿里云购买云服务器、注册域名并备案的用户参考,新手用户可通过此文您了解在从购买云服务器到完成备案的流程。
阿里云购买云服务器、注册域名、备案及绑定图文教程参考