这个课题像你展示如何基于权重和HTTP headers去配置动态请求路由。
Before you begin
- 根据 Installation guide 的指导安装Istio
- 部署 Bookinfo 示例应用
注意: 这个课题假设你在k8s环境部署应用。所有示例命令都使用的是k8s版规则的yaml文件 (e.g., samples/bookinfo/kube/route-rule-all-v1.yaml
)。如果你在一个不同环境进行这个课题,将 kube
更换为对应你运行环境的目录 (e.g., samples/bookinfo/consul/route-rule-all-v1.yaml
for the Consul-based runtime).
Content-based routing
由于Bookinfo示例部署了三个版本的 reviews 微服务,所以我们需要设置一个默认路由。否则如果你访问应用几次,就会注意到有时结果中包含星级评定。这是因为没有设置一个明确的默认版本,Istio会以随机方式路由请求到一个服务的所有可用版本。
注意: 这个课题假设你还没设置任何路由。如果你已经创建和示例冲突的路由,你需要在下面的命令中,使用 replace
来代替 create
。
1.为所有微服务设置默认版本为v1.
istioctl create -f samples/bookinfo/kube/route-rule-all-v1.yaml
注意:在k8s中部署Istio的话,你可以将上面的 istioctl
替换成 kubectl
,包括所有其他CLI命令。然而, kubectl
目前不提供输入检查。
你可以使用下面命令行展示定义好的路由规则:
istioctl get routerules -o yaml
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: details-default
namespace: default
...
spec:
destination:
name: details
precedence: 1
route:
- labels:
version: v1
---
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: productpage-default
namespace: default
...
spec:
destination:
name: productpage
precedence: 1
route:
- labels:
version: v1
---
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: ratings-default
namespace: default
...
spec:
destination:
name: ratings
precedence: 1
route:
- labels:
version: v1
---
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: reviews-default
namespace: default
...
spec:
destination:
name: reviews
precedence: 1
route:
- labels:
version: v1
---
由于规则传播到代理是异步的,你需要在试图访问应用前为规则传播到所有pods等待几秒。
2.在你的浏览器中打开Bookinfo的URL(http://$GATEWAY_URL/productpage)
你应该观察Bookinfo应用展示的productpage。注意到 productpage
的界面没有星级评定,因为 reviews:v1
没有访问ratings服务。
3.路由一个特殊用户到 reviews:v2
让我们通过路由productpage的流量到 reviews:v2
实例上去允许测试用户 “jason”访问ratings服务。
istioctl create -f samples/bookinfo/kube/route-rule-reviews-test-v2.yaml
确认规则已被创建:
istioctl get routerule reviews-test-v2 -o yaml
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: reviews-test-v2
namespace: default
...
spec:
destination:
name: reviews
match:
request:
headers:
cookie:
regex: ^(.*?;)?(user=jason)(;.*)?$
precedence: 2
route:
- labels:
version: v2
4.使用用户 “jason”登陆到 productpage
的网页
你现在应该可以在接下来的每条评论中看到评级(1-5星)。注意,如果你以其他用户登陆,你还会继续看到 reviews:v1
.
Understanding what happened
这个课题中,你使用了Istio去控制Bookinfo服务的每次请求的流量被100%地发送到v1版本。你之后设置了基于一个请求header (i.e., a user cookie) 将流量有选择地发送到reviews服务地v2版本上。
一旦v2版本测试到令我们满意,我们可以使用Istio以一种渐进地方式将所有用户地流量发送到v2.我们在其他课题中探索了这个过程。
Cleanup
- 移除应用路由规则
istioctl delete -f samples/bookinfo/kube/route-rule-all-v1.yaml
istioctl delete -f samples/bookinfo/kube/route-rule-reviews-test-v2.yaml
- 如果你不打算探索接下来地任何课题,参考 Bookinfo cleanup 指南来关闭应用。