13.3 URL重写

上一章

13.5 TLS路由

下一章

更多图书

13.4 TCP路由

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