微服务为我们带来了快速开发部署的优秀特性,而如何降低开发和变更的风险成为了一个问题。Istio的流量镜像,也称为影子流量,是将生产流量镜像拷贝到测试集群或者新的版本中,在引导实时流量之前进行测试,可以有效地降低版本变更风险。

流量镜像有以下优点:

1.当流量镜像到不同的服务时,会发生在请求的关键路径之外,这样流量镜像产生的任何问题都不会影响到生产;

2.忽略对任何镜像流量的响应; 流量被视为“即发即忘”,这样就不会干扰到正常的生产流量的响应;

3.当流量被镜像时,请求将通过其主机/授权报头发送到镜像服务附上 –shadow,用以区分流量从何处被镜像到何处;

4.利用实时生产用例和流量可以有更真实的测试服务环境,有效降低了部署的风险;

下面介绍几种典型的使用场景可以发挥流量镜像的优势:

1.用于测试:测试集群的测试可以使用生产实例真实流量,不会影响正常生产的关键路径。

2.用于新版本校验:可以实时对比生产流量和镜像流量的输出结果。

3.用于协作服务版本回退:当用到镜像流量的服务需要修改协作服务时,因为镜像模式添加了-shadow标记, 所以可以正常处理镜像请求,并在提交之前回滚。不会让镜像版本的更改影响生产版本。

4.隔离测试数据库:与数据处理相关的业务,可以使用空的数据存储并加载测试数据,针对该数据进行镜像流量操作,实现测试数据的隔离。

下面通过实例来演示一下,先让所有流量都到v1版本,然后使用规则将流量镜像到v2版本:

环境准备:需要httpbin和tutum/curl两个应用镜像

步骤一(配置并启动服务):

首先部署两个版本的httpbin服务:

httpbin-v1:

httpbin-v2:

部署sleep服务,为curl来提供负载:

当完成以上的配置文件后,就可以用kubectl create –f ./yourconfig.yaml来启动服务,用kubectl get pod 来查看服务的运行状态:

启动httpbin service:

先通过kubectl get svc 查看是否有httpbin service。如果已创建service, 需要用kubectl delete service httpbin 删除,并通过下图所示yaml 新建service:

步骤二(创建路由策略):

1.使用kubectl delete virtualservice httpbin,kubectl delete destinationrule httpbin删除已有httpbin策略,并通过下图yaml来创建新的路由策略,将全部的流量导入到v1版本:

通过kubectl create –f ./yourrules.yaml生效:

2.现在服务已经搭建好了,我们向服务发送一些流量:

3.分别查看httpbin的v1,v2的pod中的日志:

我们可以发现v1 pod中有刚才流量访问的记录,而v2的pod中日志为空,说明流量并没有进入到v2的pod中,这与我们全部流量导入到v1中的策略相匹配。

步骤三(镜像流量):

1. 修改路由规则将流量镜像到v2服务:

删除之前部署的virtualservice规则,将上图的yaml用kubectl create –f 部署,其中mirror字段将流量镜像指定到v2服务。

2.发送流量:

通过指令

kubectl exec -it $SLEEP_POD -c sleep -- sh -c 'curl  http://httpbin:8080/headers' | python -m json.tool 发送流量:

3.查看v1和v2的访问日志:

通过对比记录的时间戳我们可以发现在更改策略后,v1的流量被镜像到了v2。日志中的v2报文比v1大是流量被标记为影子流量所致。

步骤四(清除):

1.清除路由规则:

kubectl delete virtualservice httpbin

kubectl delete destinationrule httpbin

2.关闭httpbin/sleep服务:

kubectl delete deploy httpbin-v1 httpbin-v2 sleep

kubectl delete svc httpbin

通过以上步骤我们知道了如何设置路由规则来引入流量镜像。

相关服务请访问https://support.huaweicloud.com/cce/index.html?cce_helpcenter_2019

