cilium的eBPF网络特性解析
- cilium
- 2025-07-26
- 59热度
- 0评论
在 Cilium 的 eBPF 数据平面中,bpf.masquerade
、bpf.hostRouting
、bpf_redirect_neigh()
和 bpf_redirect_peer()
是紧密相关的核心网络特性,它们共同构建了高效、可编程的网络转发路径。
以下是它们的详细解析和相互关系:
一、数据流程
二、核心概念解析
bpf.masquerade
(IP 伪装)
-
作用:实现源地址转换(SNAT),将 Pod 的私有 IP 转换为节点的公有 IP
-
场景:Pod 访问集群外部资源时
-
优势:替代 iptables MASQUERADE 规则,性能提升 5-10 倍
bpf.hostRouting
(主机路由)
-
作用:绕过内核网络栈,直接在 eBPF 层进行路由决策
-
场景: Pod 与其他node节点之间的通信
-
性能优势:
-
减少内核上下文切换
-
跳过 Netfilter/iptables 处理链
-
bpf_redirect_neigh()
(跨节点重定向)
-
函数原型:
int bpf_redirect_neigh(int ifindex, struct bpf_redir_neigh *params)
-
作用:重定向数据包到指定接口,自动处理 L2/L3 邻居信息
-
工作流程:
-
查询目标 IP 的 MAC 地址
-
维护邻居表缓,存若缓存不存在,触发异步 ARP 请求
-
填充以太网帧头
-
直接发送到目标接口,支持跨节点通信
-
bpf_redirect_peer()
(同节点重定向)
-
函数原型:
int bpf_redirect_peer(int ifindex, u64 flags)
-
作用:将数据包重定向到另一网络命名空间的接口
-
关键特性:
-
直接进入目标命名空间(跳过主机 netns)
-
零拷贝传输
-
超低延迟(< 100ns)
-
三、工作流程
场景 1:同节点 Pod 间通信
-
流量到达 eBPF 程序
-
bpf.hostRouting
识别目标为同节点 Pod -
调用
bpf_redirect_peer()
直通目标 Podbpf_redirect_peer(target_pod_ifindex, 0);
-
完全跳过主机网络栈
- 流程图:
场景 2:跨节点 Pod 通信
-
bpf.hostRouting
识别目标为远程 Pod -
确定目标节点 IP 和 MAC
-
调用
bpf_redirect_neigh()
:struct bpf_redir_neigh params = { .nh_family = AF_INET, .ipv4_nh = remote_node_ip }; bpf_redirect_neigh(egress_ifindex, ¶ms);
-
自动处理 ARP/NDP 解析
- 流程图:
场景 3:Pod 访问互联网
-
bpf.hostRouting
识别外部流量 -
bpf.masquerade
执行 SNAT:iph->saddr = node_ip; recalc_csum(iph);
-
调用
bpf_redirect_neigh()
到网关 - 流程图:
四、关系总结
特性 | 依赖关系 | 协同作用 | 网络层级 |
---|---|---|---|
bpf.hostRouting | 基础路由决策 | 调度其他组件 | L3 |
bpf_redirect_peer() | 依赖 hostRouting | 同节点加速 | L2 |
bpf_redirect_neigh() | 依赖 hostRouting | 跨节点转发 | L2/L3 |
bpf.masquerade | 可与两者协同 | 出口 NAT | L3/L4 |
四者共同构建了 Cilium eBPF 数据平面的核心:
-
bpf.hostRouting
作为决策引擎,确定流量路径 -
bpf_redirect_peer
实现节点内超高速通信 -
bpf_redirect_neigh
处理跨节点智能路由 -
bpf.masquerade
提供高效的出口网络地址转换