配置请求的路由规则

    在上一节安装istio中我们创建的示例,熟悉了Istio的基本功能,现在我们再来看一下istio的高级特性——配置请求的路由规则。

    使用istio我们可以根据权重HTTP headers来动态配置请求路由。

    因为BookInfo示例部署了3个版本的评论微服务,我们需要设置一个默认路由。 否则,当你多次访问应用程序时,会注意到有时输出包含星级,有时候又没有。 这是因为没有明确的默认版本集,Istio将以随机方式将请求路由到服务的所有可用版本。

    注意:假定您尚未设置任何路由。如果您已经为示例创建了冲突的路由规则,则需要在以下命令中使用replace而不是create。

    下面这个例子能够根据网站的不同登陆用户,将流量划分到服务的不同版本和实例。跟kubernetes中的应用一样,所有的路由规则都是通过声明式的yaml配置。关于和reviews:v2的唯一区别是,v1没有调用评分服务,productpage页面上不会显示评分星标。

    1. 将微服务的默认版本设置成v1。

      使用以下命令查看定义的路由规则。

      1. istioctl get route-rules -o yaml
      1. type: route-rule
      2. name: details-default
      3. namespace: default
      4. spec:
      5. destination: details.default.svc.cluster.local
      6. precedence: 1
      7. route:
      8. - tags:
      9. version: v1
      10. ---
      11. type: route-rule
      12. name: productpage-default
      13. namespace: default
      14. spec:
      15. destination: productpage.default.svc.cluster.local
      16. precedence: 1
      17. - tags:
      18. version: v1
      19. ---
      20. type: route-rule
      21. namespace: default
      22. spec:
      23. destination: reviews.default.svc.cluster.local
      24. precedence: 1
      25. route:
      26. - tags:
      27. version: v1
      28. ---
      29. type: route-rule
      30. name: ratings-default
      31. namespace: default
      32. spec:
      33. destination: ratings.default.svc.cluster.local
      34. precedence: 1
      35. route:
      36. version: v1
      37. ---
    2. 在浏览器中打开BookInfo URL(http://$GATEWAY_URL/productpage ,我们在上一节中使用的是 http://ingress.istio.io/productpage)您应该会看到BookInfo应用程序的产品页面显示。 注意,产品页面上没有评分星,因为reviews:v1不访问评级服务。

    3. 将特定用户路由到reviews:v2

      为测试用户jason启用评分服务,将productpage的流量路由到reviews:v2实例上。

      确认规则生效:

      1. destination: reviews.default.svc.cluster.local
      2. match:
      3. httpHeaders:
      4. cookie:
      5. regex: ^(.*?;)?(user=jason)(;.*)?$
      6. precedence: 2
      7. route:
      8. - tags:
      9. version: v2
    4. 使用jason用户登陆productpage页面。

      你可以看到每个刷新页面时,页面上都有一个1到5颗星的评级。如果你使用其他用户登陆的话,将因继续使用reviews:v1而看不到星标评分。

    内部实现

    在这个例子中,一开始使用istio将100%的流量发送到BookInfo服务的reviews:v1的实例上。然后又根据请求的header(例如用户的cookie)将流量选择性的发送到reviews:v2实例上。

    如果你看了这一节,你会发现v2版本中有个bug,而在v3版本中修复了,你想将流量迁移到reviews:v1迁移到reviews:v3版本上,只需要运行如下命令:

    1. 将50%的流量从reviews:v1转移到reviews:v3上。

      注意这次使用的是replace命令,而不是create,因为该rule已经在前面创建过了。

    2. 登出jason用户,或者删除测试规则,可以看到新的规则已经生效。

      删除测试规则。

      1. istioctl delete route-rule reviews-test-v2
      2. istioctl delete route-rule ratings-test-delay

      现在的规则就是刷新productpage页面,50%的概率看到红色星标的评论,50%的概率看不到星标。

      注意:因为使用Envoy sidecar的实现,你需要刷新页面很多次才能看到接近规则配置的概率分布,你可以将v3的概率修改为90%,这样刷新页面时,看到红色星标的概率更高。

      1. 现在不论你使用什么用户登陆页面,你都可以看到带红色星标评分的评论了。