# 流量转移

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

一个常见的用例是将TCP流量逐渐从一种微服务版本迁移到另一种。在Istio中,您可以通过配置一系列规则以将一定百分比的TCP流量路由到一项服务或另一项服务来实现此目标。在此任务中,您将100％的TCP通信发送到tcp-echo:v1。然后,您将tcp-echo:v2使用Istio的加权路由功能将20％的TCP流量路由。

在你开始之前 按照安装指南中的说明安装Istio 。

查看流量管理概念文档。

设置测试环境 首先,创建一个用于测试TCP流量转移的名称空间,并将其标记为启用自动边车注入。

$ kubectl create namespace istio-io-tcp-traffic-shifting $ kubectl label namespace istio-io-tcp-traffic-shifting istio-injection=enabled

部署睡眠示例应用程序以用作发送请求的测试源。

$ kubectl apply -f samples/sleep/sleep.yaml -n istio-io-tcp-traffic-shifting

部署微服务的v1和v2版本tcp-echo。

$ kubectl apply -f samples/tcp-echo/tcp-echo-services.yaml -n istio-io-tcp-traffic-shifting

按照 确定入口IP和端口 中的说明定义TCP\_INGRESS\_PORT和INGRESS\_HOST环境变量。

应用基于权重的TCP路由 将所有TCP通信路由到微服务的v1版本tcp-echo。

$ kubectl apply -f samples/tcp-echo/tcp-echo-all-v1.yaml -n istio-io-tcp-traffic-shifting

tcp-echo通过从sleep客户端发送一些TCP通信来确认该服务已启动并正在运行。

$ for i in {1..20}; do  kubectl exec "$(kubectl get pod -l app=sleep -n istio-io-tcp-traffic-shifting -o jsonpath={.items..metadata.name})"  -c sleep -n istio-io-tcp-traffic-shifting -- sh -c "(date; sleep 1) | nc $INGRESS\_HOST $TCP\_INGRESS\_PORT";  done one Mon Nov 12 23:24:57 UTC 2018 one Mon Nov 12 23:25:00 UTC 2018 one Mon Nov 12 23:25:02 UTC 2018 one Mon Nov 12 23:25:05 UTC 2018 one Mon Nov 12 23:25:07 UTC 2018 one Mon Nov 12 23:25:10 UTC 2018 one Mon Nov 12 23:25:12 UTC 2018 one Mon Nov 12 23:25:15 UTC 2018 one Mon Nov 12 23:25:17 UTC 2018 one Mon Nov 12 23:25:19 UTC 2018 ...

您应该注意,所有时间戳都有一个前缀1,这意味着所有流量都被路由到v1该tcp-echo服务的版本。

使用以下命令将20％的流量从传输tcp-echo:v1到tcp-echo:v2:

$ kubectl apply -f samples/tcp-echo/tcp-echo-20-v2.yaml -n istio-io-tcp-traffic-shifting

等待几秒钟,以使新规则传播。

确认规则已被替换:

$ kubectl get virtualservice tcp-echo -o yaml -n istio-io-tcp-traffic-shifting apiVersion: networking.istio.io/v1beta1 kind: VirtualService ... spec: ... tcp:

* match:
  *   port: 31400

      route:
  *   destination:

      &#x20; host: tcp-echo

      &#x20; port:

      ```
      number: 9000
      ```

      &#x20; subset: v1

      weight: 80
  *   destination:

      &#x20; host: tcp-echo

      &#x20; port:

      ```
      number: 9000
      ```

      &#x20; subset: v2

      weight: 20

向tcp-echo微服务发送更多TCP流量。

$ for i in {1..20}; do  kubectl exec "$(kubectl get pod -l app=sleep -n istio-io-tcp-traffic-shifting -o jsonpath={.items..metadata.name})"  -c sleep -n istio-io-tcp-traffic-shifting -- sh -c "(date; sleep 1) | nc $INGRESS\_HOST $TCP\_INGRESS\_PORT";  done one Mon Nov 12 23:38:45 UTC 2018 two Mon Nov 12 23:38:47 UTC 2018 one Mon Nov 12 23:38:50 UTC 2018 one Mon Nov 12 23:38:52 UTC 2018 one Mon Nov 12 23:38:55 UTC 2018 two Mon Nov 12 23:38:57 UTC 2018 one Mon Nov 12 23:39:00 UTC 2018 one Mon Nov 12 23:39:02 UTC 2018 one Mon Nov 12 23:39:05 UTC 2018 one Mon Nov 12 23:39:07 UTC 2018 ...

您现在应该注意到,大约20％的时间戳记带有两个前缀,这意味着80％的TCP流量被路由到v1该tcp-echo服务的版本,而20％的时间戳被路由到v2。

了解发生了什么 在此任务中,您tcp-echo使用Istio的加权路由功能将TCP流量从旧版本的服务部分迁移到了新版本。请注意,这与使用容器编排平台的部署功能进行版本迁移非常不同,后者使用实例缩放来管理流量。

使用Istio,您可以允许服务的两个版本分别tcp-echo独立地向上和向下扩展,而不影响它们之间的流量分配。

有关具有自动缩放功能的版本路由的更多信息,请查看博客文章Canary Deployments using Istio。

清理 删除sleep示例,tcp-echo应用程序和路由规则:

$ kubectl delete -f samples/tcp-echo/tcp-echo-all-v1.yaml -n istio-io-tcp-traffic-shifting $ kubectl delete -f samples/tcp-echo/tcp-echo-services.yaml -n istio-io-tcp-traffic-shifting $ kubectl delete -f samples/sleep/sleep.yaml -n istio-io-tcp-traffic-shifting $ kubectl delete namespace istio-io-tcp-traffic-shifting
