Cilium eBPF 网络解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 在上一篇文章中,我们简要地解析了 eBPF 内核独立子系统的基本概念、发展历史、架构模型以及优缺点等,具体可参考:Linux eBPF解析。

      在上一篇文章中,我们简要地解析了 eBPF 内核独立子系统的基本概念、发展历史、架构模型以及优缺点等,具体可参考:Linux eBPF解析

      随着云原生生态领域的逐渐完善,云操作系统,例如:Kubernetes ,正在吞噬着整个容器世界,越来越多的厂商在匆忙地布局着基于云操作系统的相关平台,以便尽可能在有限的时间及空间内获得一杯羹,而此时,在另一端,蜂拥而至的企业们也在不断尝试将自有业务迁移至容器平台,以便享受新技术带来的革命性红利,一时间,Kubernetes 仿佛成了云系统的代名词,火热的一发不可收拾。

       基于此,我们可以清晰地看到:围绕不同的企业、不同的业务场景、不同的技术实现需求以及差异化的技术发展趋势,容器的部署密度越来越高,而伴随着容器的生命周期却越来越短。然而,随着业务场景的创新化,基于传统的技术或多或少在某种特定的场景下开始显得很鸡肋,已经开始无法支撑新的需求,于是,新的技术就应运而生,开始尝试解决这一业务痛点。

      Cilium 是什么,我们为什么要关注它?这就是本篇文章所要探讨的。

      在我们所了解的云原生编排系统中,基于不同的业务场景驱动,微服务的架构也随之进行着不断的演进,而此时,我们所依赖的云操作系统网络也因为各种诉求也随着更替,从最初的 Flannel 、Calico以及到现在的 Cilium 等。从本质上讲,Cilium 是一个基于 eBPF 之上的通用性抽象,即 Cilium 对 eBPF 进行了封装,并提供了一个更上层的 API ,使得其能够覆盖分布式系统的绝大多数场景。为什么 eBPF 如此强大,使得其能够获得青睐?主要取决于以下3方面,具体如下所示:

Fast-快速

      eBPF技术无论是基于何种场景,几乎总是比 Iptables 快,相对于 Iptables,eBPF 程序较短。Iptables 基于一个非常庞大的内核框架(Netfilter),此框架出现在内核 Datapath 的多处,冗余性较高。因此,我们在实现类似 ARP Drop 这样相同的功能时,基于 Iptables 技术,冗余就会显得非常笨重,从而导致性能很低。

Flexible-灵活

      基于 eBPF ,我们可以实现任何想要的需求,这或许也是最核心的原因。eBPF 基于内核提供的一组接口,运行 JIT 编译的字节码,并将计算结果返回给内核。在此过程中,内核只关心 XDP 程序的返回是 PASS、DROP 还是 REDIRECT。至于在 XDP 程序里做什么, 完全无需知晓。

