腾讯云 TSF Service Mesh 流量转发原理介绍

Posted 云中间件技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了腾讯云 TSF Service Mesh 流量转发原理介绍相关的知识,希望对你有一定的参考价值。

1 TSF service mesh

腾讯云TSF service mesh是service mesh理念在TSF的落地实现,最主要的特点是在业务程序本地引入一个网络代理,让用户基本不需要引入额外代码就能方便透明的接入微服务,获得服务注册、服务发现、服务路由、服务鉴权和服务限流等能力,这样不同语言编写的和无法改造的业务也可以方便的接入微服务框架。 

TSF service mesh基于开源项目istio(https://istio.io/), 整体架构如下:

TSF service mesh架构从逻辑上划分为控制面和数据面两大部分:

  • 控制面主要提供配置及控制指令支撑数据面组件的正常运行

  • 数据面主要是提供通信代理来进行透明的服务调用,支撑正常的业务流程

控制面组件:

  • api-server:提供mesh的管理接口,用户可通过调用REST API可以进行mesh的功能配置管理

  • pilot:mesh调度控制中心,提供数据面的动态配置通知下发的能力

  • mixer:mesh策略控制及统计上报中心,提供数据面的访问策略控制、统计信息采集及上报等能力

数据面组件 :

  • pilot-agent:负责环境的初始化及清理,envoy/mesh-dns的生命周期管理

  • envoy:通信代理,提供服务与服务之间通信及治理的能力

  • mesh-dns:提供服务的本地域名解析的能力

其中,透明流量转发是指用户不需要感知本地代理的存在,还可以继续按照域名的方式访问透明的访问其他服务,如通过http访问某个后端服务,原先通过(http://ip:port/api/get) ,只需要变成(http://服务名/api/get) 来访问即可,这就需要在本地将业务程序的流量转发到代理中,即实现本地流量托管。

2 TSF service mesh中的本地流量托管

在TSF mesh中,为了实现服务注册、发现、路由等功能,在本地会有一个proxy进程代理所有的本地服务进出流量。 为了让用户不感知本地代理,即原有的访问方式保持不变,需要将服务的进出流量透明的转发到本地代理。 同时为了不影响本地没有注册在tsf中的业务,我们不能做全量托管,要做细粒度的流量转发。

3 流量转发方案选择

目前在linux下常见的细粒度流量转发方案有几种: 1)iptables iptables是历史悠久的firewall,一直集成在linux内核中。其中,iptables的nat模块(netfilter)就可以用于流量转发。 2)ipvs ipvs集成进linux自带的4层负载均衡组件LVS,可以用于流量转发 3) bpf filter bpf filter,即berkerly pacakge filter,作为tcpdump等流量分析工具的底层实现,特点是性能高和安全,经过发展,开始慢慢作为新一代的流量转发利器

iptables vs ipvsiptables的优势在于起步早,使用范围广泛。iptabels最让人诟病的是当转发规则多时它的性能会下降(瓶颈在5000左右),但是在tsf mesh中随着服务和节点的增加,我们都只会有少量的几条规则(具体原因见后面的示例)iptables vs bpf filter虽然从性能上来看bpf filter会比iptables高,但是目前用bpf filter来做流量转发并不是很成熟

总体来看我们选择了iptables来做细粒度的流量转发。

4 TSF service mesh的流量转发

在TSF mesh中,本地的proxy作为入流量和出流量的double proxy,为了将服务的进出流量转发到本地代理,需要同时有出流量转发规则和入流量转发规则,同时还要将不应该托管的流量return掉

比如现在我们有两个服务consumer和provider,每个服务有一个节点 9.77.7.132节点上有服务:consumer,服务监听端口: 8080,服务协议: http 9.77.7.35节点上有服务:provider,服务监听端口: 8081,服务协议: http 本地代理监听在15001 在9.77.7.132上访问9.77.7.35的provider的/api/get接口: curl http://provider/api/get一次请求的路线如下: 出流量涉及四个组件 1)发起dns请求,查找provider的ip 2)dns query被iptables转发到本地的dns server(监听5353),返回虚拟vip

3)向得到的虚拟vip:80发起请求http://provider/api/get

4)请求被iptables转发到15001端口(proxy)

5)proxy向9.77.7.35:8081发起请求http://provider/api/get 入流量涉及三个组件 6)请求被iptables转发到本地15001端口(proxy) 7)proxy向9.77.7.35:8081发起请求http://provider/api/get

