前言
宿主机上运行的容器通过Linux内核的Namespace机制进行网络隔离;
想要了解K8s网络,其本质上是需要了解容器间网络相互访问原理;
关于容器和容器之间如何通信的原理,需要分2种情况进行剖析:
- 在同1宿主机内的容器间,通信过程?
- 在不同宿主机内的容器间,如何跨节点进行通信?
不通宿主机上容器间通信主要使用2种方式
- 报文封装:在3层网络报文之上再封装1层虚拟报文,使用隧道进行报文传输,例如VXLAN、GRE等
- 动态技术:动态更新路由表信息,动态控制下一跳IP地址实现,例如BGP
在K8s集群中使用SDN技术实现以上2种方式各有优劣:
- 报文封装:对原报文进行2次封装,2次封装和解封装效率低下、报文体积增大;
- 动态路由:CNI插件无权配置、修改真实路由器设备上的路由信息,导致容器间通信(Overlay网络)受限于同1网段的Underlay网络;
一、Flannel
Flannel 由CoreOS开发,用于解决Docker集群跨主机通讯的覆盖网络(overlay network);
它的主要思路是:预先留出1个网段,每个主机使用其中1部分,然后每个容器被分配不同的IP;
所有的容器认为大家在同一个直连的网络,底层通过UDP/VxLAN/Host-GW等进行报文的封装和转发。
二、Calico
Calico是1个基于BGP协议的网络互联解决方案;
Calico是1个纯3层的SDN解决方案即CNI插件,使用路由来实现报文寻址和传输。
相比Flannel, ovs等SDN解决方案,Calico 避免了层叠网络带来的性能损耗。
- 将Node节点当做Router
- 将位于Node节点上的Container当做Router的直连设备
- 利用Kernel 来实现高效的路由转发。
Node节点间的路由信息通过BGP协议在整个Calico网络中传播。
Calico具有以下特点:
- 在Calico 中的数据包不需要进行封包和解封。
- 基于三层网络通信,troubleshoot 会更方便。
- 网络安全策略使用 ACL 定义,基于 iptables 实现,比起 overlay 方案中的复杂机制更只管和容易操作。
三、Calico工作模式
1.BGP模式
在BGP模式下:Colico将运行容器的节点做为虚拟路由器,通过BGP生成动态路由,来实现集群内,运行在不同宿主机上的容器 间的网络访问;
[root@master ~]# route -n #BGP模式 Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 ens33 10.244.104.0 192.168.0.112 255.255.255.192 UG 0 0 0 ens33 10.244.166.128 192.168.0.111 255.255.255.192 UG 0 0 0 ens33 ... [root@master home]# route -n #IPIP模式 Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 ens33 10.244.104.0 192.168.0.112 255.255.255.192 UG 0 0 0 tunl0 10.244.166.128 192.168.0.111 255.255.255.192 UG 0 0 0 tunl0
在BGP模式下,报文直接通过Node节点的网卡转发到目标机Node节点上,不会进行2次IP报文的封装;
因此从性能上来看,BGP肯定是占优的,但是也正是没有对报文进行2次封包,BGP模式只能在同1个子网内使用,无法跨网段。
2.IPIP模式
IPIP模式主要指的是在Kubernetes环境中,通过Calico网络策略实现的IP-in-IP隧道模式。
在这种模式下,Calico通过创1一个虚拟的隧道设备(如tunl0),将源容器的数据包封装后通过宿主机发送出去。
这种模式允许数据包在不同子网之间的POD之间传输,而不需要通过路由连接。
由于IPIP模式需要对报文进行二次的封装和解封,效率不高;
3.混合模式
Calico-ipip模式和Calico-bgp模式都有对应的局限性,最终Calico的Corss-subnet模式兼顾了以上2种模式的优点,完美胜出;
在同子网内进行网络访问时,使用BGP模式,在跨子网网络访问时,使用IPIP模式。
参考