流量切换
此任务演示如何将流量从微服务的一个版本切换到另一个版本。
一个常见的用例是将流量从微服务旧版本逐步迁移到新版本。在 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 站点。URL 为
http://$GATEWAY_URL/productpage
,其中$GATEWAY_URL
是入口的外部 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/v1
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/v1
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
微服务稳定,您可以通过应用此虚拟服务将 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 清理说明以关闭应用程序。