idou老师教你学Istio12 : Istio 实现流量镜像的更多相关文章

  1. idou老师教你学Istio11 : 如何用Istio实现流量熔断

    在之前的最佳实践中,已经带大家通过一系列的实践任务领略了Istio的无穷魅力.今天,将向大家介绍如何用Istio实现流量熔断. 熔断机制是创建弹性微服务应用程序的重要模式.熔断可以帮助您自由控制故障影 ...

  2. idou老师教你学Istio 07: 如何用istio实现请求超时管理

    在前面的文章中,大家都已经熟悉了Istio的故障注入和流量迁移.这两个方面的功能都是Istio流量治理的一部分.今天将继续带大家了解Istio的另一项功能,关于请求超时的管理. 首先我们可以通过一个简 ...

  3. idou老师教你学Istio06: 如何用istio实现流量迁移

    流量迁移是流量管理的一个重要功能.istio提供的流量管理功能将流量从基础设施扩展中解耦,支持动态请求路由,故障注入.超时重试.熔断和流量迁移等.流量迁移的主要目的是将流量从微服务的某一版本的逐步迁移 ...

  4. idou老师教你学istio1:如何为服务提供安全防护能力

    之前,已为大家介绍过 Istio 第一主打功能---连接服务. 凡是产生连接关系,就必定带来安全问题,人类社会如此,服务网格世界,亦是如此. 今天,我们就来谈谈Istio第二主打功能---保护服务. ...

  5. idou老师教你学Istio :如何用istio实现监控和日志采集

    大家都知道istio可以帮助我们实现灰度发布.流量监控.流量治理等功能.每一个功能都帮助我们在不同场景中实现不同的业务.那Istio是如何帮助我们实现监控和日志采集的呢? 这里我们依然以Bookinf ...

  6. idou老师教你学istio :基于角色的访问控制

    istio的授权功能,也称为基于角色的访问控制(RBAC),它为istio服务网格中的服务提供命名空间级别.服务级别和方法级别的访问控制.基于角色的访问控制具有简单易用.灵活和高性能等特性.本文介绍如 ...

  7. idou老师教你学Istio 17 : 通过HTTPS进行双向TLS传输

    众所周知,HTTPS是用来解决 HTTP 明文协议的缺陷,在 HTTP 的基础上加入 SSL/TLS 协议,依靠 SSL 证书来验证服务器的身份,为客户端和服务器端之间建立“SSL”通道,确保数据运输 ...

  8. idou老师教你学Istio: 如何用Istio实现K8S Egress流量管理

    本文主要介绍在使用Istio时如何访问集群外服务,即对出口流量的管理. 默认安装的Istio是不能直接对集群外部服务进行访问的,如果需要将外部服务暴露给 Istio 集群中的客户端,目前有两种方案: ...

  9. idou老师教你学Istio:如何用 Istio 实现速率限制

    使用 Istio 可以很方便地实现速率限制.本文介绍了速率限制的使用场景,使用 memquota\redisquota adapter 实现速率限制的方法,通过配置 rule 实现有条件的速率限制,以 ...

随机推荐

  1. js 高级程序设计 第四章学习笔记

    问题:怎么才能形象的理解堆栈空间? 1. 声明变量 使用 var 声明的变量会自动被添加到最接近的环境中.在函数内部,最接近的环境就是函数的局部 环境:在 with 语句中,最接近的环境是函数环境.如 ...

  2. 无缝轮播 css3

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. iOS-UIButton分类扩展(封装)

    UIButton+BackgroundColor.h #import <UIKit/UIKit.h> @interface UIButton (BackgroundColor) - (vo ...

  4. todolist形式的搜索框,分开组件写的,点击上下键时,框内显示当前选中的内容

    ### 首先  安装react 脚手架 cnpm  install  create-react-app  -g      //只需要在电脑上安装一次就好了,以后不用再下载了 ### 创建项目 crea ...

  5. Android_7.1.1_r6源码编译

    上篇文章讲述了如何下载Android源码,在篇文章就来说一说Android源码编译.其实一般来说如果修改的软件和底层没什么关系,直接提取相应的源代码到Android Studio编译就可以了,如果是与 ...

  6. kubespray部署k8s

    0.把外网的/usr/local/bin/*拷过来覆盖 1.把部署好的集群的 calicoctl cni-plugins-linux-amd64-v0.8.1.tgz kubeadm-v1.16.3- ...

  7. JavaScript、TypeScript、ES6三者之间的联系和区别

    ES6是什么 ECMAScript 6.0(以下简称ES6)是JavaScript语言(现在是遵循ES5标准)的下一代标准,已经在2015年6月正式发布了.它的目标,是使得JavaScript语言可以 ...

  8. laydate年份选择,关闭底框,点击指定年份就选择然后关闭控件,翻页不选择也不关闭控件

    如下图,翻页不选择也不关闭.点击指定年份时再选择和关闭控件 代码如下 // 默认没有选择,把判断赋值当前时间 var iYearCode = parseInt(new Date().getFullYe ...

  9. Chrome 浏览器光标定位到地址栏

    Windows: Ctrl + L 或 Alt + D Mac: Command + L Linux: Ctrl + L

  10. MySQL(二) decimal数据默认处理

    create table decimal_test(id int auto_increment PRIMARY key,score decimal(5,2) -- 取值范围是 -999.99 到 99 ...