EBPF-网络和安全的未来

2020-11-11 01:47:26

今天对于纤毛社区来说是令人兴奋的一天:纤毛背后的公司Isovality宣布了由Andreessen Horowitz、谷歌和思科支持的2900万美元的首轮融资。这是一个很好的机会,可以更深入地研究基于eBPF的网络是从哪里来的,以了解令人兴奋的一切。

两周前,我们举办了有史以来第一次eBPF 2020年峰会。除了激动人心的主题演讲外,cilium的几位用户还谈到了他们的使用案例,包括Adobe、CapitalOne、Datadog、GitLab、Google和Wildlife Studios。上个月早些时候,阿里巴巴云报道了他们如何将Cilium用于基于eBPF的高性能云本地网络。就在几周前,谷歌刚刚宣布为GKE和Anthos提供基于纤毛的网络数据平面。

过去的几个月对整个团队来说已经是令人难以置信的兴奋。Kubernetes的联合创始人之一并不是每天都会赞扬你的团队创造的技术和工作。

今天的秘密发布对团队来说是又一个伟大的时刻,也是所有团队成员的成就,他们为这一天付出了令人难以置信的努力。我们期待着在继续围绕我们的开源项目创新的同时,更公开地谈论我们作为一家公司所做的事情。

这是一个很好的机会,可以更深入地探讨使用eBPF进行网络交流的动机。所有这些用户在纤毛上看到的是什么?EBPF有什么特别之处?

为了真正理解这一转变,让我们简要回顾一下人际关系网的历史。在90年代,网络几乎完全是物理的。电缆、外围设备、拨号调制解调器和大量的第二层。大约在同一时间,在1999年,为Linux创建了iptable,不久之后,为BSD发布了PF。这两个项目都专注于基于软件的防火墙。更大规模运动的早期迹象是:软件定义的网络。这是我个人参与Linux网络的时候。

在2003-2008年间,VLAN首次被描述,XenHypervisor的第一个版本出现了,EMC收购了VMware,KVM被合并到Linux内核中。这是虚拟化时代的开始,但从网络的角度来看,并没有太大的变化。通过将虚拟机直接桥接到网络,将虚拟机的联网委托给底层物理网络。软件中几乎不存在联网逻辑。在这个早期的虚拟化时代,Linux内核联网的大部分焦点都集中在TCP/IP堆栈和将内核优化为一个运行应用程序的系统上。

从软件网络的角度来看,2009年是事情变得令人兴奋的一年。Open vSwitch的第一个版本发布了,它为我们带来了软件定义的网络(SDN)。它为Linux内核带来了巨大的网络可编程性。

这一可编程性方面在今天的基于eBPF的网络中仍然可以找到,并且是基石之一。基于eBPF的网络植根于SDN,并通过从等式中去掉以设备为中心的模型来转移它。

2013年带来了多克。Docker主要从虚拟化层继承网络,从网络角度看,容器被视为微型虚拟机。Docker带来的根本性转变侧重于使用容器镜像打包应用程序,而不是基础架构方面。因此,几乎所有早期的容器网络解决方案都继承自OpenStack时代。

2014年,第一次对库伯内斯的承诺发生了。Kubernetes显然不是第一个尝试将高级用户意图转化为基础设施自动化的项目,但Kubernetes做出了一个深思熟虑的决定,在网络和安全方面做了更少的假设。例如,Kubernetes中没有网络或子网的概念。这导致了一个令人印象深刻的创新周期。

但Kubernetes的快速演变也有其阴暗面:对尽快达到足够完整状态的渴望使其依赖于iptable。Linux内核中的Apacket Filter,这是我在使用ADAL-UP调制解调器时亲自开发的。显然不是完全适合这项任务,但随处可得,而且足够好,可以开始使用。

在Kubernetes成立的同一年,eBPF首次被合并到Linuxkernel中,作为替代长期存在的包过滤器BPF的继任者。因此取名为eBPF。一年后,eBPF后端被合并到LLVM编译器套件中,允许LLVM发出eBPF字节码。同时,一个新的eBPF分类器使Linux与eBPF联网成为可编程的。

2016年,XDP被合并到Linux内核中,实现了一个高性能的数据路径,使eBPF程序可以直接在网络设备的驱动程序中运行。这就是后来开发基于eBPF的高性能负载均衡器的原因,这些负载均衡器驱动着当今一些最大的数据中心。

从那以后,eBPF是一条令人难以置信的陡峭的发展轨迹,每年都会变得越来越强大。EBPF的通用性允许在其周围形成不同的社区,跨越网络、跟踪、安全、分析和可观察性。

回顾一下历史,在硬件网络中,功能和规模都是由硬件来定义的。有了软件定义的网络,很多东西都从硬件转移到了软件上,采用了以前硬件提供的功能,用软件重写,然后把虚拟这个词放在前面。只要涉及到机器,所有这些都是有意义的。

容器和云本地时代与机器无关。我们关心的是应用程序、API和服务。有些机器仍将存在很长一段时间,但您不想围绕它们构建体系结构。

然而,在现代系统中,我们很少考虑连接机器、虚拟机,甚至容器。相反,我们关心的是连接微服务。因此,我们想到的不是机器和电线,而是云服务、API和用于连接它们的更高级别的协议和系统。过去是IP地址、端口、vNIC和VLAN。现在是服务标识、GRPC、Kafka、分布式数据存储、远程API等。

是什么让eBPF和纤毛如此适合应对新的云本地挑战?

EBPF的可编程性使其能够适应快速发展的云本地需求,并轻松应对规模的增长。下面是一个例子,说明eBPF的可编程性如何导致Google采用Cilium作为GKE的新网络数据平面:

