怎么使用Istio进行A/B测试

69次阅读
没有评论

共计 2930 个字符,预计需要花费 8 分钟才能阅读完成。

本篇内容介绍了“怎么使用 Istio 进行 A / B 测试”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

问题 1:我不相信我的测试

如果测试范围并没有完全涵盖你所更改的应用程序,那么你可能会很快采取行动进行新一轮测试,但也有可能应用程序无法正常运行了。

在理想状况下,我们都想要确保每个代码经过全面的测试,否则就不会将功能添加到应用程序中。但是现实总归是骨感的,我们常常被 ddl 追赶,可能还未编写或者更新测试,功能就得上传到项目中了。

解决方案:放慢速度

那么,如何确保我绝大多数用户不受代码中潜伏的任何错误的影响,又如何进行更改和部署新功能呢?答案是通过先将新版本部署到最少数量的用户来最大程度地减少这些小问题的辐射范围。

如果更改能够按照预期工作的话,你可以缓慢增加使用新版本的用户百分比。如果各项指标出现问题,你可以轻松回滚你的更改,然后重试。

在没有 Istio 的情况下可以在 Kubernetes 上运行金丝雀部署吗?当然没问题,但是如果要自动化这一过程,你需要完全将自己的精力放在 web 服务器代码和自定义自动化脚本方面。这样的操作方式性价比并不高。

Istio 有一些十分优雅的流量分配解决方案,我们可以使用它们在恰当的时间为合适的版本提供适当的客户端服务,并且我们只需调整其中的 1 个或 2 个参数。

为了实现这一点,你需要设置一个网关入口(Ingress gateway)、一个虚拟服务(virtual service)和一个 destination rule。这将位于一般的部署和服务之上,并为你分配流量。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
 name: http-gateway
spec:
 selector:
 istio: ingressgateway
 servers:
 - port:
 number: 80
 name: http
 protocol: HTTP
 hos
 -  * 
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
 name: my-app
spec:
 hosts:
 -  * 
 gateways:
 - http-gateway
 http:
 - match:
 - uri:
 prefix:  /my-app 
 rewrite:
 uri:  / 
 route:
 - destination:
 host: my-app
 subset: v1
 port:
 number: 80
 weight: 90
 - destination:
 host: my-app
 subset: v2
 port:
 number: 80
 weight: 10
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
 name: my-app
spec:
 host: my-app
 subsets:
 - name: v1
 labels:
 version: v1.0.0
 - name: v2
 labels:
 version: v2.0.0

从虚拟服务的权重字段中可以看到,Istio 将根据指定的值在应用程序的两个版本之间分配流量。这些值的总和必须为 100%,否则,API 将拒绝应用该定义。

然后,你(或者理想情况下,在“持续集成 / 连续交付”流水线中手动执行一个或多个步骤)将调整权重,以将新版本推广给更多用户,直到所有请求由新版本满足为止,并且以前的版本可以停止维护。

通过使用 Istio 的故障注入功能来模拟网络中断和实际流量性能下降,还可以将 Istio 集成到您的集成测试策略中。

如果在生产中进行测试的想法给你留下了心理阴影,那一定是你的做法有所欠缺。例如,尝试在你的虚拟服务规范中添加以下代码片段以添加一些混乱,然后再找一篇文章来看看怎么用 Istio 解决这样的混乱。

spec:
 hosts:
 - my-app
 http:
 - fault:
 delay:
 fixedDelay: 7s
 percent: 100
 route:
 - destination:
 host: ratings
 subset: v2

问题 2:市场策略无法确定发布版本

通常,业务需要针对实际用户测试应用程序的多个版本。但是有时实在无法搞清楚是哪种营销策略可以带来最佳转化率,或者哪种设计选择可以带来最佳的客户留存率。

使用 Kubernetes,你可以将流量分为两个版本,但是要想从练习中获得任何有价值的见解,则再次需要一大堆自定义代码来获取相关信息,并以非技术同事可以理解的方式对其进行处理。

解决方案:使用 Istio 进行 A / B 测试

Istio 的流量分配规则可以再次解决这一问题,它与 Prometheus 和 Grafana 的紧密集成可以帮助你获取直观的 A / B 测试的结果。一般而言,根据传入数据包内容的某些部分,几乎有无数种方法来决定哪些用户可以获取你的应用程序的版本。

在这一示例中,我们将使用 User-Agent 字段为不同的浏览器提供不同的版本。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
 name: my-app
spec:
 hosts:
 -  * 
 gateways:
 - http-gateway
 http:
 - match:
 - headers:
 user-agent:
 regex:  .*Chrome.* 
 uri:
 prefix:  /my-app 
 rewrite:
 uri:  / 
 route:
 - destination:
 host: my-app
 subset: v1
 port:
 number: 80
 - match:
 - headers:
 user-agent:
 regex:  .*Mozilla.* 
 uri:
 prefix:  /my-app 
 rewrite:
 uri:  / 
 route:
 - destination:
 host: my-app
 subset: v2
 port:
 number: 80

从上面的代码中可以看到,使用 Firefox 的用户将获得应用程序的版本 1,而 Chrome 用户将获得版本 2。如果浏览器的“User-Agent”字段不包含“mozilla”或“chrome”,则他们都将不会获得任一版本。

要为其他客户提供服务,您需要添加一条默认路由,我将作为练习留给你。(嘿嘿)

如果你不想安装其他浏览器,只是想尝试一下,则可以使用带有头部标志的 curl 伪装成所需的任何浏览器,例如:

curl /my-app -H  User-Agent: Chrome

通过更改 user-agent 的值,你可以从命令行测试所有不同的路由。

“怎么使用 Istio 进行 A / B 测试”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计2930字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)