1 封包技术
VXLAN
将二层以太网帧封装到UDP包中传输
https://zhuanlan.zhihu.com/p/662511542
2 网卡虚拟化技术
https://liuhangbin.netlify.app/post/virtual-ifaces/
bridge
绑定到同一个bridge设备上的其他网络设备实现流量的共享
bonding
将多个网络设备bond成一个的技术, 用于热备或者load balancing
vlan
将一个eth设备分裂出多个子设备. 子设备通过在网络包中添加vlan id来区分
vxlan
vlan仅支持最多4096个子网, vxlan支持2^24个. vxlan本身也是一种隧道技术, 通过将二层网络包封装在udp包中实现传输
macvlan
将一个eth设备虚拟化出多个子设备, 每个设备拥有自己的mac地址
ipvlan
将一个eth设备虚拟化出多个子设备, 每个设备拥有自己的ip地址, 但是mac地址相同
veth
每次创建会创建出成对的两个设备, 发送到其中一个设备的流量会被另一个设备收到
3 CNI
cilium
pod间通信
- app经过pod内的eth0发送流量
- 经由veth pair, 流量会进入宿主机上的对端设备
- 在宿主机上的对端设备, 挂在了from-container的ebpf程序, 在这个程序做了几件事;
- load balancing: 如果目的ip是一个service, 此处会选择一个后端pod的ip然后替换目的ip(DNAT)
- 内核查询路由表决定怎么发送, 以测试机器为例:
其中172.16.0.0是容器网段, 每个node都分配了一段网段, 路由表维护了不 同网段应该发送到哪个node这一信息. 测试机使用的是IPIP协议, 因此会在 IP包的外面在包一层IP包, 指定目的IP为目的pod所在的node的ip, 然后经过underlay网络发送
Destination Gateway Genmask Flags Metric Ref Use Iface default 10.39.1.1 0.0.0.0 UG 0 0 0 bond1 10.0.0.0 10.39.1.1 255.0.0.0 UG 0 0 0 bond1 10.39.1.0 0.0.0.0 255.255.255.128 U 0 0 0 bond1 link-local 0.0.0.0 255.255.0.0 U 1004 0 0 bond1 172.16.0.0 tcs-10-39-1-6 255.255.255.0 UG 0 0 0 cilium.ipip 172.16.1.0 tcs-10-39-1-7 255.255.255.0 UG 0 0 0 cilium.ipip 172.16.2.0 172.16.2.1 255.255.255.0 UG 0 0 0 cilium_host 172.16.2.1 0.0.0.0 255.255.255.255 UH 0 0 0 cilium_host 172.16.3.0 10.28.0.37 255.255.255.0 UG 0 0 0 cilium.ipip 172.16.4.0 10.28.2.33 255.255.255.0 UG 0 0 0 cilium.ipip 172.16.5.0 10.28.0.36 255.255.255.0 UG 0 0 0 cilium.ipip
- 这篇博客介绍了另一种网络模式, 宿主机不维护网段与node的关系, 而是将 将流量直接转发给网关, 依赖BPG协议让网关知道发送到POD IP的流量包应该 转发到哪个node上
4 blogs
https://www.zentao.pm/blog/kubernetes-network-model-1379.html https://arthurchiao.art/blog/cilium-life-of-a-packet-pod-to-service/: cililum如何实现跨node的pod间通信(BGP) https://www.koenli.com/fcdddb4a.html: cililum如何实现跨node的pod间通信(VXLAN)