Separates Data from Functionality-数据功能分离

      在内核体系中,Nftables 和 Iptables 也可以将数据与功能进行分离,然而,经综合对比,2者功能并没有 eBPF 强大。例如,eBPF 可以使 用 Per-cpu 的数据结构,因此其能取得更极致、优越的性能体验。

      从本质上讲,eBPF 真正的优势在于能够将 “数据与功能分离” 此项事情做的非常干净(Clean Separation)甚至完美。也就是说,可以在 eBPF 程序不中断的情况下修改它的运行方式。具体方式是修改它访 问的配置数据或应用数据,例如黑名单里规定的 IP 列表和域名。具体可参考如下:

        我们来看下 Cilium 的相关概念及架构,基于 Cilium 机制,其通常要求运行于 Linux Kernel  4.8.0 及以上版本,官方建议 Kernel 版本至少在 4.9.17 以上,若运行环境为Ubuntu ,则建议其发行版中 Linux 内核版本一般为 4.12 以上,若基于 CentOS 7,则需要升级才能运行 Cilium。为方便起见,Cilium 一般跟容器编排调度器使用同一个 KV 存储数据库,例如在 Kubernetes 中使用 etcd 存储。

      接下来,我们了解下Cilium 的组件示意图,Cilium 是位于 Linux Kernel 与容器编排系统的中间层。向上可以为容器配置网络,向下可以向 Linux 内核生成 BPF 程序来控制容器的安全性和转发行为。具体如下所示:

      基于上述组件图,管理员通过 Cilium CLI 配置策略信息,这些策略信息将存储在 KV 数据库里,Cilium 使用插件(如 CNI)与容器编排调度系统交互,来实现容器间的联网和容器分配 IP 地址分配,同时 Cilium 还可以获得容器的各种元数据和流量信息,提供监控 API。

      关于Cilium Agent ,其作为守护进程运行在每个节点上,与容器运行时如 Docker,和容器编排系统交互如 Kubernetes。通常是基于插件的形式(如 Docker Plugin)或遵从容器编排标准定义的网络接口(如 CNI)。具体地,Cilium Agent 的主要功能包含以下:

      1、基于 Clang/LLVM 将 BPF 程序编译为字节码,在容器的虚拟以太网设备中的所有数据包上执行,并将它们传递给 Linux 内核。

      2、与容器管理平台的网络插件交互,实现 IPAM 的功能,用于给容器分配 IP 地址,该功能与 Flannel、Calico 网络插件类似。

      3、收集容器的元数据,例如 Pod 的 Label,可用于 Cilium 安全策略里的 Endpoint 识别,这个跟 Kubernetes 中的 Service 里的 Endpoint 类似。

      4、将其有关容器标识和地址的知识与已配置的安全性和可见性策略相结合,生成高效的 BPF 程序,用于控制容器的网络转发和安全行为。

      5、其他相关自定义配置。

      下面我们再来看下 Cilium 是如何基于 eBPF 实现容器网络方案的,首先,我们了解下其流程图,具体如下所示:

       基于上述 Cilium eBPF 流程图,简要解析如下:

       1、Cilium Agent 生成对应的 eBPF 程序。

       2、用 LLVM 编译 eBPF 程序,生成 eBPF 对象文件(object file,*.o)。

       3、用 eBPF loader 将对象文件加载到 Linux 内核。

       4、校验器(verifier)对 eBPF 指令会进行合法性验证,以确保程序是安全的,例如 ,无非法内存访问、不会 Crash 内核、不会有无限循环等。

       5、对象文件被即时编译(JIT)为能直接在底层平台(例如 x86)运行的Native Code。

       6、如果要在内核和用户态之间共享状态,BPF 程序可以使用 BPF map,这种一种共享存储 ,BPF 侧和用户侧都可以访问。

       7、BPF 程序就绪,等待事件触发其执行。对于此示例,在某一时刻,若存在有数据包到达网络设备时,便触发 BPF 程序的执行。

       8、BPF 程序对收到的包进行处理,随后将返回一个裁决(verdict)结果。

       9、根据裁决结果,如果是 DROP,这个包将被丢弃;如果是 PASS,包会被送到更网络栈的 更上层继续处理;如果是重定向,就发送给其他设备。

       基于上述的流程,我们可以看出,基于 eBPF ,对数据平面(Datapth)进行了重新定义,具体如下,

      首先,从长期看,eBPF 这项新功能会减少未来的 Feature Creeping Normality。因为用户或开发者希望内核实现的功能,以后不需要再通过改内核的方式来实现了。只需要一段 eBPF 代码,实时动态加载到内核就行了。

      其次,基于 eBPF,内核也不会再引入那些影响Fast Path 的蹩脚甚至 Hardcode 代码 ,从而也避免了性能的下降。

      再者,eBPF 还使得内核完全可编程,安全地可编程(Fully and Safely Programmable ),用户编写的 eBPF 程序不会导致内核 Crash。另外,eBPF 设计用来解决真实世界中的线上问题,而且我们现在仍然在坚守这个初衷。

      站在网络角度,我们来看一下基于传统的 Kube-Proxy 处理 Kubernetes Service 时,包在内核中的转发路径是怎样的?简要流程如下图所示:

       具体步骤如下:

       1、网卡收到一个包(通过 DMA 放到 Ring-Buffer)。

       2、包经过 XDP Hook 点。

       3、内核给包分配内存,此时才有了大家熟悉的 Skb(包的内核结构体表示),然后 送到内核协议栈。

       4、包经过 GRO 处理,对分片包进行重组。

       5、包进入 TC(Traffic Control)的 Ingress Hook。接下来,所有标识为浅蓝色的框都是 Netfilter 处理点。

       6、Netfilter:在 PREROUTING Hook 点处理 Raw Table 里的 Iptables 规则。

       7、包经过内核的连接跟踪(Conntrack)模块。

       8、Netfilter:在 PREROUTING Hook 点处理 Mangle Table 的 Iptables 规则。

       9、Netfilter:在 PREROUTING Hook 点处理 Nat Table 的 Iptables 规则。

       10、进行路由判断(FIB:Forwarding Information Base,路由条目的内核表示,译者注) 。接下来又是四个 Netfilter 处理点。

       11、Netfilter:在 FORWARD Hook 点处理 Mangle Table 里的 Iptables 规则。

       12、Netfilter:在 FORWARD Hook 点处理 Filter Ttable 里的 Iptables 规则。

       13、Netfilter:在 POSTROUTING Hook 点处理 Mangle Table 里的 Iptables 规则。

       14、Netfilter:在 POSTROUTING hook 点处理 Nat Table 里的 Iptables 规则。

       15、包到达 TC Egress Hook 点,会进行出方向(Egress)的判断,例如判断这个包是到本 地设备,还是到主机外。

       16、对大包进行分片。根据 Step 15 判断的结果,这个包接下来可能会:发送到一个本机 veth 设备,或者一个本机 Service Endpoint,或者,如果目的 IP 是主机外,就通过网卡发出去。

       上述我们已经了解到传统的包转发路径,再来看下基于Cilium eBPF 中的包转发路径,简要流程如下图所示:

       基于对比可以看出,Cilium eBPF Datapath 做了短路处理:从 TC ingress 直接 ShortCut 到 TC egress,节省了 9 个中间步骤(总共 17 个)。更重要的是:这个 Datapath 绕过了 整个 Netfilter 框架(浅蓝色的组件),Netfilter 在大流量情况下性能较差。

       移除那些不必要的组件后,Cilium eBPF Datapath 流程示意图可精简为以下:

      其实,基于其设计理念,Cilium eBPF 还能走的更远。例如,如果包的目的端是另一台主机上的 Service Endpoint,那你可以直接在 XDP 框中完成包的重定向(收包 1->2,在步骤 2 中对包 进行修改,再通过 2->1 发送出去),将其发送出去,如下图所示:

       基于XDP技术, XDP 为 eXpress DataPath 的缩写,支持在网卡驱动中运行 eBPF 代码,而无需将包送 到复杂的协议栈进行处理,因此处理代价很小,速度极快。

       最后,我们来了解下Cilium 的 Service Load Balancing 设计,简要架构如下图所示:

       因时间原因,故针对其流量解析暂不在本章描述,后续再做补充,基于此,本篇文章关于Cilium eBPF 解析到此为止,大家有问题随时留意沟通。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
