【问题标题】:Weighted traffic to a a version of a service which is outside the Istio到 Istio 之外的服务版本的加权流量
【发布时间】:2020-02-09 04:51:43
【问题描述】:

我正在尝试找到一个合适的部署流程,以便从我们当前的基于 Eureka 的 dockerized 微服务环境切换到基于 Istio 的基于 Kubernetes 的微服务环境。理想情况下,我希望能够在旧环境中服务 foo 的实例和新环境中相同服务 foo 的实例之间进行 B/G 和 Canary 式流量权重管理。

据我了解,一种方法是通过实现 Eureka Pilot 平台适配器将旧环境的服务实例包含到单个网格中,并将两个 env 实例加载到单个网格中。但是,这需要将 Envoy 代理添加到旧环境中,我希望我不要那样碰它。

我正在尝试寻找另一种不需要将 Envoy 代理添加到当前环境的方法。我正在阅读有关 ServiceEntry 功能的信息,并试图了解这是否可以提供解决方案。我想我想要的是能够为具有 2 个子集的服务 foo 配置网络路由 - 版本,“旧”和“新”,其中“新”实例是指内部 foo 服务的实例网格和“旧”实例是指在我们当前环境中网格之外的 foo 服务实例。不需要显式定义“旧”实例;我们维护一个特殊的代理服务,其中包含 Eureka 客户端并注册到当前的注册和发现系统,并且可以通过 DNS 引用。可以通过此代理访问所有服务的“旧”实例,只需传递带有上游服务名称的特殊标头即可。但要求是:能够在实例的“新”版本和“旧”版本之间定义不同的流量权重。

因此,网格中的客户端服务 bar 需要与上游服务 foo 进行通信。根据可配置的流量权重,请求应该被路由到服务 foo 实例的“旧”子集或实例的“新”子集。如果请求在内部路由,则应像往常一样遵循 Istio 目标规则。如果请求被路由到“旧”子集,则应添加一个与服务名称相等的特殊标头,并且应将请求路由到基于 Eureka 的代理等待的可配置 DNS,以便执行其自己的“旧”世界中 foo 服务实例之间的负载平衡。

以上可能吗?如果没有,您能否提供替代解决方案?

【问题讨论】:

  • 你为什么要使用 istio 是你将部分流量发送到它之外?
  • 在我的描述中首先解释了这一点:我正在尝试找到一个合适的部署流程,用于从我们当前的基于 Eureka 的 dockerized 微服务环境切换到基于 Istio 的 Kubernetes-基于微服务的环境。

标签: istio


【解决方案1】:

您的方案是合理的,它应该适用于 Istio。您可以在服务的本地版本和外部版本之间执行负载平衡。

只需在 VirtualService 的目标主机中写入远程服务的主机名即可。比如:

        route:
        - destination:
            host: reviews # the local version
            subset: v2
            port:
              number: 9080
          weight: 50
        - destination:
            host: reviews.example.com # the external version
            subset: v1 # you can still create subsets in a destination rule for the external service
            port:
              number: 443
          weight: 50

【讨论】:

  • 您是否有一个您认为支持此处要求的模型 VirtualService 定义?
  • 我在答案中添加了一个示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 2020-11-05
  • 2019-01-02
  • 1970-01-01
相关资源
最近更新 更多