5.3.4 TCP流量转移

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

一个常见的用例是将TCP流量从微服务的一个版本迁移到另一个版本。在Istio中,您可以通过配置一系列规则来实现此目标,这些规则将一定比例的TCP流量路由到不同的服务。在此任务中,将会把100%的TCP流量分配到tcp-echo:v1,接着,再通过配置Istio路由权重把20%的TCP流量分配到tcp-echo:v2

1.前置条件

  • 安装好Istio

2.设置测试环境

1.创建istio-io-tcp-traffic-shifting名称空间用于测试TCP流量转移,并将其标记为自动注入sidecar方式

创建istio-io-tcp-traffic-shifting名称空间

kubectl create namespace istio-io-tcp-traffic-shifting
namespace/istio-io-tcp-traffic-shifting created

设置为自动注入sidecar

kubectl label namespace istio-io-tcp-traffic-shifting istio-injection=enabled
namespace/istio-io-tcp-traffic-shifting labeled

2.部署sleep应用程序,用于发送请求的测试源

kubectl apply -f samples/sleep/sleep.yaml -n istio-io-tcp-traffic-shifting
serviceaccount/sleep created
service/sleep created
deployment.apps/sleep created

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

kubectl apply -f samples/tcp-echo/tcp-echo-services.yaml -n istio-io-tcp-traffic-shifting
service/tcp-echo created
deployment.apps/tcp-echo-v1 created
deployment.apps/tcp-echo-v2 created

4.确定Ingress端口

export INGRESS_HOST=192.168.100.10
export TCP_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].nodePort}')

istio部署时profile=defaultistio-ingressgateway没有名称为tcp的端口,部署时请注意。

3.应用基于权重的TCP路由

1.将所有流量路由到微服务tcp-echo的v1版本

kubectl apply -f samples/tcp-echo/tcp-echo-all-v1.yaml -n istio-io-tcp-traffic-shifting
gateway.networking.istio.io/tcp-echo-gateway created
destinationrule.networking.istio.io/tcp-echo-destination created
virtualservice.networking.istio.io/tcp-echo created

2.通过从sleep客户端发送一些TCP流量,确认tcp-echoServer已经启动并运行

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 Sat Aug 21 07:31:36 UTC 2021
one Sat Aug 21 07:31:38 UTC 2021
one Sat Aug 21 07:31:39 UTC 2021
one Sat Aug 21 07:31:41 UTC 2021
one Sat Aug 21 07:31:42 UTC 2021
one Sat Aug 21 07:31:43 UTC 2021
one Sat Aug 21 07:31:45 UTC 2021
...

我们看到,所有的流量都被路由到了v1上

3.将20%的流量从tcp-echo:v1转移到tcp-echo:v2

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

4.确认规则已经替换

kubectl get virtualservice tcp-echo -o yaml -n istio-io-tcp-traffic-shifting

5.发送更多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 Sat Aug 21 07:37:04 UTC 2021
one Sat Aug 21 07:37:06 UTC 2021
one Sat Aug 21 07:37:07 UTC 2021
one Sat Aug 21 07:37:09 UTC 2021
one Sat Aug 21 07:37:10 UTC 2021
two Sat Aug 21 07:37:11 UTC 2021
one Sat Aug 21 07:37:13 UTC 2021
one Sat Aug 21 07:37:14 UTC 2021
one Sat Aug 21 07:37:15 UTC 2021
one Sat Aug 21 07:37:17 UTC 2021
one Sat Aug 21 07:37:18 UTC 2021
two Sat Aug 21 07:37:19 UTC 2021
one Sat Aug 21 07:37:21 UTC 2021
...

多测试几次,可以看到大约20%的流量到two上了

4.原理

这个任务中,使用Istio路由权重特性将tcp-echo服务的TCP流量从旧版本迁移到了新版本。请注意,这与使用容器编排平台的部署功能进行版本迁移完全不同,后者(容器编排平台)使用了实例扩容来管理流量。

在Istio中,可以对tcp-echo服务的两个版本进行独立扩容和缩容,这个过程不会影响两个服务版本之间的流量分配。

5.清理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
Copyright © huangzhongde.cn 2021 all right reserved,powered by Gitbook该文件修订时间: 2022-01-28 00:02:24

results matching ""

    No results matching ""