167 30
|
15天前
|
网络协议
TCP报文格式全解析:网络小白变高手的必读指南
本文深入解析TCP报文格式,涵盖源端口、目的端口、序号、确认序号、首部长度、标志字段、窗口大小、检验和、紧急指针及选项字段。每个字段的作用和意义详尽说明,帮助理解TCP协议如何确保可靠的数据传输,是互联网通信的基石。通过学习这些内容,读者可以更好地掌握TCP的工作原理及其在网络中的应用。
|
15天前
|
存储 监控 网络协议
一次读懂网络分层:应用层到物理层全解析
网络模型分为五层结构,从应用层到物理层逐层解析。应用层提供HTTP、SMTP、DNS等常见协议;传输层通过TCP和UDP确保数据可靠或高效传输;网络层利用IP和路由器实现跨网数据包路由;数据链路层通过MAC地址管理局域网设备;物理层负责比特流的物理传输。各层协同工作,使网络通信得以实现。
|
15天前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
67 1
|
1月前
|
SQL 安全 算法
网络安全之盾:漏洞防御与加密技术解析
在数字时代的浪潮中,网络安全和信息安全成为维护个人隐私和企业资产的重要防线。本文将深入探讨网络安全的薄弱环节—漏洞,并分析如何通过加密技术来加固这道防线。文章还将分享提升安全意识的重要性,以预防潜在的网络威胁,确保数据的安全与隐私。
69 2
|
2月前
|
安全 算法 网络安全
网络安全的盾牌与剑:漏洞防御与加密技术深度解析
在数字信息的海洋中,网络安全是航行者不可或缺的指南针。本文将深入探讨网络安全的两大支柱——漏洞防御和加密技术,揭示它们如何共同构筑起信息时代的安全屏障。从最新的网络攻击手段到防御策略,再到加密技术的奥秘,我们将一起揭开网络安全的神秘面纱,理解其背后的科学原理,并掌握保护个人和企业数据的关键技能。
65 3
|
2月前
|
网络协议
网络通信的基石:TCP/IP协议栈的层次结构解析
在现代网络通信中,TCP/IP协议栈是构建互联网的基础。它定义了数据如何在网络中传输,以及如何确保数据的完整性和可靠性。本文将深入探讨TCP/IP协议栈的层次结构,揭示每一层的功能和重要性。
77 5
|
2月前
|
网络协议 安全 文件存储
动态DNS(DDNS)技术在当前网络环境中日益重要,它允许使用动态IP地址的设备通过固定域名访问
动态DNS(DDNS)技术在当前网络环境中日益重要,它允许使用动态IP地址的设备通过固定域名访问,即使IP地址变化,也能通过DDNS服务保持连接。适用于家庭网络远程访问设备及企业临时或移动设备管理,提供便捷性和灵活性。示例代码展示了如何使用Python实现基本的DDNS更新。尽管存在服务可靠性和安全性挑战,DDNS仍极大提升了网络资源的利用效率。
80 6
|
2月前
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
65 3
|
2月前
|
SQL 监控 安全
网络安全的盾牌与利剑:漏洞防御与加密技术解析
在数字时代的洪流中,网络安全如同一场没有硝烟的战争。本文将深入探讨网络安全的核心议题,从网络漏洞的发现到防御策略的实施,以及加密技术的运用,揭示保护信息安全的关键所在。通过实际案例分析,我们将一窥网络攻击的手段和防御的艺术,同时提升个人与企业的安全意识,共同构筑一道坚固的数字防线。

热门文章

最新文章

推荐镜像

更多