ebpf code skill
本文介绍编写 ebpf 程序时可能遇到的坑或注意事项,持续更新中
最大的原则:不要一次性写太多代码!!!
每次写少量代码后都需要编译测试,千万不要一次性写太多逻辑。否则一旦代码有问题,导致无法load到内核,非常难定位具体错在哪。ebpf的报错信息实在太坑爹,这也是为什么会有本文的原因
本文介绍编写 ebpf 程序时可能遇到的坑或注意事项,持续更新中
最大的原则:不要一次性写太多代码!!!
每次写少量代码后都需要编译测试,千万不要一次性写太多逻辑。否则一旦代码有问题,导致无法load到内核,非常难定位具体错在哪。ebpf的报错信息实在太坑爹,这也是为什么会有本文的原因
eBPF(extended BPF)可以看作是可以高效且安全的在内核的一些hook point上执行用户代码的一个虚拟机,用户编写的代码被编译成字节码后加载到linux内核,内核内嵌了一个JIT将字节码转成native code后由事件触发形式执行BPF代码。eBPF由BPF发展而来,BPF全称Berkeley Packet Filter,当时主要是为了高效的过滤数据包而设计的,其历史可以追溯到1992年的论文The BSD Packet Filter: A New Architecture for User-level Packet Capture中。现在大家说到的BPF实际上是e(extended)BPF,相比于之前的BPF,eBPF是RISC指令集,有了更丰富的指令,11个64位的寄存器。开发者可以使用C语言写BPF程序,然后使用llvm+clang编译成bpf格式的obj file。然后通过bpf()系统调用加载在内核中hook point。下文中提到的BPF如果没有明确说明,都是指代eBPF。
最近在部署山东电力gaiastack环境,现场部署的小伙伴突然遇到紧急问题,发现在容器里面无法通过kubernetes这个service来访问kube-apiserver,导致我们的云盘无法提供正常服务。
gaiastack是什么?gaiastack是我们组开发的企业级kubernetes容器云管理平台,目前已在公司内外树立了一批标杆客户
在我们内部的k8s系统的网络模式支持上,我们实现了多种网络模式的支持,最主要的就是overlay和floatingip的支持。
在k8s系统中实现floatingip网络模式的方案,最初我们采用了bridge+veth的模式,在跑容器的主机(物理机或虚拟机)上创建一个linux bridge,将原主机的网卡桥接到这个bridge。每创建一个pod,都创建一对veth设备,一端连接bridge,一端扔进容器里达到容器与外界2层可达的效果。实现模型如下图所示:
k8s社区最近提了一个issue, 说的是huawei使用ipvs代替kube-proxy中的iptables模式作为service的负载均衡。根据我们组实际的情况,对ipvs整合k8s方案进行了一些尝试。