eBPF 容器持久化map到宿主机上
问题现象
k8s上启动pod后,使用主机网络的容器,加载eBPF程序到网口上,持久化map只能保存在容器文件系统/sys/fs/bpf中。容器复位后,新容器与原来eBPF程序使用的不是同一个map。
问题分析
新容器使用新的文件系统,无法找回原来的/sys/fs/bpf挂载点,需要持久化到宿主机上。
k8s挂载传播,实现了共享卷挂载,即在宿主机或者容器挂载目录中再mount别的挂载。
mountPropagation取值 |
含义 |
None |
默认,不传播挂载,只是绑定挂载。 |
HostToContainer |
宿主机上挂载点继续mount,容器可见。 |
Bidirectional |
容器需要开启特权。 容器上挂载点继续mount,宿主机可见。 |
cilium的实现
宿主机上/sys/fs/bpf挂载点只加载一次bpf文件系统,保存bpf map文件。
initContainer中执行mount | grep "/sys/fs/bpf type bpf" || mount -t bpf bpf /sys/fs/bpf。
解决问题
业务容器中执行mount | grep "/sys/fs/bpf type bpf" || mount -t bpf bpf /sys/fs/bpf。
containers:
- name: xxx
image: xxx
securityContext:
privileged: true
volumeMounts:
- name: test
mountPath: /sys/fs/bpf
mountPropagation: Bidirectional
volumes:
- name: test
hostPath:
path: /sys/fs/bpf