K8S的三种网络
节点网络       nodeIP          物理网卡的IP实现节点间的通信
Pod网络        podIP           Pod与Pod之间可通过Pod的IP相互通信
Service网络    clusterIP       在K8S集群内部可通过service资源的clusterIP实现对Pod集群的代理转发
 

CNI   容器网络接口  :     flannel   calico   cilium

flannel的三种模式
UDP         出现最早的模式,但是性能最差,基于flanneld应用程序实现数据包的封装/解封装(ip in udp)
VXLAN       flannel的默认模式,也是推荐使用的模式,性能比UDP模式更好,基于内核实现数据帧的封装/解封装(mac in udp),且配置简单使用方便
HOST-GW     性能最好的模式,但是配置复杂,还不能跨网段通信

flannel的UDP模式
1)原始数据包从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel0虚拟接口
2)flanneld服务会监听flannel0接口收到的数据,并会将原始数据包封装到UDP报文里
3)flanneld服务会根据在etcd中维护的路由表查到目标Pod所在的nodeIP,并在UDP报文外封装nodeIP头部、MAC头部等,再通过物理网卡发送到目标node节点
4)UDP报文通过8285端口送达到目标node节点的flanneld服务进程解封装获取原始数据包,数据报文再根据本地路由规则通过flannel0接口发送到cni0网桥,再由cni0发送到目标Pod容器

由于在 UDP 模式下 flanneld 进行网络的封包和解包工作,而 VXLAN 模式下封包解包的工作由内核完成,因此性能上 UDP 模式会比在内核态做转发的 VXLAN 模式差。


flannel的VXLAN模式
1)原始数据帧从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel.1虚拟接口
2)flannel.1接口收到数据帧后添加VXLAN头部,再由内核将原始数据帧封装到UDP报文里
3)根据在etcd中维护的路由表查到目标Pod所在的nodeIP,并在UDP报文外封装nodeIP头部、MAC头部等,再通过物理网卡发送到目标node节点
4)UDP报文通过8472端口送达到目标node节点的flannel.1接口并由内核解封装获取原始数据帧,数据报文再根据本地路由规则发送到cni0网桥,再由cni0发送到目标Pod容器

calico的IPIP模式
1)原始数据包从源主机的Pod容器发出,经过 veth pair 设备送达到tunl0接口
2)tunl0接口收到数据包后,由内核将原始数据包封装到node节点网络的IP报文里,再根据Felix维护的路由规则通过物理网卡发送到目标node节点
3)IP数据包到达目标节点的tunl0接口后,由内核解封装获取原始数据包,数据报文再根据本地路由规则经过 veth pair 设备发送到目标Pod容器
 

calico的BGP模式(本质就是通过路由规则来实现Pod之间的通信)
每个Pod都有一个 veth pair 设置,一端接入Pod,另一端接入宿主机网络空间,并设置了一条路由规则
这些路由规则都是 Felix 维护的,由 BIRD(BGP Client) 基于 BGP 动态路由协议分发给其它节点

1)原始数据包从源主机的Pod容器发出,经过 veth pair 设备送达到宿主机网络空间,再根据Felix维护的路由规则通过物理网卡发送到目标node节点
2)目标node节点收到数据包后,会根据本地路由规则经过 veth pair 设备送达到目标 Pod 容器

calico:  IPIP  VXLAN  BGP  CrossSubnet(混合模式)
默认网段:192.168.0.0/16
使用IPIP或VXLAN模式可以实现跨网段通信,但是传输过程中需要额外的封包和解包,对性能有一点的影响。
使用BGP模式会把每个节点看作成路由器,通过Felix、BIRD组件来维护和分发路由规则,可实现直接通过路由规则直接发送数据包到目标主机,传输中不需要额外的封包和解包,因此性能较好。但是不能跨网段通信。
calico性能较高,具有丰富的网络策略配置能力,功能更全面。但是维护起来较为复杂。
 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