我正在尝试在 kubernetes 集群中设置两个服务的路由,我想使用特定的权重发布 2 个不同服务的金丝雀版本。 例如:如果到达/endpoint1,那么它将 50% 的流量路由到 service1,对于另外 50%,我想重写,然后路由到 service2。 如果我尝试此虚拟服务
http:
- match:
uri:
exact: /path1
rewrite:
uri: /path1modified
route:
- destination:
host: service1host
weigh: 50
- destination:
host: service2host
weigh: 50
它将重写然后使用 path1 修改路由。 所以我需要这样的东西
http:
- match:
uri:
exact: /path1
route:
- destination:
host: service1host
weigh: 50
- destination:
host: service2host
weigh: 50
rewrite:
uri: /path1modified
如果可能的话,我很好奇。 多谢。
更新谢谢大家给出的答案,最终我找到了一种方法 基本上我有一个webapp(使用path1(和一个服务(在后端使用modifiedPath1,但它在浏览器中需要path1,使用重写(,我想加权这两者之间的流量。我尝试使用虚拟服务,但我无法找到包含两条路径的方法。我的解决方案是添加一个流量管理器,该管理器将加权流量发送到 Webapp 和我的服务,然后对于 Web 应用,将终结点保留原样,对于服务,如果与 uri 精确匹配/path1,则重写为 modifiedPath1。
我想说,有几件事你没有做。首先要做金丝雀,你不是为两个不同的服务做,而是对同一服务的两个子集做。最后,有两种不同的部署,但您只需要定义一个服务,然后通过DestinationRule
定义子集。
换句话说,您有两个部署,对吗?这两个部署将有一个通用标签和一个不同的标签。通过公共标签,您将定义DESTINATION_HOST_THAT_HAS_SUBSETS
,并通过不同的标签定义子集service1host
和service2host
。
然后,您的VirtualService
将如下所示:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: server-vs
spec:
hosts:
- DESTINATION_HOST_THAT_HAS_SUBSETS
http:
- match:
- uri:
prefix: /path1
rewrite:
uri: /path1modified
route:
- destination:
host: DESTINATION_HOST_THAT_HAS_SUBSETS
subset: service1host
weight: 50
route:
- destination:
host: DESTINATION_HOST_THAT_HAS_SUBSETS
subset: service2host
weight: 50
更新
在jt97的评论之后,关于可以有两个单独的服务是正确的,这个VirtualService
也应该有效。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: server-vs
spec:
hosts:
- DESTANTION_HOST
http:
- match:
- uri:
prefix: /path1
rewrite:
uri: /path1modified
route:
- destination:
host: service1host
weight: 50
route:
- destination:
host: service2host
weight: 50
据我所知,这是不可能的。
如果你看一下关于在虚拟服务中重写的 istio 文档,重写是 http 的一部分,所以它不能在目标中使用。
可能对基于权重的路由有帮助的链接:
- https://istio.io/docs/reference/config/networking/virtual-service
- https://istio.io/docs/tasks/traffic-management/traffic-shifting/