Flannel host-gw模式
host-gw模式就是将每个Flannel子网的下一跳设置成该子网对应宿主机的IP地址,该主机会充当容器通信路径里的网关。
当我们从容器10.244.0.2去访问10.244.1.3的容器时,当数据包走到cni0网桥时会根据宿主机的路由表发现,吓一跳是10.168.0.3,也就是目的容器的宿主机,此时eth0设备会使用下一跳地址对应的MAC地址作为该数据帧的目的MAC地址,从而到达对端容器的宿主机。
hots-gw的优势
host-gw模式下避免了额外的封包和解包的性能损耗。
Flannel host-gw路由信息的维护
需要通过Etcd和宿主机上的flanneld进程。
BGP是什么?
BGP是边界网关协议,是Linux原生支持的专门用在大型数据中心里维护不同自治系统之间路由信息的、无中心的路由协议。
什么是边界网关
把自治系统连接在一起的路由器称之为边界网关,它的路由表里面拥有其他自治系统里面的主机路由信息。如下图的Router1和Route2。
使用了BGP之后,每个边界网关上都会运行着一个小程序,它们会将各自的路由表信息通过TCP传输给其他的边界网关,其他边界网关上的小程序会对收到的这些数据进行分析,然后将需要的信息添加到自己的路由表里。
Calico项目组成
Calico不会在宿主机上创建任何网桥设备,但是Calico的CNI插件会创建一个Veth Pair设备,以便容器内的数据包出现在宿主机上,从而通过宿主机的路由表到达目的容器。
在宿主机上可以通过路由表找到下一跳路由地址,下一跳的路由规则由Felix进行维护,而路由规则信息则通过BIRD进行获得。
Calico如何获取全局路由信息
默认情况下,Calico采用的是Node-to-Node Mesh的模式,该模式要求每台宿主机的BGP Client和其他节点进行通信以便交换路由信息,比较适合100节点以下的集群。
另一种则是Route Reflector模式,该模式下会选取一个或者几个专门的节点,来负责跟所有的节点建立BGP连接从而学习到全局的路由信息,其他节点只需要跟这几个专门的节点交换路由信息即可获取全局的路由信息。
IPIP模式
当源主机和目的主机网络不通时,则需要开启IPIP模式,如下图:
在IPIP模式下,Felix进程会在Node1上天界路由规则,如下:
10.233.2.0/24 via 192.168.2.2 tunl0
发往192.168.2.2的设备从etho0变为tunl0,tunl0设备是IP隧道设备,IP包进入tunl0设备后,会重新进行封装,新封装的IP包的目的地址是192.168.2.2(目的主机IP),这样通过后续的下一跳路由器从而到达目的主机,目的主机的IPIP驱动会进行解包,得到原始的数据包,经过路由规则和Veth Pair设备进入目的容器。