TCP路由(TCPRoute)与之前HTTPRoute类似,根据TCP请求的信息,转发请求到后端不同服务上。
目前版本不支持使用权重来进行多路由转发,而1.1版本中已经支持。
Redis服务器的TCP路由示例如下:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: redis-proxy spec: hosts: - redis-proxy tcp: - match: - port: 16379 route: - destination: host: redis port: number: 6379
上面代码定义的VirtualService表明,当以TCP协议请求redis-proxy的16379时,转发请求到Redis服务的6379端口。
【实验】
1)部署Redis client:
$ kubectl apply -f kubernetes/redis-cli.yaml
2)部署Redis server:
$ kubectl apply -f kubernetes/redis-server.yaml $ kubectl get pod NAME READY STATUS RESTARTS AGE redis-v1-7d56d758f5-tkp6n 1/1 Running 0 11s
3)创建Redis server的TCP路由规则:
$ kubectl apply -f istio/miscellaneous/virtual-service-tcp-route.yaml
4)创建不包含后端Pod的redis-proxy Service,用于DNS域名解析:
$ kubectl apply -f kubernetes/redis-proxy-service.yaml
5)服务访问测试:
$ REDIS_CLI_POD=$(kubectl get pod -l app=redis-cli -o jsonpath={.items..metadata.name}) $ kubectl exec $REDIS_CLI_POD -c redis-cli -- redis-cli -h redis-proxy -p 16379 info cpu # CPU used_cpu_sys:0.423661 used_cpu_user:0.490072 used_cpu_sys_children:0.000783 used_cpu_user_children:0.001674
从上面的请求测试可以看出,当访问redis-proxy服务的16379端口时,请求转发到了Redis服务的6379端口。
6)清理:
$ kubectl delete -f kubernetes/redis-cli.yaml $ kubectl delete -f kubernetes/redis-server.yaml $ kubectl delete -f kubernetes/redis-proxy-service.yaml $ kubectl delete -f istio/miscellaneous/virtual-service-tcp-route.yaml