POD seccomp错误之bpf_jit_limit问题

背景:

  pod在启动的时候报pod error loading seccomp filter into kernel error loading seccomp filter errno 524

问题的初步定位及处理

环境信息:
系统:Kylin v10 SP2

内核(宿主机、container):4.19.90-25.21

K8S: v1.20.15

1、据报错信息查询到这个是一个seccomp内存泄露的问题

2、查看宿主机实际bpf_jit_limit内存分配使用

#cat /proc/vmallocinfo | grep bpf_jit | awk '{s+=$2} END {print s}'
67239936(64M)


3、查看宿主机bpf_jit_limit限制大小

#sysctl net.core.bpf_jit_limit 
33554432(32M)


4、 问题原因

  此时问题原因已呈现,实际bpf_jit_limit使用大于bpf_jit_limit限制,导致了pod创建(pod删除后重建,container级别删除重建)失败


5、bpf_jit_limit配置最佳实践

lxc 
net.core.bpf_jit_limit = 300000000
<think> 嗯,用户这次的问题是关于解析两条BPF语句的含义。BPF是网络编程领域比较底层的技术,用户能提出具体指令的解析需求,说明应该有一定网络编程基础。让我注意到用户特别强调“参考站内引用”,但当前对话中并没有历史引用内容,可能是误用了模板。 第一条语句BPF_STMT(BPF_LD + BPF_B + BPF_ABS, 0xFFFFF004)需要拆解: - BPF_LD表示加载操作,BPF_B指定操作字节长度,BPF_ABS说明是绝对偏移寻址 - 0xFFFFF004这个地址很特殊,在Linux内核中对应skb->len的存储位置 - 组合起来就是读取数据包长度到累加器 第二条跳转指令BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K,4,0,12): - BPF_JMP是跳转类型,BPF_JEQ表示相等判断,BPF_K说明比较常量 - 参数4是要比较的值,0和12分别对应真假跳转的偏移量 - 本质是在判断数据包长度是否等于4字节 用户可能是开发网络过滤器时遇到了问题。这两条指令组合起来常用于检测特定长度的控制报文,比如ICMP或ARP。考虑到BPF指令的底层特性,用户或许需要更深入的解释偏移量计算原理。 要补充说明的是,0xFFFFF004属于内核内存布局的保留区域,直接引用需要特别注意平台兼容性。12条指令的偏移量暗示了后续有复杂处理逻辑,典型的应用场景可能是识别802.1Q标签或特殊控制帧。 最后生成的问题需要覆盖指令操作细节和应用场景,特别是那个魔数地址的官方文档指引很重要,可以节省用户查阅内核源码的时间。 </think> BPF语句是伯克利包过滤器(Berkeley Packet Filter)的底层指令,用于网络数据包过滤。下面逐条解析这两条语句: ### 1. `BPF_STMT(BPF_LD + BPF_B + BPF_ABS, 0xFFFFF004)` ```c /* 指令结构 */ BPF_STMT(操作码, 操作数) ``` - **操作码分解**: - `BPF_LD`:加载操作(Load) - `BPF_B`:操作字节长度(Byte,1字节) - `BPF_ABS`:绝对偏移寻址(从数据包头部开始计算偏移) - **操作数**:`0xFFFFF004` - 在Linux内核中,该地址是`skb->len`的存储位置(数据包长度值) - **语义**: > 从数据包内存的 **绝对偏移量 `0xFFFFF004` 处加载1字节数据** 到BPF累加器中。 > 实际用途:**获取当前网络数据包的长度值**(通过内核预定义的偏移量访问`skb->len`)[^1]。 --- ### 2. `BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 4, 0, 12)` ```c /* 指令结构 */ BPF_JUMP(操作码, 比较值, 真跳转, 假跳转) ``` - **操作码分解**: - `BPF_JMP`:跳转操作(条件判断) - `BPF_JEQ`:等于比较(Jump if Equal) - `BPF_K`:使用常量作为比较对象(Constant) - **参数**: - `4`:比较的目标值(常量) - `0`:条件为真时跳过的指令数(0表示下一条) - `12`:条件为假时跳过的指令数 - **语义**: > 比较 **BPF累加器的值** 是否等于常量 `4`: > - 若相等,则 **跳过0条指令**(即继续执行下一条指令) > - 若不相等,则 **跳过12条指令**(大幅跳转,通常意味着丢弃包或结束处理)[^2]。 > 实际用途:**检测数据包长度是否为4字节**(常见于控制报文如ICMP、ARP等)。 --- ### 组合逻辑分析 两条指令联合作用: 1. 第一条加载数据包长度到累加器 2. 第二条判断长度是否等于4: ```mermaid graph LR A[长度=4?] -->|是| B[继续后续过滤] A -->|否| C[跳过12条指令→丢弃包] ``` 典型场景:过滤非4字节的数据包(如丢弃无效控制报文)。 --- ### 附录:BPF关键常量含义 | 常量 | 值 | 含义 | |-------------|-----|--------------------------| | `BPF_LD` | 0x00 | 加载到累加器 | | `BPF_B` | 0x10 | 操作1字节(Byte) | | `BPF_ABS` | 0x20 | 绝对偏移寻址 | | `BPF_JMP` | 0x05 | 跳转指令 | | `BPF_JEQ` | 0x10 | 等于比较 | | `BPF_K` | 0x00 | 使用常量(非内存数据) |
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值