cilium 基本流量转发
cilium v1.15.1
容器网络开销
容器网卡转发报文到容器进程,等价于主机网卡转发报文到主机进程。除此之外,主机网卡转发报文到容器网卡是多余的开销。
eBPF主机路由
eBPF主机路由基于网口之间直接跳转,可以绕过主机命名空间中所有的iptables和上层协议栈,穿过需要上下文切换来传输报文的veth对,减少容器网络开销。
函数名 |
作用 |
bpf_redirect |
报文直接转到指定网口的入向或者出向。 |
bpf_redirect_peer |
报文直接转到指定网口的对端的入向,例如veth对。 |
bpf_redirect_neigh |
查询邻居表并填写下一跳mac后,报文直接转到指定网口。 |
分配IP
cilium agent基于CiliumNode cr中spec.ipam.podCIDRs小子网分配ip。
pkg/ipam/service/allocator/bitmap.go
AllocateNext方法
支持随机分配NewAllocationMap(默认,用当前时间生成随机数)和连续分配NewContiguousAllocationMap这2种分配策略。
无论是随机分配,还是顺序分配,count变量表示已分配的ip数量,max变量表示可分配的ip总量。针对随机分配场景,基于最大是max的生成的随机数,最多遍历max次,随机数+当前遍历值的和对应位未占用时,表示可分配;针对顺序分配场景,没有记录上次分配ip位置,最多遍历max次,当前遍历值对应位未占用时,表示可分配。
场景1:跨节点pod到pod
容器网卡->容器网卡对端lxcXXX->cilium_vxlan->主机网口eth0->对端主机网口eth0->cilium_vxlan->容器网卡对端lxcXXX->容器网卡
容器网卡对端lxcXXX tc_ingress实现在bpf/bpf_lxc.c,cil_from_container函数完成容器网卡源ip访问service clusterIP dnat转换和arp代答。
cilium_vxlan tc_egress/tc_ingress实现在bpf/bpf_overlay.c,cil_to_overlay函数通知内核封装vxlan,cil_from_overlay函数通知内核解封装vxlan。
场景2:同节点主机到容器
根据路由走到cilium_host,tc_egress由bpf_host.c中cil_from_host函数实现,主机网络访问service clusterIP走kube-proxy。
场景3:同节点容器到容器
直接在veth口之间完成转发。
参考资料
https://kubesphere.io/zh/blogs/cilium-cni-benchmark/
https://docs.ebpf.io/linux/helper-function/bpf_redirect_peer/
https://docs.ebpf.io/linux/helper-function/bpf_redirect_neigh/