如何在虚拟服务的目标位置添加重写uri

时间:2020-05-20 15:26:53

标签: kubernetes routes istio canary-deployment

我正在尝试在kubernetes集群中设置两个服务的路由,并且我想对具有特定权重的2个不同服务进行canary发布。 例如:如果到达/ 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)和一个服务(在后端使用ModifyPath1,但是在浏览器中需要path1,使用重写),我想权衡这2个之间的流量。我尝试使用虚拟服务,但我无法设法找到同时包含这两个路径的方法。我的解决方案是添加一个流量管理器,该流量管理器将加权的流量发送到webapp和我的服务,然后使webapp保持端点不变,对于服务,如果匹配uri确切/ path1,然后将其重写为ModifyedPath1。

2 个答案:

答案 0 :(得分:1)

我想说,您有几件事没有做。首先要做金丝雀,您不需要为两个不同的服务执行此操作,但是要为同一服务的两个子集执行此操作。最后,有两种不同的部署,但是您只需要定义一个服务,然后通过DestinationRule定义子集。

换句话说,您有两个部署对吗?这两个部署将有一个共同的标签,并且有一个不同的标签。通过公共标签,您将定义DESTINATION_HOST_THAT_HAS_SUBSETS,通过不同标签,您将定义子集service1hostservice2host

然后,您的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

答案 1 :(得分:0)

据我所知这是不可能的。

如果您查看虚拟服务中有关rewrite的istio文档,则重写是http的一部分,因此不能在目标位置使用。

可能对基于权重的路由很有帮助的链接: