流量转移

本任务将向您展示如何将流量从微服务的一个版本逐步迁移到另一个版本。 例如,您可以将流量从旧版本迁移到新版本。

一个常见的用例是将流量从微服务的一个版本的逐渐迁移到另一个版本。在 Istio 中, 您可以通过配置一系列规则来实现此目标。这些规则将一定比例的流量路由到一个或另一个服务。

在本任务中,您将会把 50% 的流量发送到 reviews:v1,另外,50% 的流量发送到 reviews:v3。接着,再把 100% 的流量发送到 reviews:v3 来完成迁移。

Istio 包括了对 Kubernetes Gateway API 的 Beta 支持, 打算未来使其成为流量管理的默认 API。 以下说明指导您在网格中配置流量管理时如何选择使用 Gateway API 或 Istio 配置 API。 请按照您的首选项遵循 Gateway APIIstio APIs 页签中的指示说明。

请注意,Kubernetes Gateway API CRD 不会默认安装在大多数 Kubernetes 集群上, 因此请确保在使用 Gateway API 之前已安装好这些 CRD:

  1. $ kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
  2. { kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v0.8.0" | kubectl apply -f -; }

请注意,本文使用 Gateway API 配置内部网格(东西)流量,即不仅是 Ingress(南北)流量。 使用 Gateway API 配置内部网格流量目前是一个还在开发的实验性特性

开始之前

应用基于权重的路由

如果尚未定义服务版本, 请按照定义服务版本中的说明进行操作。

  1. 首先,运行此命令将所有流量路由到各个微服务的 v1 版本。

Zip

  1. $ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@

Zip

  1. $ kubectl apply -f @samples/bookinfo/gateway-api/route-reviews-v1.yaml@
  1. 在浏览器中打开 Bookinfo 站点。网址为 http://$GATEWAY_URL/productpage, 其中 $GATEWAY_URL 是 Ingress 的外部 IP 地址,其描述参见 Bookinfo 文档。

    请注意,不管刷新多少次,页面的评论部分都不会显示评价星级的内容。 这是因为 Istio 被配置为将星级评价的服务的所有流量都路由到了 reviews:v1 版本,而该版本的服务不访问带评价星级的服务。

  2. 使用下面的命令把 50% 的流量从 reviews:v1 转移到 reviews:v3

Zip

  1. $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml@

Zip

  1. $ kubectl apply -f @samples/bookinfo/gateway-api/route-reviews-50-v3.yaml@
  1. 等待几秒钟,等待新的规则传播到代理中生效,确认规则已被替换:
  1. $ kubectl get virtualservice reviews -o yaml
  2. apiVersion: networking.istio.io/v1beta1
  3. kind: VirtualService
  4. ...
  5. spec:
  6. hosts:
  7. - reviews
  8. http:
  9. - route:
  10. - destination:
  11. host: reviews
  12. subset: v1
  13. weight: 50
  14. - destination:
  15. host: reviews
  16. subset: v3
  17. weight: 50
  1. $ kubectl get httproute reviews -o yaml
  2. apiVersion: gateway.networking.k8s.io/v1beta1
  3. kind: HTTPRoute
  4. ...
  5. spec:
  6. parentRefs:
  7. - group: ""
  8. kind: Service
  9. name: reviews
  10. port: 9080
  11. rules:
  12. - backendRefs:
  13. - group: ""
  14. kind: Service
  15. name: reviews-v1
  16. port: 9080
  17. weight: 50
  18. - group: ""
  19. kind: Service
  20. name: reviews-v3
  21. port: 9080
  22. weight: 50
  23. matches:
  24. - path:
  25. type: PathPrefix
  26. value: /
  27. status:
  28. parents:
  29. - conditions:
  30. - lastTransitionTime: "2022-11-10T18:13:43Z"
  31. message: Route was valid
  32. observedGeneration: 14
  33. reason: Accepted
  34. status: "True"
  35. type: Accepted
  36. ...
  1. 刷新浏览器中的 /productpage 页面,大约有 50% 的几率会看到页面中带红色星级的评价内容。 这是因为 reviewsv3 版本可以访问带星级评价,但 v1 版本不能。

    在目前的 Envoy Sidecar 实现中,您可能需要多次刷新 /productpage 页面,可能 15 次或更多次,才能看到正确的流量分发的效果。您可以通过修改规则将 90% 的流量路由到 v3 版本,这样能看到更多带红色星级的评价。

  2. 如果您认为 reviews:v3 微服务已经稳定,您可以通过应用 Virtual Service 规则将 100% 的流量路由 reviews:v3

Zip

  1. $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-v3.yaml@

Zip

  1. $ kubectl apply -f @samples/bookinfo/gateway-api/route-reviews-v3.yaml@
  1. 现在,当您刷新 /productpage 时,您将始终看到带有红色星级评分的书评。

理解原理

在这项任务中,我们使用 Istio 的权重路由功能将 reviews 服务的流量迁移到新版本。 请注意,这和使用容器编排平台的部署功能来进行版本迁移完全不同,后者使用了实例扩容来对流量进行管理。

使用 Istio,两个版本的 reviews 服务可以独立地进行扩容和缩容, 而不会影响这两个服务版本之间的流量分发。

如果想了解支持自动伸缩的版本路由的更多信息,请查看使用 Istio 进行金丝雀部署

清理

  1. 删除应用程序路由规则。

Zip

  1. $ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
  1. $ kubectl delete httproute reviews
  1. 如果您不打算探索任何后续任务,请参阅 Bookinfo 清理中的说明来关闭应用程序。