此示例向您展示如何将请求动态路由到微服务的多个版本。
开始之前
- 按照安装指南中的说明设置Istio。
- 部署Bookinfo示例应用程序。
- 理解流量管理概念文档。在尝试这个任务之前,你应该熟悉
destination rule(目标规则)
、virtual service(虚拟服务)
和subset(子集)
等重要术语。
关于此示例
Istio Bookinfo示例包含四个单独的微服务,每个微服务具有多个版本。微服务之一的三个不同版本reviews(评论)
已部署并同时运行。 为了说明此问题的原因,请在浏览器中访问Bookinfo应用的/productpage
,然后刷新几次。您会发现页面输出有时包含星级,有时则不包含。这是因为如果没有明确的默认服务版本可路由,Istio将以循环方式将请求路由到所有可用版本。
该例子的初始目标是应用规则,将所有流量路由到微服务的v1(版本1)
。稍后,将基于HTTP请求标头的值规则来路由流量。
应用虚拟服务(virtual service)
接下来,虚拟服务会将所有流量路由到微服务v1
上。
如果你还没有应用 destination rule,请先应用 默认目标规则。
执行以下命令以应用虚拟服务:
$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
请等待几秒钟以使虚拟服务生效。
使用以下命令显示定义的路由规则:
$ kubectl get virtualservices -o yaml apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: details ... spec: hosts: - details http: - route: - destination: host: details subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: productpage ... spec: gateways: - bookinfo-gateway - mesh hosts: - productpage http: - route: - destination: host: productpage subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings ... spec: hosts: - ratings http: - route: - destination: host: ratings subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews ... spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 ---
可以使用以下命令显示相应的子集(subset)定义:
$ kubectl get destinationrules -o yaml
现在,已将Istio配置为路由到Bookinfo
微服务的v1
版本了。
验证新的路由配置
你可以再次刷新/productpage
来测试新配置是否生效。
注意,无论刷新多少次,页面的评论部分均不会显示星评。所有流量路由到版本
reviews:v1
,该版本没有星级评分功能。
现在,您已成功完成此任务的第一部分:将流量路由到其中一个版本了。
根据用户身份进行路由(Route based on user identity)
接下来,更改路由配置,将来自特定用户的所有流量路由到特定服务版本上。本例中,将来自名为Jason的用户的所有流量都将被路由到reviews:v2
。
请注意,Istio对用户身份没有任何特殊的、内置的理解。这个例子是通过productpage服务为所有向评论服务发出的HTTP请求添加一个自定义的终端用户头来实现的。
请记住,
reviews:v2
是星级评定功能的版本。
运行以下命令以启用基于用户的路由规则:
$ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
确认规则已创建:
$ kubectl get virtualservice reviews -o yaml apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews ... spec: hosts: - reviews http: - match: - headers: end-user: exact: jason route: - destination: host: reviews subset: v2 - route: - destination: host: reviews subset: v1
在
/productpage
上,以用户jason
的身份登录。
刷新浏览器。你看到了什么?每条评论旁边都会出现星级评价。以另一个用户的身份登录(选择任何你想要的名字)。
刷新浏览器。现在星星不见了。这是因为除了Jason
之外,所有用户的流量都被路由到review:v1
。
这样,就已经成功地配置了Istio,使其能够根据用户身份
进行流量路由。
了解发生了什么
在此示例中,您使用 Istio 将 100% 的流量发送到每个 Bookinfo 服务的 v1 版本。然后,您设置了一个规则,以根据 productpage 服务添加到请求中的自定义终端用户头,有选择地将流量发送到带有评论功能的 v2 版本。
请注意,Kubernetes服务,如本任务中使用的Bookinfo服务,必须遵守某些限制,以利用Istio的L7路由功能。详情请参考《Pods和服务的要求》。
在流量转移示例中,您将遵循您在这里学到的相同的基本模式来配置路由规则,实现逐步的将流量从服务的一个版本发送到另一个版本。
清理
删除应用虚拟服务。
kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml
如果你不打算体验后面的功能,请参考Bookinfo清理删除应用程序。