配置请求路由

此任务将演示如何根据权重和HTTP header配置动态请求路由。

前提条件

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

基于内容的路由

BookInfo示例部署了三个版本的reviews服务,因此需要设置一个缺省路由。否则当多次访问该应用程序时,会发现有时输出会包含带星级的评价内容,有时又没有。出现该现象的原因是当没有为应用显式指定缺省路由时,Istio会将请求随机路由到该服务的所有可用版本上。

请注意:本文档假设还没有设置任何路由规则。如果已经为示例应用程序创建了存在冲突的路由规则,则需要在下面的命令中使用 replace 关键字代替 create

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

    1. istioctl create -f samples/bookinfo/kube/route-rule-all-v1.yaml

    请注意:在kubernetes中部署Istio时,可以在上面及其它所有命令行中用 kubectl 代替 istioctl。但是目前 kubectl 不提供对命令输入参数的验证。

    可以通过下面的命令来显示所有以创建的路由规则。

    1. istioctl get routerules -o yaml
    1. apiVersion: config.istio.io/v1alpha2
    2. kind: RouteRule
    3. metadata:
    4. name: details-default
    5. namespace: default
    6. ...
    7. spec:
    8. destination:
    9. name: details
    10. precedence: 1
    11. route:
    12. - labels:
    13. version: v1
    14. ---
    15. apiVersion: config.istio.io/v1alpha2
    16. kind: RouteRule
    17. metadata:
    18. name: productpage-default
    19. namespace: default
    20. ...
    21. spec:
    22. destination:
    23. name: productpage
    24. precedence: 1
    25. route:
    26. - labels:
    27. version: v1
    28. ---
    29. apiVersion: config.istio.io/v1alpha2
    30. kind: RouteRule
    31. metadata:
    32. name: ratings-default
    33. namespace: default
    34. ...
    35. spec:
    36. destination:
    37. name: ratings
    38. precedence: 1
    39. route:
    40. - labels:
    41. version: v1
    42. ---
    43. apiVersion: config.istio.io/v1alpha2
    44. kind: RouteRule
    45. metadata:
    46. name: reviews-default
    47. namespace: default
    48. ...
    49. spec:
    50. destination:
    51. name: reviews
    52. precedence: 1
    53. route:
    54. - labels:
    55. version: v1
    56. ---

    由于路由规则是通过异步方式分发到代理的,过一段时间后规则才会同步到所有pod上。因此需要等几秒钟后再尝试访问应用。

  2. 在浏览器中打开BookInfo应用程序的 URL(http://$GATEWAY_URL/productpage)。

    可以看到BookInfo应用程序的productpage页面。

    请注意productpage页面显示的内容中不包含带星的评价信息,这是为reviews:v1服务不会访问ratings服务。

  3. 将来自特定用户的请求路由到reviews:v2

    把来自测试用户”jason”的请求路由到reviews:v2,以启用ratings服务。

    1. istioctl create -f samples/bookinfo/kube/route-rule-reviews-test-v2.yaml

    确认规则已创建:

    1. istioctl get routerule reviews-test-v2 -o yaml
    1. apiVersion: config.istio.io/v1alpha2
    2. kind: RouteRule
    3. metadata:
    4. name: reviews-test-v2
    5. namespace: default
    6. ...
    7. spec:
    8. destination:
    9. name: reviews
    10. match:
    11. request:
    12. headers:
    13. cookie:
    14. regex: ^(.*?;)?(user=jason)(;.*)?$
    15. precedence: 2
    16. route:
    17. - labels:
    18. version: v2
  4. 以”jason”用户登录productpage页面。

    此时应该可以在每条评价后面看到星级信息。请注意如果以别的用户登录,还是只能看到reviews:v1版本服务呈现出的内容,即不包含星级信息的内容。

理解原理

在这个任务中,我们首先使用Istio将100%的请求流量都路由到了BookInfo服务的v1版本。 然后再设置了一条路由规则,该路由规则基于请求的header(例如一个用户cookie)选择性地将特定的流量路由到了reviews服务的v2版本。

一旦reviews服务的v2版本经过测试后满足要求,我们就可以使用Istio将来自所有用户的流量一次性或者渐进地路由到v2版本。我们将在另一个单独的任务中对此进行尝试。

清理

  • 删除路由规则

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

下一步