随着越来越多的企业采用Kubernetes,随着围绕多云、安全性、可见性和可扩展性的新需求,用例的范围也在扩大。此外,服务网状网和无服务器等新技术对底层Kubernetes层的定制提出了更高的要求,这些新需求都有一个共同点:它们需要一个更可编程的数据平面,能够在不牺牲性能的情况下执行Kubernetes感知的分组操作。

进入扩展的Berkeley数据包过滤器(EBPF),这是一种新的Linux网络范例,它将可编程钩子暴露到Linux内核内的网络堆栈。

更重要的是,eBPF不是特定的网络,也不局限于某个特定的领域。EBPF的通用性不仅吸引了一个更大的社区进行创新,还避免了过早假设解决未来问题需要哪些积木。与任何特定于网络的可编程性解决方案(如iptables、OpenvSwitch或nftable)相比,这是一个巨大的优势。

你们中的一些人可能会正确地说,可编程性已经以用户空间网络的形式存在了。EBPF可编程性的一个独特的新方面是嵌入到Linux内核中。应用程序使用系统调用通过网络进行交互,Linux内核负责处理这些系统调用。为了让用户空间网络框架对应用程序保持透明,它仍然必须遍历Linux内核的套接字层。EBPF通过完全保留在内核中来避免这一点。

之前这一点并不重要的原因是,对于虚拟机,管理程序在金属机器的网络设备和虚拟机内部操作系统的插座之间创建了一个自然边界。对于容器,所有这些都发生在同一个内核中。

那么为什么不直接加载Linux内核模块呢?显然,它以非常高的效率提供了任意的可编程性。我们可以深入研究跨内核版本维护内核模块的成本,但主要的缺点是更微不足道:既安全又高效。

错误的内核代码会使你的机器崩溃。内核不受有缺陷的内核模块的保护。我认为人们认为这就是做内核编程的代价。EBPF改变了这一教条。它给内核编程带来了安全性。

通过要求eBPF程序通过验证过程,eBPF程序比加载内核模块要安全得多。

效率由保证eBPF字节码本地执行速度的即时(JIT)编译器保证。

所有这些都使eBPF变得非常强大,但它也是一种低级技术,主要供Linux内核开发人员使用。这就是纤毛发挥作用的地方。

Cilium是在eBPF之上设计的开源项目,旨在满足集装箱工作负载的网络、安全和可见性需求。它在eBPF之上提供了高级抽象。Cilium对于eBPF的意义就像Kubernetes和容器运行时对于Linux内核名称空间、cgroup和seccomp的意义一样。位于顶部的右侧抽象层。

网络连接:在其最基本的形式中,cilium是为Kubernetes工作负载提供网络连接的CNI。基于eBPF的数据路径具有IPv4和IPv6功能,能够支持直接路由、封装/覆盖拓扑,以及与云提供商特定的网络层集成。

服务负载均衡:Cilium可以作为100%Kube-Proxy的替代品,在Kubernetes集群中提供所有服务负载均衡。该实现具有高度的可扩展性,并支持具有会话亲和性的直接服务器返回(DSR)。如果可能,cilium将在系统调用级别执行负载平衡,并在connect()系统调用中直接转换地址,而不是在整个网络连接期间依赖网络地址转换。

边缘负载均衡:基于XDP的边缘负载均衡能力可以将流量引导到Kubernetes集群中,也可以完全独立于Kubernetes运行。它支持与磁悬浮一致的散列,并提供了Kubernetes服务类型NodePort、ExternalIP、LoadBalancer和HostPort的实现。

多集群互联+安全:Kubernetes集群拥有多集群能力,无需引入额外的网关或代理即可实现互联。全局服务的部署允许跨群集来路由服务流量。

VM/Metal集成:通过在Kubernetes集群中表示外部工作负载,就像工作负载作为吊舱运行一样,虚拟机和金属机器可以与Kubernetes工作负载无缝连接,而无需代理或网关。

网络策略:基于完全内置在eBPF中的现代基于身份的实现,全面支持Kubernetes网络策略。ExtensiveVisibility功能允许轻松排除故障并监控合规性。

基于FQDN/DNS:与基于DNS的服务发现透明集成,允许基于DNS名称而不是IP地址块定义网络策略,以应对由不断变化的IP地址集支持的现代服务的高度动态特性。内置的DNS授权进一步完善了安全模型。

API感知:按需透明注入特使和其他代理,允许在API级别执行安全策略,如HTTP、Kafka、GRPC、Cassandra等。

策略驱动的SSL终止和注入:SSL证书的终止和注入是策略驱动的,允许代表应用程序终止SSL连接或透明地为服务流量注入证书或令牌,而无需直接与工作负载共享秘密。

模拟和审计:策略模拟和策略审计允许在丢弃实时流量之前评估网络策略更改的影响。

流日志:L3-L7的流日志提供网络级别的转发和策略决策的深度可见性。群集范围的流量查询API允许快速评估整个行为中的网络行为,或检查事件期间的网络丢弃情况。

可编程指标:可配置和可编程指标允许了解网络、应用程序和安全行为,并一致监控正确性。

故障排除:故障排除工具从一开始就内置在Cilium中。内部跟踪系统允许跟踪每个转发决策,并且可以在运行时启用。指标通过详细的推理捕获数据包丢弃。

对于我们的团队来说,激动人心的时刻还在继续。作为一家公司,Isovality的公开发布是我们作为一个团队的又一个重要里程碑。从技术上讲,这只是我们的客户已经使用了一段时间的东西--Hello world,但对我们的团队来说,今天是令人激动的。今年在许多方面都具有挑战性,并不是所有的事情都在我们的掌控之中。作为一个团队,能够取得和建立一些每个人都能真正引以为豪的东西,这对我来说永远是团队和公司建设中最有价值的方面。