Istio以外的某个服务版本的流量经过加权

时间:2019-10-11 16:10:36

标签: istio

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

您的方案很合理,应该与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