【问题标题】:Istio Virtual Service - can I route traffic based on the calling serviceIstio 虚拟服务 - 我可以根据调用服务路由流量吗
【发布时间】:2020-02-24 16:42:17
【问题描述】:

假设我有三个服务,ServiceA、ServiceB 和 ServiceC。 ServiceA 和 ServiceB 都调用 ServiceC。我想部署一个新版本的 ServiceC,但只想从 ServiceB 发送流量进行测试。是否有考虑到“调用服务”的路由配置?

【问题讨论】:

    标签: istio


    【解决方案1】:

    基于istio documentation

    您可以使用virtual service,或虚拟服务和destination rule


    带标签,例如here

    带有应用和版本标签的部署:我们建议在部署中添加明确的应用标签和版本标签。将标签添加到使用 Kubernetes 部署部署的 pod 的部署规范中。应用和版本标签将上下文信息添加到 Istio 收集的指标和遥测数据中。

    应用标签:每个部署规范都应该有一个不同的应用标签,并具有有意义的值。应用标签用于在分布式跟踪中添加上下文信息。

    版本标签:此标签表示特定部署对应的应用程序版本。


    每个路由规则都与一个或多个服务版本相关联(参见文档开头的词汇表)。与版本相关的权重决定了它接收的流量比例。例如,以下规则会将“reviews”服务的 25% 流量路由到带有“v2”标签的实例,并将剩余流量(即 75%)路由到“v1”。

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: reviews-route
    spec:
      hosts:
      - reviews.prod.svc.cluster.local
      http:
      - route:
        - destination:
            host: reviews.prod.svc.cluster.local
            subset: v2
          weight: 25
        - destination:
            host: reviews.prod.svc.cluster.local
            subset: v1
          weight: 75
    

    以及相关的 DestinationRule

    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      name: reviews-destination
    spec:
      host: reviews.prod.svc.cluster.local
      subsets:
      - name: v1
        labels:
          version: v1
      - name: v2
        labels:
          version: v2
    


    还可以将流量拆分到两个完全不同的服务中,而无需定义新的子集。例如,以下规则将 25% 的流量转发到 reviews.com,将 75% 的流量转发到 dev.reviews.com

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: reviews-route-two-domains
    spec:
      hosts:
      - reviews.com
      http:
      - route:
        - destination:
            host: dev.reviews.com
          weight: 25
        - destination:
            host: reviews.com
          weight: 75
    

    编辑

    所以实际上你必须为你的 serviceC 1.0 和 2.0 添加标签,虚拟服务看起来像这样。

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: reviews-route-two-domains
    spec:
      hosts:
      - reviews.com
      http:
      - match:
        - sourceLabels:
            svc: A
        - route:
          - destination:
              host: serviceC
              label: v1
      - match:
        - sourceLabels:
            svc: B
        - route:
          - destination:
              host: serviceC
              label: v2
    

    查看我使用 sourceLabels here 的另一个答案


    如果您还有其他问题,请告诉我。

    【讨论】:

    • 谢谢,这是对 VirtualServices 和 DestinationRules 的很​​好描述。我不认为它回答了我的问题。让我们将现有版本的 ServiceC 称为 ServiceC-1.0,而新版本的 ServiceC 是 ServiceC-2.0。我希望 ServiceA 流量继续路由到 ServiceC-1.0,而 ServiceB 流量继续路由到 ServiceC-2.0。为了清楚起见,我将用图表更新我的问题。
    • @frankd 当然,请添加图表,但如果我没听错,您需要创建 2 个虚拟服务,首先 serviceC-1.0 将 100% 的流量发送到 serviceA,0% 的流量发送到 serviceB,然后第二个 serviceC-2.0 会向 serviceB 发送 100% 的流量,向 serviceA 发送 0% 的流量吗?你能告诉我你当前向这两个服务发送流量的虚拟服务吗?
    • 不,A 和 B 调用 C,而不是相反。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2019-07-19
    • 2021-09-21
    相关资源
    最近更新 更多