容器网络五-calico容器互联原理

113 阅读3分钟

承接上文容器网络四-k8s flannel vxlan

calico使用纯的三层路由去实现容器互联,对比flannel的vxlan模式而言的话,这种形式没有一个封包、解包的操作,更加高效。

image.png

这两台主机,一台是192.168.64.5,网络段是192.168.64,另一台是192.168.64.6,这两台属于同一个局域网之内。

192.168.64.5这台主机里面有一个叫red的网络命名空间,把前32位作为一个网络段,本身作为一个单独的局域网。

192.168.64这台主机也是一样的,有一个blue的网络命名空间。

192.168.64.5上有一对veth网络设备,一头连接red网络命名空间,一头连接主机。

看下包的流转过程

比如在red网络命名里,ping 172.17.9.2,red的网络命名空间里有一个路由:default via 169.254.1.1 dev veth-red onlink,从red网络命名空间的veth-red网络设备出来,下一跳地址是169.254.1.1,即到达主机的veth网卡上,然后看下主机的路由规则,看下转发到哪个网卡上,

172.17.8.2 dev veth-red-br scope link 
172.17.9.0/24 via 192.168.64.6 dev enp0s1

目的ip是172.17.9.2,网络段是172.17.9,根据目的ip匹配路由规则,

172.17.9.0/24 via 192.168.64.6 dev enp0s1

它的下一跳地址是192.168.64.6,并且从本地主机的enp0s1网卡上出去,192.168.64.6这个ip是另外一台主机的ip地址。

也就是说这个IP网络包,到了veth设备之后,会转发到enp0s1网卡上,然后由enp0s1网卡去寻找192.168.64.6这个ip的mac地址,得到mac地址后,将ip网络包转发到这台主机上,转发到这台主机上之后,可以看到这台主机有一个路由规则,

172.17.8.0/24 via 192.168.64.5 dev enp0s1
172.17.9.2 dev veth-blue-br scope link

如果是172.17.9.2这个ip的话,就会从veth-blue-br网络设备进去,即当ip网络包到达这台主机之后,他会转发到veth-blue-br这个网络设备上,然后又会到达另外一端网络设备即blue网络命名空间里的veth-blue设备,这个veth设备的ip刚好是172.17.9.2,到达之后,它发现目的ip就是它自己,然后按相似的路程,把ip网络响应包按这个规则也返回给red网络命名空间,那这个过程就ping通了,这也是在局域网内实现不同网络命名空间,不同网络段实现互联的一个方式。

比较巧妙的一点就是将到达主机上的这个veth设备的下一跳地址设置成了目的主机的ip地址。

因为是同一个局域网内,所以它能够带来到目的主机的一个网卡上面去,在到达目的主机的网卡上之后,通过ip forward的功能,能够实现不同网卡之间去转发协议包。

但如果这两台主机不是同一个局域网的话,那怎么实现不同局域网之间容器互联呢?

在calico里,同一个局域网之内下一跳地址设的是目的ip地址并且是从enp0s1这个和外界链接的网卡出去的,而在不同局域网,它会在两台主机上面都创建一个隧道的网络设备。隧道的网络设备其实类似vxlan,它能够对原始的协议包去进行封装包裹一层,包裹上主机上面的和外界相连的那个ip,用这个ip去承载协议包。也就是说,在这台主机上会有一个隧道的设备,比如一个tun的设备,然后在另一台主机上又有一个隧道的设备。将到达主机上veth设备(veth-red-br)的网络包,下一跳地址将会到达这台主机上面的一个隧道设备A上,通过这个隧道的设备去发往目的主机的隧道设备B上,隧道设备B对协议包去进行解包。不同局域网内之间,calico是通过隧道的设备,在不同局域网之间,在不同网卡之间实现网络协议包的流转。