发布网友 发布时间:2024-10-17 16:06
共1个回答
热心网友 时间:2024-10-17 16:17
CNI(Container Network Interface)是kubernetes网络集成的解决方案,专注于容器网络连接和容器销毁时的资源释放,支持多种网络模式,易于实现。常见的CNI实现有Flannel、Calico、Weave等。CNI插件有三种实现模式:UDP、VxLAN、host-gw。
Flannel采用Overlay网络模式,将TCP数据包装在另一种网络包中进行路由转发和通信。它会在每一个宿主机上运行名为flanneld的代理,为宿主机预先分配一个子网,并为Pod分配IP地址。数据包通过VXLAN、UDP或host-gw后端机制进行转发。不同宿主机下的Pod属于不同的子网,通过Etcd存储网络配置、子网和主机公共IP信息。
Flannel支持三种实现:UDP、VxLAN、host-gw。host-gw模式性能最高,但要求节点处于同一网段。VxLAN模式使用内核VxLAN模块维护二层网络,构建Overlay网络,源VTEP设备通过二层数据帧进行通信,将原始IP包封装并发送给目的VTEP设备。在Linux内核中,网络设备进行转发的依据来自FDB转发数据库。UDP模式下,数据包从容器经过docker0出现在宿主机,根据路由表进入flannel0设备后,宿主机上的flanneld进程收到IP包。flanneld根据目的IP地址匹配到对应的子网,从Etcd中找到宿主机的IP地址。然后将UDP封装的IP包发送给Node2。
VxLAN模式下,flannel.1设备作为VTEP,封装原始IP包,并通过二层数据帧发送给目的VTEP设备。封装过程只是在原始IP包前面加上一个VxLAN头,包含VNI标识。Linux内核会对数据桢进行拆包,根据VNI值交给flanneld处理。最终数据包通过宿主机网络传输到目的Node。
在host-gw模式下,每个Flannel子网的下一跳设置为对应宿主机的IP地址,宿主机充当容器通信路径的网关。数据包封装成三层IP包,使用路由表的下一跳设置MAC地址,通过二层网络传输到目的宿主机。如果两个Pod所在节点在同一网段,可以配置VxLAN支持host-gw功能,直接通过物理网卡的网关路由转发,提高VxLAN性能。