Calico与Flannel,容器虚拟化网络方案中涉及到的方案是2个:基于隧道、基于路由,基于隧道具备普适性,比如flannel的vxlan、udp模式,Calico的IPIP模式
每个主机上都要安装calico或者flannel的agent进程,这些agent进程会从etcd这样的集中式数据库中查询到一个私有网段,然后这台主机上的容器后续就都用这些ip地址了,核心就是每个agent拿到一个网段后,就修改dockerd的启动参数,加上--bip,就可以控制容器的IP地址了。
既然是隧道,就好像汽车坐轮船摆渡一样,涉及到数据包的封包/解包,意思就是自己无法把数据包发出去,那就借助外力,很显然,摆渡是需要成本的,会消耗CPU以及增加网络延迟。
封包/解包
- 容器和容器之间通信(跨主机),数据包的源IP和目的IP都是容器的IP,很明显是无法路由的,下面还是耍魔法
- 得在host主机上做一个魔法操作,让这个容器的数据包A能够送到host主机上的flannel或者calico这种网络插件的agent进程,等于说汽车得找到轮船,由轮船帮你把数据包送出去
- agent拿到数据包以后,就会把数据包进行改头换面,把数据包A重新塞到另外一个数据包B里面,这个数据包B的源IP和目的IP都是host主机的IP地址。很明显,host主机的IP是互联互通的;
- 数据包送到目标宿主机后,解封,得到原始数据包,然后在宿主机上想办法,把这个数据包再送到对应的容器里面去处理
- 这么一搞的话,2端的容器就有了一种互联互通的幻觉
- 因为host主机的IP地址是工作在OSI模型的第3层(第4层是TCP/UDP,第2层是MAC链路层),所以是可以跨路由的,也就是说宿主机本身跨网段经过路由器,也是没有任何影响的,这个隧道方案具备普适性了,优势很明显,只要host主机在IP层可以互联互通,就可以确保容器可以互联互通。
- 但是封包解包浪费CPU,额外封包增加的数据,会浪费带宽
flannel vxlan和calico ipip模式都是隧道方案