这个课题向你展示如何将一个服务的老版本流量逐渐迁移到新版本上。使用Istio,我们可以通过使用每次流量迁移权重低于100的一系列规则。逐渐完成流量的迁移,例如10,20,30,… 100%。这个课题简易的通过两步将 reviews:v1
的流量迁移到 reviews:v3
:50%, 100%。
Before you begin
- 安装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).
Weight-based version routing
1.为所有微服务设置默认版本v1
istioctl create -f samples/bookinfo/kube/route-rule-all-v1.yaml
2.在你的浏览器中打开 http://$GATEWAY_URL/productpage 来确认 reviews 服务的版本是v1.
你应该观察Bookinfo应用的 productpage展示的内容。注意 productpage
展示内容无星级评定,因为 reviews:v1
没有访问ratings 服务。
注意: 如果你之前进行过 request routing 课题,你可能需要登出测试用户 “jason” 或删除特地为他创建的测试规则。
istioctl delete routerule reviews-test-v2
3.首先,通过如下命令将50%的流量从 reviews:v1
转换到 reviews:v3
istioctl replace -f samples/bookinfo/kube/route-rule-reviews-50-v3.yaml
注意我们使用 istioctl replace
而不是 create
确认我们替换的规则:
istioctl get routerule reviews-default -o yaml
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: reviews-default
namespace: default
spec:
destination:
name: reviews
precedence: 1
route:
- labels:
version: v1
weight: 50
- labels:
version: v3
weight: 50
4.在你的浏览器中刷新productpage
,你现在应该在大约50%的次数中看到红色星级评定。
注意:当前Envoy sidecar实现,你可能需要刷新productpage
很多次观察适当分布。这可能在你看到任何变化前需要刷新15次或者更多。如果你想要更常见红星的话,可以修改规则路由90%的流量到v3.
5.当reviews
微服务的v3版本被认为是稳定的时,我们可以路由100%的流量到 reviews:v3
:
istioctl replace -f samples/bookinfo/kube/route-rule-reviews-v3.yaml
你可以现在以任何用户的身份登陆productpage
,你应该会在每条书评上看到红星。
Understanding what happened
这个课题中,我们使用Istio的权重路由功能将 reviews
服务的旧版本流量迁移到新版本中。注意这和使用容器业务流程平台的部署功能由很大不同,后者使用示例扩展来管理流量。使用Istio,我们允许 reviews
服务的两个版本单独缩放而互不影响流量分配。关于使用自动伸缩的版本路由,查看 Canary Deployments using Istio
Cleanup
- 移除应用路由规则
istioctl delete -f samples/bookinfo/kube/route-rule-all-v1.yaml
- 如果你不打算探索接下来地任何课题,参考 Bookinfo cleanup 指南来关闭应用。