导语:eBPF 技术的出现,使得内核的资源监控更加的便捷、高效,容器化监控也更加适用于云原生的场景。基于 eBPF 实现的可观测性,可以无需修改内核源码或者加载内核模块,安全高效的扩展内核功能,很好的解决了上述问题。本文,将从网络的角度介绍如何基于 eBPF,实现容器级别的 TCP 连接监控。
一、技术背景
OpenCloudOS 适用于大规模容器集群服务器场景,为了提高服务器的资源利用率,降低业务及客户的服务器成本,提出了离、在线业务混合部署的资源隔离方案。资源隔离 QoS(Quality of Service,服务质量)方案主要包括 CPU、I/O、内存和网络四大模块。
针对这四种服务器资源进行 QoS,能够将用户的在线、离线业务部署到同一台服务器上,在保证在线业务服务质量的同时,有效的提升了资源利用率,助力降本增效,契合健康可持续的发展理念。随着 OpenCloudOS 中大规模离、在线服务混合部署的应用,如何更好的实时监控、反馈服务状况成为了业务运维人员亟需解决的问题。 基于 Linux 内核实现的可观测性,具备性能好、灵活性高等优点。然而,基于内核的实现通常是比较困难和繁琐的。在传统的实现方式中,开发人员需要修改内核源代码重新编译或者加载内核模块来实现性能的观测,可能会应对复杂难以调试的情况,使得性能观测变得异常棘手。像基于 kprobe、tracepoint、perf events 等技术的 ftrace、perf 工具,通过在内核函数中打桩,把数据从内核态搬到用户态进行处理。诸如上述实现可观测性的方式带来的弊端也很明显,无保护的内核模块有极大的安全隐患,同时实现的成本较高,不能够应对多变的场景。eBPF 技术的出现,使得内核的资源监控更加的便捷、高效,容器化监控也更加适用于云原生的场景。基于 eBPF 实现的可观测性,可以无需修改内核源码或者加载内核模块,安全高效的扩展内核功能,很好的解决了上述问题。本文,将从网络的角度介绍如何基于 eBPF,实现容器级别的 TCP 连接监控。
二、eBPF 介绍
eBPF 是一种在 Linux 内核运行沙箱程序的技术,在无需修改内核源码或者加载内核模块的情况下安全高效地扩展内核功能,可以看作是在内核的一些 hook point 上执行用户代码的一个虚拟机。
用户编写的代码被 clang 编译成字节码后加载到 linux 内核,经过 verifier 引擎保证字节码的安全性,然后通过内嵌的 JIT 编译器将字节码转成本地机器码。eBPF 是由事件触发的,当事件到来时,则在内核空间执行用户态 BPF 程序,改变内核的处理流程。
eBPF 在引入内核后,逐渐演进成为一个通用执行引擎,可基于此开发性能分析工具,网络过滤器等。eBPF 程序架构强调安全性和稳定性,看上去像内核模块,但却并不需要重新编译内核。
在 eBPF 程序的运行过程中,并不会因为程序问题而造成系统崩溃。由于其安全、高效、可编程,以及在速度和性能方面的优势,eBPF 在内核观测、追踪监控、应用性能调优、流量控制、性能统计、安全等领域发挥了重要的作用。
三、eBPF 工具在实际应用中的问题
随着离、在线混部功能的大规模部署使用,实际应用中更多的业务是基于容器来进行资源的隔离与调度。基于整机的系统级别的网络监控、追踪工具无法实现容器级别的控制,并不适用于云原生的容器场景。
如何实现更加精细的 cgroup、进程级别的资源监控,帮助管理员更好的了解系统的资源使用情况,已经成为广泛关注的问题,因此监控工具的容器化实现尤为重要。 OpenCloudOS 将 cgroup 层级的子系统状态 ID 传输到用户空间,建立 cgroup 子系统路径和 ID 之间的联系。同时适配隐藏了 cgroup v1 和 v2 结构差异,使内核仅收集所需的子系统中特定 cgroup 的网络连接状况信息。基于此,分别实现了 BCC 和 libbpf 网络工具的容器化监控。
资料直通车:Linux内核源码技术学习路线+视频教程内核源码
学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈
四、网络监控工具示例
以下示例实验环境为:
发行版:OC 8.6
内核:TK4-5.4
工具:BCC 网络监控工具
1. tcpconnect
基于 cgroup 监控 tcp 网络连接,显示源IP、目的IP、目的端口等状态信息。
基于 cgroup 统计一段时间内的 tcp 连接数量。
2. tcpconnlat
基于 cgroup 监控 tcp 建立连接的时间,显示连接的状态信息。
3. tcprtt
基于 cgroup 统计一段时间内 tcp rtt 的分布,显示连接的状态信息。
4. tcptrace
基于过滤条件监控 tcp 网络连接,跟踪 skb 报文在内核中的生命周期,输出每个报文在协议栈中各个点的时间延迟、地址、所在 CPU、网口等信息。
5. tcplife
基于 cgroup 跟踪 tcp 连接的生命周期,显示连接的存活时间等统计信息。
6. tcpdrop
基于 cgroup 监控 tcp 网络连接,追踪内核丢弃的数据包,显示数据包地址、端口和调用栈等信息。
参考链接:
BPF Documentation:
https://www.infradead.org/~mchehab/kernel_docs/bpf/index.html
BPF Portability and CO-RE:
https://facebookmicrosites.github.io/bpf/blog/2020/02/19/bpf-portability-and-co-re.html
Andrii Nakryiko's Blog:
https://nakryiko.com/