9.77.7.132上的nat规则如下:

 
   
   
 
  1. Chain PREROUTING (policy ACCEPT)

  2. target     prot opt source               destination        

  3. ISTIO_INBOUND  tcp  --  0.0.0.0/0            0.0.0.0/0          


  4. Chain INPUT (policy ACCEPT)

  5. target     prot opt source               destination        


  6. Chain OUTPUT (policy ACCEPT)

  7. target     prot opt source               destination        

  8. ISTIO_OUTPUT  all  --  0.0.0.0/0            0.0.0.0/0          

  9. DNS_OUTPUT  all  --  0.0.0.0/0            0.0.0.0/0          


  10. Chain POSTROUTING (policy ACCEPT)

  11. target     prot opt source               destination        


  12. Chain DNS_OUTPUT (1 references)

  13. target     prot opt source               destination        

  14. RETURN     all  --  0.0.0.0/0            0.0.0.0/0            owner UID match 1000

  15. DNAT       udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53 to:127.0.0.1:5353

  16. DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53 to:127.0.0.1:5353


  17. Chain ISTIO_INBOUND (1 references)

  18. target     prot opt source               destination        

  19. RETURN     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

  20. ISTIO_REDIRECT  tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080


  21. Chain ISTIO_OUTPUT (1 references)

  22. target     prot opt source               destination        

  23. RETURN     all  --  0.0.0.0/0            0.0.0.0/0            owner UID match 1000

  24. DNAT       tcp  --  0.0.0.0/0            168.254.48.46        to:9.77.7.132:15001


  25. Chain ISTIO_REDIRECT (2 references)

  26. target     prot opt source               destination        

  27. REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0            redir ports 15001

9.77.7.35上的nat规则如下:

 
   
   
 
  1. Chain PREROUTING (policy ACCEPT)

  2. target     prot opt source               destination        

  3. ISTIO_INBOUND  tcp  --  0.0.0.0/0            0.0.0.0/0          


  4. Chain INPUT (policy ACCEPT)

  5. target     prot opt source               destination        


  6. Chain OUTPUT (policy ACCEPT)

  7. target     prot opt source               destination        

  8. ISTIO_OUTPUT  all  --  0.0.0.0/0            0.0.0.0/0          

  9. DNS_OUTPUT  all  --  0.0.0.0/0            0.0.0.0/0          


  10. Chain POSTROUTING (policy ACCEPT)

  11. target     prot opt source               destination        


  12. Chain DNS_OUTPUT (1 references)

  13. target     prot opt source               destination        

  14. RETURN     all  --  0.0.0.0/0            0.0.0.0/0            owner UID match 1000

  15. DNAT       udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53 to:127.0.0.1:5353

  16. DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53 to:127.0.0.1:5353


  17. Chain ISTIO_INBOUND (1 references)

  18. target     prot opt source               destination        

  19. RETURN     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

  20. ISTIO_REDIRECT  tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8081


  21. Chain ISTIO_OUTPUT (1 references)

  22. target     prot opt source               destination        

  23. RETURN     all  --  0.0.0.0/0            0.0.0.0/0            owner UID match 1000

  24. DNAT       tcp  --  0.0.0.0/0            168.254.48.46        to:9.77.7.35:15001


  25. Chain ISTIO_REDIRECT (2 references)

  26. target     prot opt source               destination        

  27. REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0            redir ports 15001

说明: Chain DNSOUTPUT:用于做本地dns劫持(用于收敛转发规则到虚拟ip) ISTIOINBOUND:入流量转发规则,只劫持访问本地8081的流量 ISTIOOUTPUT:出流量转发规则,只劫持访问虚拟ip(虚拟ip,用于规则收敛)的流量 ISTIOREDIRECT:劫持流量到本地的15001端口

6 参考

https://console.cloud.tencent.com/tsf
https://kubernetes.io/blog/2018/07/09/ipvs-based-in-cluster-load-balancing-deep-dive
https://cilium.io/blog/2018/04/17/why-is-the-kernel-community-replacing-iptables/


以上是关于腾讯云 TSF Service Mesh 流量转发原理介绍的主要内容,如果未能解决你的问题,请参考以下文章

腾讯云发布微服务中间件TSF

直播 | 腾讯云TSF微服务平台及ServiceMesh技术实践

Mendix结合腾讯TSF实现微服务治理

低代码应用在腾讯TSF实现服务治理的解决方案

腾讯开源的云原生多运行时微服务框架

云原生攻防:Attack in a Service Mesh | CIS 2020大会议题前瞻