Istio虚拟服务-我可以根据呼叫服务路由流量

时间:2020-02-14 13:37:40

标签: istio

说我有三个服务,即ServiceA,ServiceB和ServiceC。 ServiceA和ServiceB都调用ServiceC。我想部署新版本的ServiceC,但只想从ServiceB发送流量进行测试。是否有将“呼叫服务”考虑在内的路由配置?

Service Graph

1 个答案:

答案 0 :(得分:1)

基于istio documentation

您可以使用virtual service或虚拟服务和destination rule来做到这一点。


带有标签,例如here

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

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

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


每个路由规则都与一个或多个服务版本关联(请参阅文档开头的词汇表)。与版本关联的权重决定了它接收的流量比例。例如,以下规则会将“评论”服务的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

OR


流量也可以分为两个完全不同的服务,而不必定义新的子集。例如,以下规则将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

的地方检查我的另一个答案

让我知道您是否还有其他问题。