作者:尹航

概述

灰度发布是一种常见的对新版应用服务发布手段,其特点在于能够流量服务稳定版本和灰度版本之间时刻切换,以帮助我们用更加可靠方式实现服务升级。在流量比例切换过程中,我们可以逐步验证新版服务功能特性可靠性特性,一旦新版本服务不满足需求,还可以时刻将流量切回老版本,因此灰度发布也是一种在软件工程领域中得到广泛应用的发布方案

当前,服务网格的无侵入式灰度发布已经是一个非常成熟的特性:我们可以同时部署服务的多个版本使用 DestinationRule 来制定工作负载版本定义,并使用 VirtualService 的流量比例分割能力不同比例的服务流量发往不同版本工作负载,直至所有流量都直接发往新版本服务。

然而,在云原生应用广泛采用的大背景下,应用程序往往不再以单体服务的形式存在,而是被分解为一系列原生服务部署在 Kubernetes 集群中,服务之间存在调用链路、共同对外提供服务。

图片

当服务之间存在调用链路时,对服务的灰度发布往往不局限于单个服务,而是需要对服务的整条请求链路进行环境隔离与流量控制,即:保证灰度流量只发往调用链路中服务的灰度版本实现调用链路之间相互隔离隔离环境。针对整个调用链路的流量管理需求为服务网格的无侵入式流量管理方案带来了新的挑战:

服务网格 ASM 支持应用相关版本(或者其他特征隔离一个独立运行环境(即泳道),然后通过设置泳道规则,将满足规则的请求流量路由目标版本(或者其他特征)的应用上。ASM 流量泳道具有以下特点:

流量泳道的严格模式与宽松模式

1. 严格模式的流量泳道

在严格模式下,每条流量泳道中包含调用链路上的全部服务。该模式对于您的应用程序无任何要求,只需配置流量泳道即可实现。如下图所示

图片

2. 宽松模式的流量泳道

在宽松模式下,您只需要确保创建一条包含调用链路中所有服务的泳道:基线泳道。其它泳道可以包含调用链路上的全部服务。当一个泳道中的服务进行相互调用时,若目标服务在当前泳道中不存在,则请求将被转发到基线泳道中的相同服务,并在请求目标存在当前泳道中存在时将请求重新转发当前泳道。使用宽松模式的流量泳道时,您的应用程序必须包含一个能够在整条调用链路中透传的请求头(链路透传请求头),并另外使用一个引流请求头用来根据请求头内容将流量路由到不同的流量泳道上。如下图所示

图片

本文接下来主要演示严格模式泳道在服务网格 ASM 中的应用

演示:使用严格模式的 流量泳道实现全链路灰度管理

在本文的示例场景下,将使用上图所示的三个服务 mocka、mockbmockc 创建代表服务调用链三个版本的三个泳道:s1、s2、s3。

1. 前提条件

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:
        - '*'

2. 部署示例服务

首先在 ACK 集群中部署示例中的应用服务,以实现全链路灰度场景。为 default 命名空间启用 Sidecar 网格代理自动注入(具体操作,请参见启用自动注入 [ 5] ),接下来在 ACK 集群执行以下命令,部署示例服务。

kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v1/mock-v1.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v2/mock-v2.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v3/mock-v3.yaml

3. 创建泳道组和对应泳道

在示例中,我们将 mocka->mockb->mockc 服务调用链路的 v1、v2、v3 三个版本分隔成 s1、s2、s3 三条泳道,三条泳道组成的集合称为泳道组。在服务网格 ASM 中,可以通过简单的配置完成泳道组和泳道的创建

配置项 说明
泳道组名称 本示例配置为test
入口网关 选择ingressgateway
泳道模式 选择严格模式
泳道服务 选择目标Kubernetes集群default命名空间,在下方列表中选中mocka、mockb和mockc服务,单击图标添加目标服务到已选择区域

图片

接下来在泳道组内创建 s1、s2、s3 泳道,分别对应服务调用链路的 v1、v2、v3 版本。

图片

三个泳道创建完成后,示例效果如下

图片

每创建一个泳道,流量泳道会自动创建出泳道对应目标规则 DestinationRule。例如所有泳道创建完成后,会针对 mocka 服务自动创建如下目标规则 DestinationRule。

kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v1/mock-v1.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v2/mock-v2.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v3/mock-v3.yaml

三个泳道创建完成后,针对泳道组中的每个服务都将生成泳道规则对应虚拟服务 VirtualService例如,针对 mocka 服务会自动创建如下虚拟服务 VirtualService

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
 labels:
    asm-system: 'true'
    provider: asm
    swimlane-group: test
  name: trafficlabel-vs-test-default-mocka
  namespace: istio-system
spec:
  hosts:
    - mocka.default.svc.cluster.local
  http:
    - match:
        - sourceLabels:
            ASM_TRAFFIC_TAG: v1
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s1
    - match:
        - sourceLabels:
            ASM_TRAFFIC_TAG: v2
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s2
    - match:
        - sourceLabels:
            ASM_TRAFFIC_TAG: v3
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s3

最后创建各个泳道对应引流规则。通过不同的引流规则,ASM 网关可以将不同特征的请求路由到不同的泳道隔离环境之内,实现泳道内服务调用链路之间的完全隔离。下文以创建 s1 泳道的引流规则为例进行说明,请参照以下步骤创建 s2 和 s3 泳道的引流规则。

配置项 说明
入口服务 选择mocka.default.svc.cluster.local
引流规则 配置名称为r1,域名为*。
匹配请求的URI 配置匹配方式精确,匹配内容为/mock。
添加Header匹配规则 单击添加Header匹配规则,在添加的Header匹配规则中,填写称为x-asmprefer-tag,匹配方式精确,匹配内容为s1。

图片

三个泳道的引流规则创建成功后,示例效果如下

图片

创建成功后,会自动生成每条泳道的引流规则,即虚拟服务 VirtualService。例如,针对泳道 s1 会生成如下虚拟服务 VirtualService:


apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
 labels:
    asm-system: 'true'
    provider: asm
    swimlane-group: test
  name: swimlane-ingress-vs-test-s1
  namespace: istio-system
spec:
  gateways:
    - istio-system/ingressgateway
  hosts:
    - '*'
  http:
    - match:
        - headers:
            x-asm-prefer-tag:
              exact: s1
          uri:
            exact: /mock
      name: r1
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s1

4. 验证全链路灰度功能是否生效

通过以上的规则配置,ASM 流量泳道已经自动创建好了用于维护不同调用链路间相互隔离的流量规则。可以通过简单的访问验证通过流量泳道实现的全链路灰度是否生效

1)获取 ASM 网关的 IP 地址参考获取 ASM 网关地址 [ 7] )。

