配置请求路由

此任务将展示如何将请求动态路由到微服务的多个版本。

开始之前

  • 按照安装指南中的说明安装 Istio。

  • 部署 Bookinfo 示例应用程序。

  • 查看流量管理的概念文档。在尝试此任务之前,您应该熟悉一些重要的术语,例如 destination rulevirtual servicesubset

关于这个任务

Istio Bookinfo 示例包含四个独立的微服务,每个微服务都有多个版本。其中一个微服务 reviews 的三个不同版本已经部署并同时运行。为了说明这导致的问题,在浏览器中访问 Bookinfo 应用程序的 /productpage 并刷新几次。您会注意到,有时书评的输出包含星级评分,有时则不包含。这是因为没有明确的默认服务版本路由,Istio 将以循环方式请求路由到所有可用版本。

此任务的最初目标是应用将所有流量路由到微服务的 v1 (版本 1)的规则。稍后,您将应用规则根据 HTTP 请求 header 的值路由流量。

应用 virtual service

要仅路由到一个版本,请应用为微服务设置默认版本的 virtual service。在这种情况下,virtual service 将所有流量路由到每个微服务的 v1 版本。

如果您还没有应用 destination rule,请先应用默认目标规则

  • 运行以下命令以应用 virtual services:

Zip

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

由于配置传播是最终一致的,因此请等待几秒钟以使 virtual services 生效。

  • 使用以下命令显示已定义的路由:
  1. $ kubectl get virtualservices -o yaml
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: VirtualService
  4. metadata:
  5. name: details
  6. ...
  7. spec:
  8. hosts:
  9. - details
  10. http:
  11. - route:
  12. - destination:
  13. host: details
  14. subset: v1
  15. ---
  16. apiVersion: networking.istio.io/v1alpha3
  17. kind: VirtualService
  18. metadata:
  19. name: productpage
  20. ...
  21. spec:
  22. gateways:
  23. - bookinfo-gateway
  24. - mesh
  25. hosts:
  26. - productpage
  27. http:
  28. - route:
  29. - destination:
  30. host: productpage
  31. subset: v1
  32. ---
  33. apiVersion: networking.istio.io/v1alpha3
  34. kind: VirtualService
  35. metadata:
  36. name: ratings
  37. ...
  38. spec:
  39. hosts:
  40. - ratings
  41. http:
  42. - route:
  43. - destination:
  44. host: ratings
  45. subset: v1
  46. ---
  47. apiVersion: networking.istio.io/v1alpha3
  48. kind: VirtualService
  49. metadata:
  50. name: reviews
  51. ...
  52. spec:
  53. hosts:
  54. - reviews
  55. http:
  56. - route:
  57. - destination:
  58. host: reviews
  59. subset: v1
  60. ---
  • 您还可以使用以下命令显示相应的 subset 定义:
  1. $ kubectl get destinationrules -o yaml

您已将 Istio 配置为路由到 Bookinfo 微服务的 v1 版本,最重要的是 reviews 服务的版本 1。

测试新的路由配置

您可以通过再次刷新 Bookinfo 应用程序的 /productpage 轻松测试新配置。

请注意,无论您刷新多少次,页面的评论部分都不会显示评级星标。这是因为您将 Istio 配置为将评论服务的所有流量路由到版本 reviews:v1,而此版本的服务不访问星级评分服务。

您已成功完成此任务的第一部分:将流量路由到服务的某一个版本。

基于用户身份的路由

接下来,您将更改路由配置,以便将来自特定用户的所有流量路由到特定服务版本。在这,来自名为 Jason 的用户的所有流量将被路由到服务 reviews:v2

请注意,Istio 对用户身份没有任何特殊的内置机制。事实上, productpage 服务在所有到 reviews 服务的 HTTP 请求中都增加了一个自定义的 end-user 请求头,从而达到了本例子的效果。

请记住,reviews:v2 是包含星级评分功能的版本。

  • 运行以下命令以启用基于用户的路由:

Zip

  1. $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@
  • 确认规则已创建:
  1. $ kubectl get virtualservice reviews -o yaml
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: VirtualService
  4. metadata:
  5. name: reviews
  6. ...
  7. spec:
  8. hosts:
  9. - reviews
  10. http:
  11. - match:
  12. - headers:
  13. end-user:
  14. exact: jason
  15. route:
  16. - destination:
  17. host: reviews
  18. subset: v2
  19. - route:
  20. - destination:
  21. host: reviews
  22. subset: v1
  • 在 Bookinfo 应用程序的 /productpage 上,以用户 jason 身份登录。

刷新浏览器。你看到了什么?星级评分显示在每个评论旁边。

  • 以其他用户身份登录(选择您想要的任何名称)。

刷新浏览器。现在星星消失了。这是因为除了 Jason 之外,所有用户的流量都被路由到 reviews:v1

您已成功配置 Istio 以根据用户身份路由流量。

理解原理

在此任务中,您首先使用 Istio 将 100% 的请求流量都路由到了 Bookinfo 服务的 v1 版本。然后设置了一条路由规则,它根据 productpage 服务发起的请求中的 end-user 自定义请求头内容,选择性地将特定的流量路由到了 reviews 服务的 v2 版本。

请注意,Kubernetes 中的服务,如本任务中使用的 Bookinfo 服务,必须遵守某些特定限制,才能利用到 Istio 的 L7 路由特性优势。参考 Pods 和 Services 需求了解详情。

流量转移任务中,您将按照在此处学习到的相同的基本模式来配置路由规则,以逐步将流量从服务的一个版本迁移到另一个版本。

清除

  • 删除应用程序的 virtual service:

Zip

  1. $ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
  • 如果您不打算探索任何后续任务,请参阅 Bookinfo 清理的说明关闭应用程序。

相关内容

使用 Admiral 管理 Istio 多集群的配置和服务发现

为 Istio deployment(cluster)提供自动化 Istio 配置,并让其像单个网格一样工作。

把 Istio 作为外部服务的代理

把 Istio 入口网关配置为外部服务的代理。

用于隔离和边界保护的多网格部署

将需要隔离的环境部署到单独的网格中,并通过网格联邦启用网格间通信。

Istio 中安全管控出口流量,第三部分

管控出口流量的备选方案比较,包括性能因素。

Istio 中的安全管控出口流量,第二部分

使用 Istio 的出口流量管控来阻止相关出口流量攻击。

Istio 中的安全管控出口流量,第一部分

涉及出口流量攻击和出口流量管控要求。