上节内容学习了istio流量管理API的两个资源对象虚拟服务VirtualServiceDestinationRule目标规则。这里先复习一下:

  • 虚拟服务是客户端请求服务的地址,通过在虚拟服务上配置路由(route),路由的目标(destination)指向k8s中的Service,即虚拟服务用来配置如何将流量路由到目标地址(如k8s的Service)。 虚拟服务的路由规则可以在流量端口、header 字段、URI 等内容上设置匹配条件,将流量路由到适当的目标;同时还可以在流量上执行一些操作,例如添加删除header、重写URL、为调用这一目标地址的请求设置重试策略等。
  • 目标规则可以为目标地址(如k8s的Service)指定命名的服务子集(例如按版本为给定服务的实例分组,然后可以在虚拟服务的路由规则中使用这些服务子集来控制到不同服务实例的流量); 还可以在调用这个目标服务或特定子集时定制Envoy的流量策略(例如负载均衡策略、TLS安全模式或熔断器设置)。

istio-virtualservices-and-destinationrules.png

本节将学习如何使用istio将流量从服务的一个版本迁移到另一个版本。实际中常见的需求场景是将流量从微服务的一个版本逐渐迁移到另一个版本。

配置基于权重的路由

istio.jpg

在istio中可以通过配置虚拟服务的路由规则将一定比例的流量路由到指定的服务。本练习将继续使用前面的bookinfo应用,先将50%的流量发送到reviews:v1另外50%的流量发送到reviews:v3,最后再把100%的流量发送到reviews:v3

首先执行下面的命令进行初始操作,将所有流量路由到各个服务的v1版本:

1kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

此时如果访问bookinfo的/productpage页面,不管刷新多少次,页面的评论部分都不会显示评价星级的内容。 这是因为虚拟服务reviews中的路由配置的是将所有流量都路由到reviews:v1版本,而该版本的服务不访问带评价星级的服务。

使用下面的命令把50%的流量从reviews:v1转移到reviews:v3

1kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml

等待几秒钟,等待新的规则传播到代理中生效。virtual-service-reviews-50-v3.yaml的内容如下:

 1apiVersion: networking.istio.io/v1alpha3
 2kind: VirtualService
 3metadata:
 4  name: reviews
 5spec:
 6  hosts:
 7    - reviews
 8  http:
 9  - route:
10    - destination:
11        host: reviews
12        subset: v1
13      weight: 50
14    - destination:
15        host: reviews
16        subset: v3
17      weight: 50

此时刷新浏览器中的/productpage页面,大约有50%的几率会看到页面中带红色星级的评价内容。这是因为reviews:v3版本的实现是红色星级评价,reviews:v1版本不能。

实际真实的运维场景中,在经过一段时间后,如果认为reviews:v3微服务已经稳定,可以通过配置虚拟服务reviews的路由规则将100%的流量路由reviews:v3

1kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v3.yaml
 1apiVersion: networking.istio.io/v1alpha3
 2kind: VirtualService
 3metadata:
 4  name: reviews
 5spec:
 6  hosts:
 7    - reviews
 8  http:
 9  - route:
10    - destination:
11        host: reviews
12        subset: v3

参考