流量转移

本任务将演示如何将应用流量逐渐从旧版本的服务迁移到新版本。通过Istio,可以使用一系列不同权重的规则(10%,20%,··· 100%)将流量平缓地从旧版本服务迁移到新版本服务。为简单起见,本任务将采用两步将流量从reviews:v1 迁移到 reviews:v3,权重分别为50%,100%。

开始之前

请注意:本文档假设示采用kubernetes部署示例应用程序。所有的示例命令都采用规则yaml文件(例如samples/bookinfo/kube/route-rule-all-v1.yaml)指定的kubernetes版本。如果在不同的环境下运行本任务,请将kube修改为运行环境中相应的目录(例如,对基于Consul的运行环境,目录就是samples/bookinfo/consul/route-rule-all-v1.yaml)。

基于权重的版本路由

  1. 将所有微服务的缺省版本设置为v1.

    1. istioctl create -f samples/bookinfo/kube/route-rule-all-v1.yaml
  2. 在浏览器中打开http://$GATEWAY_URL/productpage, 确认reviews 服务目前的活动版本是v1。

    可以看到BooInfo应用的productpage页面被显示出来。注意productpage显示的评价内容不带星级,因为reviews:v1不会访问ratings服务。

    注意:如果之前执行过 配置请求路由任务,则需要先注销测试用户“jason”或者删除之前单独为该用户创建的测试规则:

    1. istioctl delete routerule reviews-test-v2
  3. 首先,使用下面的命令把50%的流量从reviews:v1转移到reviews:v3:

    1. istioctl replace -f samples/bookinfo/kube/route-rule-reviews-50-v3.yaml

    注意这里使用了istioctl replace而不是create

    确认规则被替换:

    1. istioctl get routerule reviews-default -o yaml
    1. apiVersion: config.istio.io/v1alpha2
    2. kind: RouteRule
    3. metadata:
    4. name: reviews-default
    5. namespace: default
    6. spec:
    7. destination:
    8. name: reviews
    9. precedence: 1
    10. route:
    11. - labels:
    12. version: v1
    13. weight: 50
    14. - labels:
    15. version: v3
    16. weight: 50
  4. 在浏览器中多次刷新productpage页面,大约有50%的几率会看到页面中出现带红星的评价内容。

    请注意:在目前的Envoy sidecar实现中,可能需要刷新productpage很多次才能看到流量分发的效果。在看到页面出现变化前,有可能需要刷新15次或者更多。如果修改规则,将90%的流量路由到v3,可以看到更明显的效果。

  5. 当v3版本的reviews服务已经稳定运行后,可以将100%的流量路由到reviews:v3

    1. istioctl replace -f samples/bookinfo/kube/route-rule-reviews-v3.yaml

    此时,以任何用户登录到productpage页面,都可以看到带红星的评价信息。

理解原理

在这个任务中,我们使用了Istio的带权重路由的特性将流量从老版本的reviews服务逐渐迁移到了新版本服务中。

注意该方式和使用容器编排平台的部署特性来进行版本迁移是完全不同的。容器编排平台使用了实例scaling来对流量进行管理。而通过Istio,两个版本的reviews服务可以独立地进行scale up和scale down,并不会影响这两个版本服务之间的流量分发。

想了解更多支持scaling的按版本路由功能,请查看Canary Deployments using Istio

清理

  • 删除路由规则。

    1. istioctl delete -f samples/bookinfo/kube/route-rule-all-v1.yaml
  • 如果不打算尝试后面的任务,请参照BookInfo cleanup 中的步骤关闭应用程序。

进阶阅读