到 Istio 之外的服务版本的加权流量
Weighted traffic to a a version of a service which is outside the Istio
我正在尝试找到一个合适的部署流程,以便从我们当前的 Eureka-based、码头化的 micro-service 环境切换到 Istio-based、Kubernetes-based、micro-service环境。理想情况下,我希望能够在旧环境中的服务 foo 实例和新环境中相同服务 foo 的实例之间进行 B/G 和 Canary-like 流量权重管理。
据我所知,一种方法是通过实施 Eureka Pilot 平台适配器将旧环境的服务实例包含到单个网格中,并将两个环境实例加载到单个网格中。但是,这需要将 Envoy 代理添加到旧环境中,我希望我不要那样碰它。
我正在尝试寻找另一种不需要将 Envoy 代理添加到当前环境的方法。我正在阅读有关 ServiceEntry 功能的信息,并且试图了解这是否可以提供解决方案。我想我想要的是能够为具有 2 个子集的服务 foo 配置网络路由 - 版本,“旧”和“新”,其中“新”实例指的是内部 foo 服务的实例在我们当前的环境中,网格和“旧”实例是指网格外部的 foo 服务实例。不需要明确定义“旧”实例;我们维护一个特殊的代理服务,其中包含 Eureka 客户端并注册到当前的注册和发现系统,并且可以通过 DNS 进行引用。可以通过此代理访问所有服务的“旧”实例,只需传递带有上游服务名称的特殊 header。但要求是:能够在实例的“新”版本和“旧”版本之间定义不同的流量权重。
因此,网格中的客户端服务 bar 需要与上游服务 foo 进行通信。根据可配置的流量权重,请求应该被路由到服务 foo 的“旧”实例子集或“新”实例子集。如果请求在内部路由,则应像往常一样遵循 Istio 目的地规则。如果请求路由到“旧”子集,则应添加一个特殊的 header,其值等于服务名称,并且请求应路由到 Eureka-based 代理等待的可配置 DNS,为了在“旧”世界中的 foo 服务实例之间执行自己的负载平衡。
以上可能吗?如果没有,您可以提供替代解决方案吗?
您的方案是合理的,它应该与 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
我正在尝试找到一个合适的部署流程,以便从我们当前的 Eureka-based、码头化的 micro-service 环境切换到 Istio-based、Kubernetes-based、micro-service环境。理想情况下,我希望能够在旧环境中的服务 foo 实例和新环境中相同服务 foo 的实例之间进行 B/G 和 Canary-like 流量权重管理。
据我所知,一种方法是通过实施 Eureka Pilot 平台适配器将旧环境的服务实例包含到单个网格中,并将两个环境实例加载到单个网格中。但是,这需要将 Envoy 代理添加到旧环境中,我希望我不要那样碰它。
我正在尝试寻找另一种不需要将 Envoy 代理添加到当前环境的方法。我正在阅读有关 ServiceEntry 功能的信息,并且试图了解这是否可以提供解决方案。我想我想要的是能够为具有 2 个子集的服务 foo 配置网络路由 - 版本,“旧”和“新”,其中“新”实例指的是内部 foo 服务的实例在我们当前的环境中,网格和“旧”实例是指网格外部的 foo 服务实例。不需要明确定义“旧”实例;我们维护一个特殊的代理服务,其中包含 Eureka 客户端并注册到当前的注册和发现系统,并且可以通过 DNS 进行引用。可以通过此代理访问所有服务的“旧”实例,只需传递带有上游服务名称的特殊 header。但要求是:能够在实例的“新”版本和“旧”版本之间定义不同的流量权重。
因此,网格中的客户端服务 bar 需要与上游服务 foo 进行通信。根据可配置的流量权重,请求应该被路由到服务 foo 的“旧”实例子集或“新”实例子集。如果请求在内部路由,则应像往常一样遵循 Istio 目的地规则。如果请求路由到“旧”子集,则应添加一个特殊的 header,其值等于服务名称,并且请求应路由到 Eureka-based 代理等待的可配置 DNS,为了在“旧”世界中的 foo 服务实例之间执行自己的负载平衡。
以上可能吗?如果没有,您可以提供替代解决方案吗?
您的方案是合理的,它应该与 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