ebpf code skill

本文介绍编写 ebpf 程序时可能遇到的坑或注意事项,持续更新中
  1. 最大的原则:不要一次性写太多代码!!!

    每次写少量代码后都需要编译测试,千万不要一次性写太多逻辑。否则一旦代码有问题,导致无法load到内核,非常难定位具体错在哪。ebpf的报错信息实在太坑爹,这也是为什么会有本文的原因

阅读全文

ebpf/sockhash 内核bug定位分析

背景

最近在尝试使用bpf来优化istio场景下本地sidecar和app之间的数据传输,使用了ebpf/sockhash的特性。简单来讲,如果一台机器上有两个进程的sock存在相互收发数据的情况,我们就可以利用ebpf/sockhash将一个socket需要发送的数据跳过本机的底层tcp/ip协议栈直接交给本机的目的socket,缩短数据在内核的处理路径。

阅读全文

linux 内核源码修改编译与patch提交

最近在写bpf/sockmap的时候发现一个sockhash的内核bug,经过一系列定位后终于找到了问题代码并修复,最后将修复的patch提交到了社区。这是第一次向linux kernel提交代码,在这里记录一下~

linux内核编译

首先需要准备一下编译环境

阅读全文

ebpf intro

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。

阅读全文

k8s service ip problem

最近在部署山东电力gaiastack环境,现场部署的小伙伴突然遇到紧急问题,发现在容器里面无法通过kubernetes这个service来访问kube-apiserver,导致我们的云盘无法提供正常服务。

gaiastack是什么?gaiastack是我们组开发的企业级kubernetes容器云管理平台,目前已在公司内外树立了一批标杆客户

阅读全文

k8s floatingip evolution

在我们内部的k8s系统的网络模式支持上,我们实现了多种网络模式的支持,最主要的就是overlay和floatingip的支持。
在k8s系统中实现floatingip网络模式的方案,最初我们采用了bridge+veth的模式,在跑容器的主机(物理机或虚拟机)上创建一个linux bridge,将原主机的网卡桥接到这个bridge。每创建一个pod,都创建一对veth设备,一端连接bridge,一端扔进容器里达到容器与外界2层可达的效果。实现模型如下图所示:

阅读全文

sriov getting start

前言

最近在调研SR-IOV的使用,准备作为CNI插件用在kubernetes的Pod网络上。这篇文章是对SRIOV基础操作的介绍,通过介绍可以了解SRIOV的使用。

阅读全文

ipvs attempt

前序

k8s社区最近提了一个issue, 说的是huawei使用ipvs代替kube-proxy中的iptables模式作为service的负载均衡。根据我们组实际的情况,对ipvs整合k8s方案进行了一些尝试。

阅读全文

iptables quick start

简介

linux内置了一个强大的防火墙模块,称为iptables。用户通过在用户态操作iptables规则,可以使流量在内核态进行规则的匹配过滤。

Man手册中关于iptables的介绍为用于包过滤和NAT的系统工具。

阅读全文

calico getting start

简介

Calico是一个纯3层虚拟网络,可以为夸主机的容器/虚拟机等提供网络访问,同时支持IPv4和IPv6。并且可以根据策略提供访问控制能力。

阅读全文