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=default
时istio-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-echo
Server已经启动并运行
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