A protocol-independent container network observability analysis system based on eBPF

使用eBPF的network observability分析系统。

通过对用户应用L7/L4层基于eBPF的网络协议交互信息的非侵入性采集。 在不修改任何内核和应用代码的情况下,可以实现每秒超过10M的数据采集,而对系统应用的影响则小于1%。 它还利用机器学习方法分析和诊断应用网络性能和问题,分析网络性能瓶颈,定位不同应用的具体实例信息,实现独立于协议的网络性能问题定位和分析。

贡献

  • 细粒度的监测数据:实现基于eBPF的几乎所有内核操作的非常细粒度的容器网络指标。
  • 非侵入式设计:不需要修改任何内核和应用代码,对用户应用透明。
  • 可扩展性和低开销:使用eBPF程序可以动态更新,以监测所需的事件或系统调用,而系统具有低开销。
  • 准确和详细的性能分析:定位Pod实例,并基于细粒度数据对事件相关的背景进行关联分析。

Design

设计主要分成三个部分:数据收集、汇总处理和智能分析。

Critical data collection

(一些eBPF老生常谈的介绍) 在本文中,我们使用eBPF技术从集群中的容器网络中收集数据,这些数据对应用程序完全透明,不需要对应用程序代码进行任何修改。 eBPF是一个运行在内核中的虚拟机,可以将几乎所有的系统调用转换成事件,通过BPF系统调用与内核交互,如图1所示,可以在用户状态下实现。 eBPF程序可以在指定的系统调用发生时执行,关于该系统调用发生的关键信息通过perf buffer或Maps传回给用户态。 目前在Linux内核中,eBPF允许编写静态程序注入访问点,如tracepoint、kprobe、uprobe等,这可以在静态和动态跟踪上提供非常强的可扩展性。 如图2所示,与传统的多层网络堆栈上的监控相比,这种机制带来了更强的可观察性。 因为每个系统调用都是基于线程级的数据,可以向上汇总到容器、pod甚至服务级别。这些特点使得非侵入性和增强的可观察性成为可能。

(真正的design) 如图3所示,整个框架运行在Kubernetes集群中。 数据收集模块以daemonset的形式部署在Kubernetes集群的每个工作节点上,用eBPF控制器来设置配置信息和eBPF过滤规则。 它由控制器控制,更新eBPF配置信息。 eBPF程序存储在eBPF Config中,支持JIT功能,可以动态更新到内核。 eBPF是Kubernetes集群中最小的运行单元,pod中可以包含多个容器和进程。 在本文中,三种类型的eBPF程序被用来实现容器网络数据收集:socketfilter、kprobe/kretprobe和tracepoint。 在初始协议匹配和字段过滤后,数据包被存储在eBPF map中,然后根据不同的协议进行初始聚合的预处理。

为了避免频繁地从内核空间复制数据,本文通过一个perf buffer将eBPF map中聚合的流量信息输出到用户状态的Flowlog。 Flowlog将调用kubernetes apiserver中的接口,进一步匹配聚合的流量pod和其他拓扑信息. 最后logtail daemonset收集flowlog来访问阿里巴巴SLS服务logstore分析。

Data aggregation and analysis

基于eBPF程序在集群中收集到的网络流量信息,可以进一步汇总成如下表1所示的数据。主要是tcp、udp、http和dns的一些窄腰。 除了表1中的指标外,它还可以收集网络数据的上下文和其他基本信息。 如(pid、comm、ip_version、src_ip、src_port、dst_ip、dst_port、src_pod、src_ns、dst_pod、dst_ns)。

Linux内核为注入eBPF代码提供了许多跟踪点。 对于每个协议,内核都会选择一个跟踪点函数,比如当一个实例启动TCP连接时,选择tcp_v4_connect。 当一个实例启动TCP连接时,选择dst_ns。

使用eBPF提供的helpler函数bpf_ktime_get_ns()来记录纳秒级的时间戳。 当TCP连接状态发生变化时,我们可以使用inet_sock_set_state()来记录状态变化前后和时间延迟。 UDP协议相关的事件也被类似地跟踪和收集。对于HTTP和DNS协议,套接字过滤器被用来分析有效载荷和其他内容。表1给出了每个协议指标的描述及其细节。

数据分析部分是基于规则和人工标注的网络异常数据,然后在阿里云SLS日志聚合的基础上查询相应的周期性数据。 并根据不同的容器网络协议时序数据分类,进一步训练异常数据的相关模型来检测异常并定位具体的pod位置和相关的上下文信息。