网络协议

Posted by [Kohn] on Monday, February 19, 2024
Last Modified on Wednesday, April 10, 2024
本文阅读量

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间通信

  1. app经过pod内的eth0发送流量
  2. 经由veth pair, 流量会进入宿主机上的对端设备
  3. 在宿主机上的对端设备, 挂在了from-container的ebpf程序, 在这个程序做了几件事;
    • load balancing: 如果目的ip是一个service, 此处会选择一个后端pod的ip然后替换目的ip(DNAT)
  4. 内核查询路由表决定怎么发送, 以测试机器为例:
    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
    
    其中172.16.0.0是容器网段, 每个node都分配了一段网段, 路由表维护了不 同网段应该发送到哪个node这一信息. 测试机使用的是IPIP协议, 因此会在 IP包的外面在包一层IP包, 指定目的IP为目的pod所在的node的ip, 然后经过underlay网络发送
  5. 这篇博客介绍了另一种网络模式, 宿主机不维护网段与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)