[serviceMesh]iptables,cilium,ebpf学习

serviceMesh

A Service Mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application. In practice, the Service Mesh is typically implemented as an array of lightweight network proxies that are deployed alongside application code, without the application needing to be aware.

关键词: 服务间通信  基础设施层.  无感知   

1.流量转发的实现

为了将流量交给sidecar管理.业界有两种做法.

1.轻量级sdk

通过一个轻量级sdk直接将请求转发到本机的sidecar.例如mosn/octo.

但是使用轻量级sdk有一个问题,1.用户必须升级sdk. 2.如果用户不是使用sdk的怎么办?例如直接httpclient调用.

2.iptables

设置iptables,将流量拦截,并转发到sidecar.例如istio.

2.1 iptables是设置在pod还是宿主机?

如果设置在宿主机,那么iptables会很多.设置在pod可以把影响降到最低.目前istio也是这么做的. 

但是缺点:修改iptables需要root权限,很多公司并没有在生产环境开放,而且iptables模块也不一定有.

2.缺点

如果用轻量级sdk,可以避免一次tcp协议栈的处理,直接请求到本机sidecar.但是不是所有情况都能满足

如果是用iptables,性能会有所影响. istio选择了功能,舍掉了性能.

preview

轻量级sdk和iptables的区别只在于 需不需要走iptables.

轻量级sdk不需要,但是需要用户升级/且用户必须要用sdk

iptables不需要升级.需要走iptables.

但是他们始终还是要走两遍网络协议栈,第一次是通过回环网卡.第二次通过eth0.  第二次肯定是不可避免的,那第一次可不可以优化呢?

 

有!!!那就是cilium

preview

 

3.cilium

Cilium方案的好处,就在于在 socket 这个层面就完成了请求的转发,通过 sockmap 技术实现 redirect.

Cilium 方案最大的好处,是可以绕开两次TCP堆栈,绕开两次TCP堆栈的好处,则会带来一个出乎意外甚至违背常识的结果:Cilium 劫持可以比轻量级客户端不劫持更快.

3.1kernel module

Kernel Module的主要目的就是让用户可以通过这种机制,实现对内核的“赋能”,动态添加一些内核本身不支持的功能,比如硬件的驱动能力,新的文件系统或是系统调用。当然也可以融合到现有的内核处理流程中,比如在netfilter的某个hook点中添加包处理方法等。

优点:

  • 动态添加/删除,无需重新编译内核
  • 减小内核体积

缺点:

  • 一旦出现BUG可能导致内核直接崩溃
  • 增加内核攻击面,影响内核安全

3.2 bpf,ebpf

bpf全称:伯克利包过滤器 Berkeley Packet Filter.用于过滤网络报文.目的是解决当时包过滤机制效率低下的问题

特点:

  1. 过滤:根据用户输入规则过滤报文.

  2. 拷贝:负责从网卡驱动层拷贝符合条件的数据包到用户空间.

bpf只用做包过滤,使用场景有限.

eBPF(extend BPF)支持在用户态将C语言编写的一小段“内核代码”注入到内核中运行,注入时要先用llvm编译得到使用BPF指令集的elf文件,然后从elf文件中解析出可以注入内核的部分,最后用bpf_load_program方法完成注入。 用户态程序和注入到内核中的程序通过共用一个位于内核中map实现通信.

简单理解,我自己编写一段代码,可以放到内核去运行.数据可以存在共享内存中.

1.例如我想去监控tcp的连接,那么我可以写一段代码,当tcp建立连接后,我生产一个计数器,+1,同时把数据放到共享map中; 我用户态再运行一个程序,例如叫 monitor.  这个用户态进程可以去读取这个共享数据.然后展示.看字节跳动容器化场景下,如何实现性能优化?

2.我想根据一些规则,把接受到的网络包获取到,然后展示出来.也可以使用eBPF. 就是tcpdump喽

 

3.3 cilium 

flannel是overlay network, 主要是L2(VXLAN)。

calico主要是L3,用BGP路由。cilium也主要是L3。

cilium的话在每个node上有个daemonSet叫cilium-agent. 这个cilium agent是用来管理BPF的。cilium的主要卖点就是这个BPF。BPF的性能非常强悍,要比iptables强上数倍。借用一个cilium的图:

 

3.4 ebpf demo

//TODO

 

 

https://mp.weixin.qq.com/s/VL6oKW1m0PXmuuE1v8h0iw

 

https://zhuanlan.zhihu.com/p/48105816

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值