eBPF这个次好多年了 生产用的少 但是闲聊吹水的时候,,,
缩写今天有兴趣写一下 留着复习 大家参考
一 对比eBP和istio
因为我最初听说它俩都擅长链路可观测,比较感兴趣,对比来看:
简单直接的回答:有关系,但不在同一层,是互补关系而不是竞争关系。
一句话概括:
- Istio :是服务网格,主要处理应用层(L7)的流量管理、安全、可观测性
- eBPF :是内核技术,主要优化传输层(L3/L4)的网络性能和数据路径
具体关系:
1. 传统Istio(无eBPF)
yaml
# 数据路径:Pod → iptables规则 → Envoy Sidecar → iptables规则 → 目标Pod
# 性能瓶颈:每个包都要经过多次用户态-内核态切换
2. eBPF加速的Istio
yaml
# 数据路径:Pod → eBPF程序(直接重定向) → Envoy Sidecar → eBPF程序 → 目标Pod
# 性能提升:减少iptables开销,绕过内核网络栈
3. 最新发展:Cilium Service Mesh
yaml
# 直接用eBPF实现服务网格功能,在某些场景下可以替代Istio
# 但主要还是在L3/L4层,复杂的L7策略仍需Envoy
结论:
eBPF让Istio跑得更快,但不会完全取代Istio。eBPF处理底层网络优化,Istio处理上层应用逻辑。就像赛车底盘引擎(eBPF)和驾驶控制系统(Istio)的关系。
二 eBPF的发展史
太好了!eBPF确实是近年来Linux领域最令人兴奋的技术之一。它的发展历程很有意思,是一个典型的"从小功能演变为生态系统"的故事。
eBPF的起源与发展时间线
timeline
title eBPF发展历程
section 1992-2014
BPF诞生
: 1992: BPF诞生于UNIX
用于tcpdump包过滤 : 2001: Linux 2.5引入BPF : 2011: 安卓系统使用BPF
进行网络过滤 section 2014-2015 eBPF革命开始 : 2014: Alexei Starovoitov
提交eBPF补丁 : 2015: Linux 4.1发布
首个完整eBPF支持 section 2016-2017 生态爆发 : 2016: Cilium项目成立
BCC工具集成熟 : 2017: Linux 4.10+
XDP技术成熟 section 2018-至今 全面普及 : 2018: BPF成为独立子系统
多家公司投入 : 2020+: 云原生标配
观测/网络/安全
用于tcpdump包过滤 : 2001: Linux 2.5引入BPF : 2011: 安卓系统使用BPF
进行网络过滤 section 2014-2015 eBPF革命开始 : 2014: Alexei Starovoitov
提交eBPF补丁 : 2015: Linux 4.1发布
首个完整eBPF支持 section 2016-2017 生态爆发 : 2016: Cilium项目成立
BCC工具集成熟 : 2017: Linux 4.10+
XDP技术成熟 section 2018-至今 全面普及 : 2018: BPF成为独立子系统
多家公司投入 : 2020+: 云原生标配
观测/网络/安全
eBPF的技术依赖基础
eBPF的成功不是偶然的,它建立在多个关键技术之上:
1. 即时编译 (JIT) 技术
c
// eBPF程序编译过程
源代码 → eBPF字节码 → JIT编译 → 本地机器码
- 依赖技术:LLVM、JIT编译器
- 价值:让eBPF程序以接近原生代码的速度运行
2. 验证器 (Verifier)
c
// 验证器检查示例
int ebp f_prog(struct ebpf_context *ctx) {
if (ctx->data + 8 > ctx->data_end) // 边界检查
return 0;
// ...
}
- 核心技术:静态代码分析、符号执行
- 价值:确保eBPF程序不会导致内核崩溃或死锁
3. 映射 (Maps) 基础设施
c
// eBPF Map类型示例
BPF_HASH(stats, u32, u64); // 哈希表
BPF_PERF_OUTPUT(events); // 性能事件
BPF_RINGBUF_OUTPUT(ringbuf); // 环形缓冲区
- 依赖技术:内核高效数据结构
- 价值:eBPF程序与用户空间的数据交换
4. Linux内核基础设施
- 依赖技术:kprobes、uprobes、tracepoints
- 价值:提供程序挂载点,实现全栈可观测性
eBPF的观测能力详解
eBPF的观测能力确实是NB,它几乎可以从任何地方安全地收集数据:
1. 内核层面观测
c
// 跟踪所有TCP连接建立
SEC("kprobe/tcp_connect")
int trace_tcp_connect(struct pt_regs *ctx) {
struct sock *sk = (struct sock *)PT_REGS_PARM1(ctx);
// 记录连接信息到Map
return 0;
}
2. 应用层面观测
c
// 跟踪HTTP请求
SEC("uprobe//usr/bin/nginx:ngx_http_process_request")
int trace_http_request(struct pt_regs *ctx) {
char method[32];
bpf_probe_read_user(method, sizeof(method), (void *)method_ptr);
// 记录HTTP方法到Map
return 0;
}
3. 系统调用层面
c
// 跟踪文件打开
SEC("tracepoint/syscalls/sys_enter_openat")
int trace_openat(struct trace_event_raw_sys_enter *args) {
char filename[256];
bpf_probe_read_user(filename, sizeof(filename), (void *)args->args[1]);
// 记录文件名
return 0;
}
为什么eBPF现在才爆发?
技术成熟度时间表:
年份 | Linux版本 | 关键特性 | 影响 |
---|---|---|---|
2014 | 3.18 | 初始eBPF支持 | 学术研究 |
2015 | 4.1 | 完整eBPF验证器 | 生产可用 |
2016 | 4.8 | XDP (Express Data Path) | 高性能网络 |
2017 | 4.10 | cgroup BPF支持 | 容器网络 |
2018 | 4.16 | BPF Type Format (BTF) | 更好的工具链 |
2019 | 5.0+ | 更多程序类型和helper | 生态爆发 |
市场需求驱动:
- 云原生复杂度:微服务、容器化需要更好的观测工具
- 性能要求:传统工具开销太大
- 安全需求:需要内核级别的安全监控
eBPF vs 传统观测工具
传统工具链:
bash
# 系统性能分析的传统方式
$ strace -p 1234 # 高开销,影响性能
$ perf record -g command # 采样数据,不精确
$ tcpdump -i eth0 port 80 # 复制所有包,CPU密集型
eBPF现代工具链:
bash
# 使用BCC/eBPF工具
$ opensnoop-bpfcc # 只记录关心的文件打开
$ execsnoop-bpfcc # 跟踪进程执行
$ tcplife-bpfcc # TCP连接生命周期
$ runqlat-bpfcc # 调度器延迟
参考案例:eBPF观测K8s网络
c
// 简化的eBPF程序,观测K8s Pod网络
SEC("kprobe/ip_rcv")
int kprobe_ip_rcv(struct pt_regs *ctx) {
struct sk_buff *skb = (struct sk_buff *)PT_REGS_PARM1(ctx);
struct iphdr *ip = ip_hdr(skb);
// 获取Pod信息
u32 src_ip = ip->saddr;
u32 dst_ip = ip->daddr;
// 从eBPF Map中查询IP到Pod的映射
struct pod_info *src_pod = bpf_map_lookup_elem(&ip_to_pod, &src_ip);
struct pod_info *dst_pod = bpf_map_lookup_elem(&ip_to_pod, &dst_ip);
if (src_pod && dst_pod) {
// 记录Pod到Pod的流量
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU,
src_pod, sizeof(*src_pod));
}
return 0;
}
总结
eBPF的流行是多重技术积累+市场需求的结果:
- 技术基础:JIT、验证器、Map基础设施成熟
- 时机成熟:云原生复杂度催生新观测需求
- 生态建设:大厂投入,工具链完善
- 性能优势:相比传统工具数量级的性能提升
eBPF不是凭空出现的,而是站在巨人肩膀上的产物。
把原本只有内核开发者才能做的事情,安全地开放给了普通开发者,NB!
我终于理解为什么Cilium能"脱离"iptables了吧?eBPF给了它这个底气。。。
推荐大家开始落地踩坑 K8S Cilium网络模式。。。哈哈