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

 

posted on 2024-07-11 09:28  王景迁  阅读(21)  评论(0编辑  收藏  举报

导航