网络协议

Posted by [Kohn] on Monday, February 19, 2024
Last Modified on Wednesday, February 21, 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上

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)