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 网络工具的容器化监控。
四、网络监控工具示例
以下示例试验环境为:
发行版: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/
如果在应用 eBPF 工具中或 OpenCloudOS 中遇到技术问题,可扫描下方二维码,退出社区交换群,获取技术支持,交换应用体验。