一个互联网手艺玩家,一个爱聊手艺的家伙。在工做和进修中不竭思虑,把那些思虑总结出来,并分享,和各人一路交换朝上进步。
原文地址:/
本文介绍了 eBPF 的一些根本应用场景,次要和内核函数,iptables 比照,让各人能理解 eBPF 应该在那些场景下利用,那些场景下不料见利用。我认为能够做为入门 eBPF 的必修课,进修一个手艺,必需晓得那个手艺擅长那些场景,不擅长那些场景,在进修和利用上才不至于走弯路。
媒介
扩展伯克利包过滤器 (eBPF) 是 Linux 内核的一个相对较新的特征,那个特征让许多 DevOps、SRE 和工程师感应面前一亮。但是它是称心所有 Linux 内核需求的一站式处理计划吗?所以本文中我们要阐发看看 eBPF 在哪些方面做得很好,以及它与原则 Linux iptables 的比照若何。
eBPF 是什么?
eBPF 是 Linux 内核中一个已经可用的特征,它允许在内核中运行一个虚拟机。那个虚拟机能够让你平安地将法式加载到内核中并施行,如许就能够灵敏的在用户层定义各类内核中的操做了。那为什么那很重要呢?
在过去,对内核停止功用更改长短常困难的:能够挪用一些内核 api 来获取数据,但不克不及影响内核内部的内容或施行代码。若是要如许做,那你需要向 Linux 社区提交一个补钉,然后期待它被批准。而利用 eBPF,能够将法式加载到内核中,并让内核在一些情状下施行你的法式,好比收到一个数据包或者其他的事务发作。
有了 eBPF,内核及其行为变得高度可定造,不再是固定的了。若是在适宜的情状下利用那种才能,将长短常有价值的。
若何利用 eBPF?
eBPF 有几个利用场景,包罗流量掌握、创建收集战略、毗连时长负载平衡和可察看性。
流量掌握
若是没有 eBPF,数据包利用原则的 Linux 收集途径抵达最末目标地。若是一个数据包呈现在 A 点,而且你晓得那个数据包需要抵达 B 点,那么你能够通过优化 Linux 内核中的收集途径将数据包间接发送到 B 点来。利用 eBPF,你就能够操纵额外的上下文在内核中停止那些更改,如许数据包就能够绕过复杂的路由,间接抵达最末目标地。
那在 Kubernetes 容器情况中尤其有用,因为此中有许多收集。(除了主机收集仓库,每个容器都有本身的迷你收集仓库)当流量进来时,它凡是被路由到一个容器仓库,而且在从主机仓库抵达那里的过程中必需颠末一个复杂的途径。能够利用 eBPF 绕过此复杂的路由。
创建收集战略
展开全文
在创建收集战略时,有两种情状能够利用 eBPF:
eXpress 数据途径(XDP) - 当一个原始数据包缓冲区进入系统时,eBPF 为你供给了一种有效的办法来查抄该缓冲区并快速决定若何处置它。
收集战略 - eBPF 允许高效地查抄数据包和施行收集战略,无论是 pod 和主机。
在 Kubernetes 中停止负载平衡办事毗连时,一个端口需要与办事停止通信,因而需要停止 NAT 转换。一个数据包被发送到一个虚拟 IP,该虚拟 IP 将其转换为目标 IP 是撑持该办事的 pod 上;然后pod 响应虚拟 IP,返回的数据包被转发还源地址。
通过利用 eBPF,能够利用已加载到内核的 eBPF 法式在毗连起头处置的处所停止负载平衡,从而制止那种包转换。因为目标收集地址转换(DNAT)不需要在包处置途径上做处置,因而所有来自办事毗连的 NAT 开销都被优化掉了。
可察看性
利用 eBPF 实现可察看性的两种有用办法:搜集统计信息和深切调试内核。eBPF 法式能够附加到内核中许多差别的函数上,能够拜候那些函数正在处置的数据,也允许修改那些数据。例如,利用 eBPF,若是成立了收集毗连,则能够在创建套接字时触发一个挪用。为什么将套接字挪用做为事务领受很重要?因为 eBPF 在翻开套接字的法式的上下文中供给了那些函数挪用,因而能够获得关于哪个历程翻开了它,以及套接字发作了什么工作。
性能的代价
那么 eBPF 比原则的 Linux iptables 更有效吗?简单来说:要分情状来看。
若是要对 iptables 在大量 IP 地址(即 ipset)的停止收集战略时的工做体例停止微基准测试,iptables 在良多情状下比 eBPF 更好。但是若是想在 Linux 内核中做一些工作,好比需要更改内核中的数据包流向,那么 eBPF 将是更好的选择。原则的 Linux iptables 是一个复杂的系统,当然有它的局限性,但同时它供给了操控流量的才能;若是你晓得若何编写 iptables 规则,那么你能够做良多工作。eBPF 允许将本身的法式加载到内核中,并能够根据你的需要定造影响内核中的行为,因而它比 iptables 更灵敏,因为它不局限于是一组规则。
别的需要考虑的是,固然 eBPF 允许运行法式、添加逻辑、重定向流向和绕过处置(那是必定的优势),但它是一个虚拟机,因而必需转换为字节码运行。比拟之下,Linux 内核的 iptables 运行的是已经编译好的代码。
正如你所看到的,eBPF 和 iptables 并非一个间接的比力。我们需要评估的是性能,那里需要存眷的两个关键因素是延迟(速度)和消耗。若是 eBPF 十分快,但占用了 80% 的资本,那么它就像兰博基尼——一辆高贵的跑车。若是那对你有用,那太好了(也许你实的喜好高贵的跑车)。只要记住,更多的 CPU 利用就意味着你要在云供给商那里花更多的钱。因而,固然兰博基尼可能比良多其他汽车都快,但若是你需要遵守日常通勤的速度限造,它可能不是更好的花钱体例。
何时利用 eBPF(何时不利用)
利用 eBPF,你能够获得性能——但那是有代价的。你需要通过计算性能的代价,并从 eBPF 的功用角度决定你能否承受,要从而找到两者之间的平衡。
来看一些利用 eBPF 有意义的详细情状,以及一些不料见利用 eBPF 的情状。
✘ 何时不消 eBPF
实现应用层战略 - 因为价格与性能的权衡,利用 eBPF 施行深度协议查抄和实现应用层战略的效率不是很高。你能够操纵 Linux 内核的毗连跟踪器( connection tracker)来实现战略,对每个流应用一次战略(无论流有 5 个包仍是5000 个包),并在 Linux conntrack 表中将其标识表记标帜为允许或回绝。不需要不竭查抄流中的每个包。若是要利用 eBPF 实现战略,它允许在单个 TCP 毗连上有多个 如许的代办署理是更好的设想,在那种情状下也是更好的选择。
构建办事网格掌握平面 - 类似地,办事网格依赖于像 Envoy 如许的代办署理。多年来,我们在设想那一过程上花了良多心思。如许做的次要原因是,在许多情状下,关于像 如许的代办署理,而不是利用它替代代办署理自己。
逐包处置 — 利用 eBPF 施行 CPU 密集型或逐包处置,例如对加密流停止解密和从头加密,其实不高效,因为需要构建一个构造并对每个包停止查找,代价十分大。
XDP - eBPF 在原始数据包进入系统时供给了一种有效的处置办法,允许快速决定若何处置数据包。
毗连时间负载平衡 - 利用 eBPF 能够在源端利用加载到内核的法式停止负载平衡,而不是利用虚拟 IP。因为 DNAT 不需要发作在包处置途径上,所有来自营业毗连的 NAT 开销就都被优化了。
可察看性 - epf法式是在Linux内核中添加探测器做为传感器的极好办法,以获得上下文丰硕的数据。那是一个庞大的益处,因为不需要更改内核来撑持跟踪和阐发。您能够很容易地在翻开套接字的法式的上下文中领受套接字挪用,或者添加法式来跟踪内核中的系统挪用。在我们看来,可察看性是eBPF最有用的用例。
eBPF 是 iptables 的替代品吗?我想不完满是。很难想象所有工具在 eBPF 中都能像在 iptables 中一样高效地工做。目前,那两种功用是共存的,取决于用户若何权衡代价和性能,并根据他们的特定需求决定何时利用哪个功用。
我们相信准确的处理计划是操纵 eBPF 加上 Linux 内核中的现有机造来实现你想要的成果。既然我们已经确定 eBPF 和 iptables 都是有用的,那么在我们看来,独一契合逻辑的工作就是同时撑持两者。