2)执行以下命令设置环境变量xxx.xxx.xxx.xxx 为上一步获取的 IP。

export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx

3)验证全灰度链路功能是否生效

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 泳道下的相关服务,符合预期。

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 泳道下的相关服务,符合预期。

  • 执行以下命令,查看 s3 泳道的访问效果。x-asm-prefer-tag 对应的值 s3 为步骤二创建 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: s3 声明的流量流向 s3 泳道下的相关服务,符合预期。

总结

本文简要讨论了在使用服务网格治理云原生应用流量时,在全链路流量管理场景下的挑战与局限;并介绍了服务网格 ASM 中的流量泳道能力在服务网格全链路流量管理下的优势与特点。接下来针对 ASM 流量泳道的严格模式进行了详细演示与说明。接下来我们还会针对宽松模式下的 ASM 流量泳道进行进一步地深入介绍

相关链接

[1] 创建 ASM 实例

https://help.aliyun.com/document_detail/147793.html#task-2370657

[2] 添加集群到 ASM 实例https://help.aliyun.com/document_detail/148231.html#task-2372122[3] 创建入口网关服务

https://help.aliyun.com/document_detail/150510.html#task-2372970

[4] 管理网关规则

https://help.aliyun.com/document_detail/150504.html[5] 开启 Sidecar 自动注入

https://help.aliyun.com/document_detail/186136.html#task-1962690

[6] ASM 控制台

https://servicemesh.console.aliyun.com/

[7] 获取 ASM 网关地址

https://help.aliyun.com/document_detail/444079.html#section-ida-zt6-md7

点击此处了解服务网格 ASM 产品详情

原文地址:https://blog.csdn.net/alisystemsoftware/article/details/134800979

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_47528.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注