Cilium 的 eBPF 程序并非持久化保存在内核中;它们是动态加载进内核的。
当系统重启时,内核中的 eBPF 程序会丢失,必须在系统启动时重新加载。Cilium 依赖于在启动时重新初始化 eBPF 程序和相关的 BPF maps 来恢复全部功能。
具体恢复机制包括以下几点:
- eBPF 程序的生命周期由用户态到内核态的加载过程决定,程序通过 BPF 系统调用加载,内核中对应的对象会与用户态文件描述符关联,如关闭描述符则对象被销毁,不能持久化存在内核中。
- 为了在重启后保持状态,Cilium 会利用 bpffs(BPF 文件系统,通常挂载在 /sys/fs/bpf)来“pin” eBPF 对象,延长其生命周期,但这只能保证程序在运行时不被回收,不能跨重启持久化。
- 重启后,系统会通过 Cilium agent 重新加载 eBPF 程序,重新设置 BPF maps 并附加到内核钩子,从而恢复之前的网络规则和状态。
- 系统需要确保 /sys/fs/bpf 文件系统正常挂载(通常在 systemd 环境中通过配置 bpffs 文件系统自动挂载),Cilium 才能正确利用 bpffs 来管理 eBPF 程序和 map。
简而言之,Cilium 的 eBPF 程序不在内核中持久存储,系统重启时需要通过 Cilium 组件自动重新加载和恢复工作状态。确保 bpffs 文件系统正常挂载,是恢复过程中的重要配置步骤.arxiv+2