K8S的三种网络
节点网络 nodeIP 物理网卡的IP实现节点间的通信
Pod网络 podIP Pod与Pod之间可通过Pod的IP相互通信
Service网络 clusterIP 在K8S集群内部可通过service资源的clusterIP实现对Pod集群的代理转发
K8S的三种接口
CRI 容器运行时接口 docker containerd pod cri-o
CSI 容器存储接口 nfs ceph oss s3
CNI 容器网络接口 flannel calico cilium
VLAN和VXLAN的区别
1)使用场景不同:VLAN主要用于在交换机上逻辑划分广播域,还可以配合STP生成树协议阻塞路径接口,从而避免产生环路和广播风暴
VXLAN用作于叠加网络,可以将数据帧封装成UDP报文,再通过网络层传输到其它网络,从而实现虚拟大二层网络的通信
2)VXLAN支持更多的二层网络:VXLAN最多可支持 2^24 个;VLAN最多支持 2^12 个(4096-2)
3)VXLAN可以防止物理交换机MAC表耗尽:VLAN需要在交换机的MAC表中记录MAC地址;VXLAN采用隧道机制,MAC地址不记录在交换机的MAC表中
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容器
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 容器
flannel 与 calico 的区别
flannel: UDP VXLAN HOST-GW
默认网段:10.244.0.0/16
通常会采用VXLAN模式,由于用的是叠加网络、IP隧道方式传输数据,传输过程中需要额外的封包和解包,对性能有一点的影响。
flannel简单易用。但是不具备复杂的网络策略配置能力,性能方面表现一般。
calico: IPIP VXLAN BGP CrossSubnet(混合模式)
默认网段:192.168.0.0/16
使用IPIP或VXLAN模式可以实现跨网段通信,但是传输过程中需要额外的封包和解包,对性能有一点的影响。
使用BGP模式会把每个节点看作成路由器,通过Felix、BIRD组件来维护和分发路由规则,可实现直接通过路由规则直接发送数据包到目标主机,传输中不需要额外的封包和解包,因此性能较好。但是不能跨网段通信。
calico性能较高,具有丰富的网络策略配置能力,功能更全面。但是维护起来较为复杂。
总结:flannel适合规模较小,网络要求简单的K8S集群。calico适合规模较大,需要设置网络策略,固定 PodIP 的K8S集群。