5.3.1 配置请求路由
Istio Bookinfo
示例包含四个独立的微服务,每个微服务都有多个版本。其中一个微服务reviews
的三个不同版本已经部署并同时运行。 为了说明这导致的问题,在浏览器中访问Bookinfo
应用程序的 /productpage
并刷新几次。 您会注意到,有时书评的输出包含星级评分,有时则不包含。这是因为没有明确的默认服务版本路由,Istio将以循环方式请求路由到所有可用版本。
此任务的最初目标是应用将所有流量路由到微服务的v1
(版本 1)的规则。稍后,您将应用规则根据HTTP请求header
的值路由流量。
1.应用virtual service
要仅路由到一个版本,请应用为微服务设置默认版本的 virtual service。在这种情况下,virtual service 将所有流量路由到每个微服务的 v1
版本。
default 和 demo 的配置文件默认情况下启用了自动双向TLS。
cd /usr/local/istio-${ISTIO_VERSION}
kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml
输出如下
destinationrule.networking.istio.io/productpage created
destinationrule.networking.istio.io/reviews created
destinationrule.networking.istio.io/ratings created
destinationrule.networking.istio.io/details created
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
输出如下
virtualservice.networking.istio.io/productpage created
virtualservice.networking.istio.io/reviews created
virtualservice.networking.istio.io/ratings created
virtualservice.networking.istio.io/details created
2.检查已经应用到v1
kubectl get virtualservices -o yaml
kubectl get destinationrules -o yaml
3.测试新的路由配置
打开浏览器,输入:http://192.168.100.10:31570/productpage
,此时,无论您刷新多少次,页面的评论部分都不会显示评级星标。这是因为您将 Istio 配置为 将评论服务的所有流量路由到版本 reviews:v1
,而此版本的服务不访问星级评分服务。
4.基于用户身份的路由
jason
的用户的所有流量将被路由到服务reviews:v2
,productpage
服务在所有到reviews
服务的HTTP请求中都增加了一个自定义的 end-user
请求头,从而达到了本例子的效果。
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
virtualservice.networking.istio.io/reviews configured
打开浏览器,分别验证登录和不登录jason的页面显示效果。
原理
在此任务中,您首先使用Istio将100%的请求流量都路由到了Bookinfo
服务的v1
版本。然后设置了一条路由规则,它根据productpage
服务发起的请求中的end-user
自定义请求头内容,选择性地将特定的流量路由到了reviews
服务的v2
版本。
请注意,Kubernetes中的服务,如本任务中使用的Bookinfo
服务,必须遵守某些特定限制,才能利用到Istio
的L7路由特性优势。参考Pod和Service需求了解详情。
在流量转移任务中,您将按照在此处学习到的相同的基本模式来配置路由规则,以逐步将流量从服务的一个版本迁移到另一个版本。