我有一个应用程序,其中包含从主要应用程序服务调用的多个服务。我了解进行金丝雀和 A/B 部署的基础知识,但是我看到的所有示例都显示了循环法,每个请求在版本之间切换。
我更喜欢的是,一旦给定的用户/会话与某个版本相关联,它就会保持这种状态,以避免给用户带来混乱的体验。
如何使用 Kubernetes 或 Istio/Envoy 实现这一点?
我有一个应用程序,其中包含从主要应用程序服务调用的多个服务。我了解进行金丝雀和 A/B 部署的基础知识,但是我看到的所有示例都显示了循环法,每个请求在版本之间切换。
我更喜欢的是,一旦给定的用户/会话与某个版本相关联,它就会保持这种状态,以避免给用户带来混乱的体验。
如何使用 Kubernetes 或 Istio/Envoy 实现这一点?
您可以使用 Istio 使用Request Routing - 基于用户身份的路由来执行此操作,但我不知道该功能有多成熟。也可以根据 cookie 或标头值进行路由。
我们一直在努力解决这个问题,因为我们希望将测试微服务部署到生产环境中,并且只有在第一个请求包含“暗发布”标头时才公开它们。
正如 Jonas 所提到的,cookie 和标头值理论上可以用于实现您正在寻找的内容。如果您的金丝雀服务在边缘,并且您的用户正在直接访问,这很容易实现。
问题是,您提到您有多种服务。如果您有一条链,用户访问边缘服务 A 然后调用服务 B、服务 C 等,则标头或 cookie 不会从一个服务传播到另一个服务。
这与我们在尝试进行分布式跟踪时遇到的问题相同。Istio 文档目前有这个常见问题解答:
https://istio.io/faq/distributed-tracing/#istio-copy-headers
总而言之,您将不得不手动进行标头传播。幸运的是,我的大多数微服务都是基于 Spring Boot 构建的,我可以通过一个简单的 5 行类来拦截所有传出调用来实现标头传播。但它仍然是侵入性的,必须在任何地方进行。服务网格的对立面。
可能有一个聪明的方法可以解决这个问题,但是很难从文档中推断出什么是可能的,什么是不可能的。我已经看到 Istio 开发人员提出了一些 github 问题来解决这个问题,但是我看到的每个问题在最初的热情之后都变得陈旧了。