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上
flannel
Flannel在每个集群节点上运行一个flanneld的代理守护服务,为每个集群节点 (HOST)分配一个子网(SUBNET),同时为节点上的容器组(POD)分配IP,在 整个集群节点间构建一个虚拟的网络,实现集群内部跨节点通信。
Flannel的数据包在集群节点间转发是由backend实现的,目前,已经支持核心官方推荐的模 式有UDP、VXLAN、HOST-GW. 主流使用vxlan
当使用默认配置安装Flannel时,会为每个节点分配一个24位子网,并在每个节 点上创建两张虚机网卡cni0和flannel.1:其中cni0是一个网桥设备,节点上所 有的Pod都通过veth pair的形式与cni0相连;而flannel.1则是一个VXLAN类型的 设备,充当VTEP的角色实现对VXLAN报文的封包解包。同节点Pod通信,与UDP模 式一样,通过cni0网桥完成,不涉及VXLAN报文的封包解包操作;跨节点Pod通信 则是通过静态配置路由表,ARP(address resolution protocol地址解析协议) 表和FDB表(Forwarding database二层设备中MAC地址和端口的关联关系)的信 息,通过VXLAN虚拟网卡flannel.1,实现了集群内所有Pod在同一个大二层网络 相互通信。还有VXLAN模式支持DirectRouting配置,DirectRouting=true是支持 在相同子网情况下数据包直接通过路由转发,与HOST-GW模式相同。
4 service流量转发
kube-proxy
k8s中由kube-proxy负责解析service解析并完成负载均衡, 早期访问到service的流量转发到用户态kube-proxy然后
5 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)