这个任务向您展示了如何逐步地将TCP流量从一个微服务版本迁移到另一个微服务版本。例如,您可以将TCP流量从旧版本迁移到新版本。
一个常见的用例是将TCP流量从微服务的一个版本逐渐迁移到另一个版本。在Istio中,您可以通过配置一系列规则来实现这个目标,这些规则将TCP流量的一定百分比路由到一个或另一个服务。在这个任务中,您将把100%的TCP流量发送到TCP-echo:v1
。然后,使用Istio的加权路由特性将20%的TCP流量路由到TCP-echo:v2
。
- 部署
tcp-echo
微服务的v1版本。
- 针对TCP的流量整形创建名称空间
$ kubectl create namespace istio-io-tcp-traffic-shifting
- 如果使用手动的sidecar的注入,那么使用如下命令
$ kubectl apply -f <(istioctl kube-inject -f samples/tcp-echo/tcp-echo-services.yaml) -n istio-io-tcp-traffic-shifting
- 如果要使用sidecar的自动注入,使用如下命令
$ kubectl label namespace istio-io-tcp-traffic-shifting istio-injection=enabled
- 然后通过以下命令部署服务
$ kubectl apply -f samples/tcp-echo/tcp-echo-services.yaml -n istio-io-tcp-traffic-shifting
- 路由所有的TCP流量到微服务
tcp-echo
的v1版本。
$ kubectl apply -f samples/tcp-echo/tcp-echo-all-v1.yaml -n istio-io-tcp-traffic-shifting
- 确认
tcp-echo
服务处于运行状态并获取Ingress-gateway的端口和IP
$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')
$ 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
- 发送一些TCP的流量到
tcp-echo
微服务进行测试。
$ for i in {1..10}; do \
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"; \
done
one Fri Apr 10 02:02:07 UTC 2020
one Fri Apr 10 02:02:10 UTC 2020
one Fri Apr 10 02:02:12 UTC 2020
one Fri Apr 10 02:02:14 UTC 2020
one Fri Apr 10 02:02:17 UTC 2020
one Fri Apr 10 02:02:19 UTC 2020
one Fri Apr 10 02:02:21 UTC 2020
one Fri Apr 10 02:02:24 UTC 2020
one Fri Apr 10 02:02:26 UTC 2020
one Fri Apr 10 02:02:29 UTC 2020
时间前面有一个one
代表着路由到v1版本。
- 现在把v1版本的20%流量路由到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
- 发送一些的TCP流量到
tcp-echo
微服务。
for i in {1..10}; do \
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"; \
done
one Fri Apr 10 02:11:00 UTC 2020
two Fri Apr 10 02:11:02 UTC 2020
two Fri Apr 10 02:11:05 UTC 2020
two Fri Apr 10 02:11:07 UTC 2020
one Fri Apr 10 02:11:10 UTC 2020
one Fri Apr 10 02:11:12 UTC 2020
one Fri Apr 10 02:11:15 UTC 2020
one Fri Apr 10 02:11:17 UTC 2020
one Fri Apr 10 02:11:19 UTC 2020
one Fri Apr 10 02:11:22 UTC 2020
- 移除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 namespace istio-io-tcp-traffic-shifting