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

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

    1. 部署tcp-echo微服务的v1版本。
    • 针对TCP的流量整形创建名称空间
    1. $ kubectl create namespace istio-io-tcp-traffic-shifting
    • 如果使用手动的sidecar的注入,那么使用如下命令
    1. $ kubectl apply -f <(istioctl kube-inject -f samples/tcp-echo/tcp-echo-services.yaml) -n istio-io-tcp-traffic-shifting
    • 如果要使用sidecar的自动注入,使用如下命令
    1. $ kubectl label namespace istio-io-tcp-traffic-shifting istio-injection=enabled
    • 然后通过以下命令部署服务
    1. $ kubectl apply -f samples/tcp-echo/tcp-echo-services.yaml -n istio-io-tcp-traffic-shifting
    1. 路由所有的TCP流量到微服务tcp-echo的v1版本。
    1. $ kubectl apply -f samples/tcp-echo/tcp-echo-all-v1.yaml -n istio-io-tcp-traffic-shifting
    1. 确认tcp-echo服务处于运行状态并获取Ingress-gateway的端口和IP
    1. $ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')
    2. $ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

    [warning]在做下面的测试之前,请确认Pod是否正常启动成功。
    $ kubectl get pods -n istio-io-tcp-traffic-shifting

    1. 发送一些TCP的流量到tcp-echo微服务进行测试。
    1. $ for i in {1..10}; do \
    2. docker run -e INGRESS_HOST=$INGRESS_HOST -e INGRESS_PORT=$INGRESS_PORT -it --rm busybox sh -c "(date; sleep 1) | nc $INGRESS_HOST $INGRESS_PORT"; \
    3. done
    4. one Fri Apr 10 02:02:07 UTC 2020
    5. one Fri Apr 10 02:02:10 UTC 2020
    6. one Fri Apr 10 02:02:12 UTC 2020
    7. one Fri Apr 10 02:02:14 UTC 2020
    8. one Fri Apr 10 02:02:17 UTC 2020
    9. one Fri Apr 10 02:02:19 UTC 2020
    10. one Fri Apr 10 02:02:21 UTC 2020
    11. one Fri Apr 10 02:02:24 UTC 2020
    12. one Fri Apr 10 02:02:26 UTC 2020
    13. one Fri Apr 10 02:02:29 UTC 2020

    时间前面有一个one代表着路由到v1版本。

    1. 现在把v1版本的20%流量路由到v2版本上去。
    1. $ kubectl apply -f samples/tcp-echo/tcp-echo-20-v2.yaml -n istio-io-tcp-traffic-shifting
    1. 确认取代的规则
    1. $ kubectl get virtualservice tcp-echo -o yaml -n istio-io-tcp-traffic-shifting
    1. 发送一些的TCP流量到tcp-echo微服务。
    1. for i in {1..10}; do \
    2. docker run -e INGRESS_HOST=$INGRESS_HOST -e INGRESS_PORT=$INGRESS_PORT -it --rm busybox sh -c "(date; sleep 1) | nc $INGRESS_HOST $INGRESS_PORT"; \
    3. done
    4. one Fri Apr 10 02:11:00 UTC 2020
    5. two Fri Apr 10 02:11:02 UTC 2020
    6. two Fri Apr 10 02:11:05 UTC 2020
    7. two Fri Apr 10 02:11:07 UTC 2020
    8. one Fri Apr 10 02:11:10 UTC 2020
    9. one Fri Apr 10 02:11:12 UTC 2020
    10. one Fri Apr 10 02:11:15 UTC 2020
    11. one Fri Apr 10 02:11:17 UTC 2020
    12. one Fri Apr 10 02:11:19 UTC 2020
    13. one Fri Apr 10 02:11:22 UTC 2020
    1. 移除tcp-echo应用和路由规则
    1. $ kubectl delete -f samples/tcp-echo/tcp-echo-all-v1.yaml -n istio-io-tcp-traffic-shifting
    2. $ kubectl delete -f samples/tcp-echo/tcp-echo-services.yaml -n istio-io-tcp-traffic-shifting
    3. $ kubectl delete namespace istio-io-tcp-traffic-shifting