腾讯云 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规则如下:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
ISTIO_INBOUND tcp -- 0.0.0.0/0 0.0.0.0/0
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ISTIO_OUTPUT all -- 0.0.0.0/0 0.0.0.0/0
DNS_OUTPUT all -- 0.0.0.0/0 0.0.0.0/0
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain DNS_OUTPUT (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0 owner UID match 1000
DNAT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53 to:127.0.0.1:5353
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 to:127.0.0.1:5353
Chain ISTIO_INBOUND (1 references)
target prot opt source destination
RETURN tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ISTIO_REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
Chain ISTIO_OUTPUT (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0 owner UID match 1000
DNAT tcp -- 0.0.0.0/0 168.254.48.46 to:9.77.7.132:15001
Chain ISTIO_REDIRECT (2 references)
target prot opt source destination
REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 redir ports 15001
9.77.7.35上的nat规则如下:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
ISTIO_INBOUND tcp -- 0.0.0.0/0 0.0.0.0/0
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ISTIO_OUTPUT all -- 0.0.0.0/0 0.0.0.0/0
DNS_OUTPUT all -- 0.0.0.0/0 0.0.0.0/0
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain DNS_OUTPUT (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0 owner UID match 1000
DNAT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53 to:127.0.0.1:5353
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 to:127.0.0.1:5353
Chain ISTIO_INBOUND (1 references)
target prot opt source destination
RETURN tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ISTIO_REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8081
Chain ISTIO_OUTPUT (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0 owner UID match 1000
DNAT tcp -- 0.0.0.0/0 168.254.48.46 to:9.77.7.35:15001
Chain ISTIO_REDIRECT (2 references)
target prot opt source destination
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 流量转发原理介绍的主要内容,如果未能解决你的问题,请参考以下文章