# 流量转移

此任务向您展示如何逐步将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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://rocdu.gitbook.io/deep-understanding-of-istio/4/5/5-4.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
