流量转移
本任务将向您展示如何将流量从微服务的一个版本逐步迁移到另一个版本。 例如,您可以将流量从旧版本迁移到新版本。
一个常见的用例是将流量从微服务的一个版本的逐渐迁移到另一个版本。在 Istio 中, 您可以通过配置一系列规则来实现此目标。这些规则将一定比例的流量路由到一个或另一个服务。
在本任务中,您将会把 50% 的流量发送到 reviews:v1
,另外,50% 的流量发送到
reviews:v3
。接着,再把 100% 的流量发送到 reviews:v3
来完成迁移。
开始之前
应用基于权重的路由
- 首先,运行此命令将所有流量路由到各个微服务的
v1
版本。
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
$ kubectl apply -f @samples/bookinfo/gateway-api/route-reviews-v1.yaml@
在浏览器中打开 Bookinfo 站点。网址为
http://$GATEWAY_URL/productpage
, 其中$GATEWAY_URL
是 Ingress 的外部 IP 地址,其描述参见 Bookinfo 文档。请注意,不管刷新多少次,页面的评论部分都不会显示评价星级的内容。 这是因为 Istio 被配置为将星级评价的服务的所有流量都路由到了
reviews:v1
版本,而该版本的服务不访问带评价星级的服务。使用下面的命令把 50% 的流量从
reviews:v1
转移到reviews:v3
:
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml@
$ kubectl apply -f @samples/bookinfo/gateway-api/route-reviews-50-v3.yaml@
- 等待几秒钟,等待新的规则传播到代理中生效,确认规则已被替换:
$ kubectl get virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
...
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 50
- destination:
host: reviews
subset: v3
weight: 50
$ kubectl get httproute reviews -o yaml
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
...
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- group: ""
kind: Service
name: reviews-v1
port: 9080
weight: 50
- group: ""
kind: Service
name: reviews-v3
port: 9080
weight: 50
matches:
- path:
type: PathPrefix
value: /
status:
parents:
- conditions:
- lastTransitionTime: "2022-11-10T18:13:43Z"
message: Route was valid
observedGeneration: 14
reason: Accepted
status: "True"
type: Accepted
...
刷新浏览器中的
/productpage
页面,大约有 50% 的几率会看到页面中带红色星级的评价内容。 这是因为reviews
的v3
版本可以访问带星级评价,但v1
版本不能。如果您认为
reviews:v3
微服务已经稳定,您可以通过应用 Virtual Service 规则将 100% 的流量路由reviews:v3
:
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-v3.yaml@
$ kubectl apply -f @samples/bookinfo/gateway-api/route-reviews-v3.yaml@
- 现在,当您刷新
/productpage
时,您将始终看到带有红色星级评分的书评。
理解原理
在这项任务中,我们使用 Istio 的权重路由功能将 reviews
服务的流量迁移到新版本。
请注意,这和使用容器编排平台的部署功能来进行版本迁移完全不同,后者使用了实例扩容来对流量进行管理。
使用 Istio,两个版本的 reviews
服务可以独立地进行扩容和缩容,
而不会影响这两个服务版本之间的流量分发。
如果想了解支持自动伸缩的版本路由的更多信息,请查看使用 Istio 进行金丝雀部署。
清理
- 删除应用程序路由规则。
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
$ kubectl delete httproute reviews
- 如果您不打算探索任何后续任务,请参阅 Bookinfo 清理中的说明来关闭应用程序。