深入理解K8S网络host-gw模式和Calico

本章节我们学习K8S中纯三层网络方案。前面章节未学习的小伙伴建议先阅读前面章节打好基础

深入理解K8S节点内容器通信_量子学习法的博客-CSDN博客

深入理解容器跨主机通信_量子学习法的博客-CSDN博客

本章节我们学习Flannel 的 host-gw 模式和Calico项目。

host-gw

host-gw要求宿主机之间是二层互通的,也就是宿主机在同一子网内。

利用这个特性,例如:infra-contain1发往infra-container2的包,只需要当IP包从网络层进入链路层封装成帧的时候,eth0就会根据infra-container2的IP设置下一跳地址为对应的MAC地址(Node2的mac地址)。于是因为二层互通,所以包就能直接发往目的宿主机了。

那么如何根据目的IP得到目的宿主机的mac地址呢?

Flannel子网和主机的信息,都是保存在Etcd当中的。flanneld只需要WACTH这些数据的变化,然后实时更新路由表即可。

例如Node1路由规则:

 所以,在这种模式下就省去了UDP模式和VXLAN模式下额外的封包和解包带来的性能损耗。

所以,host-gw模式能够正常工作的核心,就在于IP包在封装成帧发送出去的时候,会使用路由表里的“下一跳”来设置目的MAC地址。这样,它就会经过二层网络到达目的宿主机。

Calico

calico的思路和host-gw非常相似都是要二层互通的,只不过根据目的IP获取宿主机mac地址的方式不是从Etcd获取,而是使用BGP。(BGP边界网关协议可以自行谷歌)

了解了BGP协议后,我们上calico图解。

 由于 calico没有用CNI网桥模式,所以每个容器的Veth pair设备的另外一端是直接放在宿主机上的而不是网桥上。而当收包的时候,宿主机就会根据自己的路由规则将包转发到对应的容器上。例如:宿主机Node2上container4的路由规则:

即:发往10.233.2.3的IP包,应该进入cali5863f3设备。

了解一这点后,Calico项目的架构除了这个CNI插件,还有Felix和BIRD。

  1. Felix。它是一个DaemonSet(守护进程),负责在宿主机上插入路由规则(即:写入Linux内核的FIB转发信息库),以及维护Calico所需的网络设备等工作。

  2. BIRD。它就是BGP的客户端,专门负责在集群里分发路由规则信息。

 其中,这里最核心的“下一跳”路由规则,就是由Calico的Felix进程负责维护的。这些路由规则信息,则是通过BGP Client也就是BIRD组件,使用BGP协议传输而来的。

通过上诉的架构的组件,Calico项目就能根据目的IP获取到对应宿主机的MAC地址。 

那么,若是Calico项目不是二层互通,我们没法讲IP包通过二层发往下一跳地址怎么办?

在这种情况下,你就需要为Calico打开IPIP模式

 在Calico的IPIP模式下,Felix进程在Node 1上添加的路由规则,会稍微不同,如下所示:

 

可以看到,尽管这条规则的下一跳地址仍然是Node 2的IP地址,但这一次,要负责将IP包发出去的设备,变成了tunl0。注意,是T-U-N-L-0,而不是Flannel UDP模式使用的T-U-N-0(tun0),这两种设备的功能是完全不一样的。

Calico使用的这个tunl0设备,是一个IP隧道(IP tunnel)设备。

在上面的例子中,IP包进入IP隧道设备之后,就会被Linux内核的IPIP驱动接管。IPIP驱动会将这个IP包直接封装在一个宿主机网络的IP包中,如下所示:

其中,经过封装后的新的IP包的目的地址(图5中的Outer IP Header部分),正是原IP包的下一跳地址,即Node 2的IP地址:192.168.2.2。

而原IP包本身,则会被直接封装成新IP包的Payload。

这样,原先从容器到Node 2的IP包,就被伪装成了一个从Node 1到Node 2的IP包。由于宿主机之间已经使用路由器配置了三层转发,也就是设置了宿主机之间的“下一跳”。所以这个IP包在离开Node 1之后,就可以经过路由器,最终“跳”到Node 2上。ode 2的网络内核栈会使用IPIP驱动进行解包,从而拿到原始的IP包。然后,原始IP包就会经过路由规则和Veth Pair设备到达目的容器内部。

当Calico使用IPIP模式的时候,集群的网络性能会因为额外的封包和解包工作而下降。在实际测试中,Calico IPIP模式与Flannel VXLAN模式的性能大致相当。所以,在实际使用时,如非硬性需求,我建议你将所有宿主机节点放在一个子网里,避免使用IPIP。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值