https://mp.weixin.qq.com/s/fTCodF6oHhNdFtFDyt_mbw

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e7a2621d-d069-4347-8c77-59a895f9632f/640

本文将展示如何利用 Apache SkyWalking[1] 与 eBPF[2],使服务网格下的网络故障排除更加容易。

Apache SkyWalking 是一个分布式系统的应用性能监控工具。它观察服务网格中的指标、日志、痕迹和事件,并使用这些数据来生成 pod 和服务的依赖图。这个依赖关系图可以帮助你快速系统,尤其是在出现问题的时候。

然而,在排除 SkyWalking 服务拓扑中的网络问题时,确定错误的实际位置有时候并不容易。造成这种困难的原因有两个:

获取 Envoy-to-service 和传输层通信的指标,可以更容易诊断服务问题。为此,SkyWalking 需要收集和分析 Kubernetes pod 内进程之间的传输层指标 —— 这项任务很适合 eBPF。我们调查了为此目的使用 eBPF 的情况,并在下面介绍了我们的结果和演示。

用 eBPF 监控 Kubernetes 网络

eBPF 起源于 Extended Berkeley Packet Filter,是一种通用的机制,可以在 Linux 内核中注入和运行自己的代码,是监测 Kubernetes Pod 中网络流量的优秀工具。在接下来的几节中,我们将概述如何使用 eBPF 进行网络监控,作为介绍 Skywalking Rover[4] 的背景,这是一个由 eBPF 驱动的指标收集器和分析器,用于诊断 CPU 和网络性能。

应用程序和网络如何相互作用

应用程序和网络之间的互动一般可分为以下步骤,从较高的抽象层次到较低的抽象层次:

    1. 用户代码:应用程序代码使用应用程序堆栈中的高级网络库,在网络上交换数据,如发送和接收 HTTP 请求。
    1. 网络库:当网络库收到网络请求时,它与语言 API 进行交互以发送网络数据。
    1. 语言 API:每种语言都提供了一个操作网络、系统等的 API。当收到一个请求时,它与系统的 API 进行交互。在 Linux 中,这个 API 被称为系统调用(syscalls)。
    1. Linux API:当 Linux 内核通过 API 收到请求时,它与套接字进行通信以发送数据,这通常更接近于 OSI 第四层协议,如 TCP、UDP 等。
    1. Socket Ops:向 / 从网卡发送或接收数据。