使用 Istio 进行金丝雀或 A/B 部署时控制用户体验

Controlling the user experience when doing canary or A/B deployments with Istio

我有一个应用程序,其中包含从主要应用程序服务调用的多个服务。我了解金丝雀部署和 A/B 部署的基础知识,但是我看到的所有示例都显示了循环法,其中每个请求在版本之间切换。

我更喜欢的是,一旦给定的 user/session 与某个版本相关联,它就会保持这种状态,以避免给用户带来混乱的体验。

如何使用 Kubernetes 或 Istio/Envoy 实现这一点?

您可以使用 Request Routing - Route based on user identity 通过 Istio 执行此操作,但我不知道该功能有多成熟。也可以根据 cookie 或 header 值进行路由。

我们一直在努力解决这个问题,因为我们想将测试微服务部署到生产环境中,并且仅当第一个请求包含 "dark release" header.

时才公开它们

正如 Jonas 所提到的,cookie 和 header 值在理论上可用于实现您正在寻找的内容。如果您进行金丝雀发布的服务位于边缘,并且您的用户正在直接访问,则很容易实现。

问题是,你提到你有多项服务。如果你有一条链,用户访问边缘服务 A,然后调用服务 B、服务 C 等,headers 或 cookie 将不会从一个服务传播到另一个服务。

这与我们在尝试进行分布式跟踪时遇到的问题相同。 Istio 文档目前有这个 FAQ:

https://istio.io/faq/distributed-tracing/#istio-copy-headers

总而言之,您必须手动进行 header 传播。幸运的是,我的大部分微服务都是基于 Spring Boot 构建的,我可以通过一个简单的 5 行 class 拦截所有传出调用来实现 header 传播。但它仍然是侵入性的,必须在任何地方进行。服务网格的对立面。

可能有一个聪明的方法来解决这个问题,但很难从文档中推断出什么是可能的,什么不是。我已经看到 Istio 开发人员提出的一些 github 问题来解决这个问题,但我看到的每个问题在最初的热情之后都变得陈旧了。