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/

 

posted on 2025-01-20 08:55  王景迁  阅读(75)  评论(0)    收藏  举报

导航