Calico 项目提供的网络解决方案与 Flannel 的 host-gw 模式几乎完全一样。
Calico 也会在每台宿主机上添加一条规则
目标IP via 网关IP dev eth0
其中网关的 IP 地址也就是 目标容器的 宿主机 IP地址
这个三层网络方案得以正常工作的核心是为每个容器的 IP 地址找到对应的下一跳网关。
不同于Flannel通过 etcd 和 宿主机上的 flanneld 来维护路由信息的做法,Calico 项目使用的是 BGP (border gateway protocol 边界网关协议)
BGP 协议是一个 Linux 内核原生支持的、专门用于在大规模数据中心维护不同 ”自治系统“ 之间路由信息、无中心的路由协议。
两个自治系统通常有各自使用的网关,负责把两个自治系统的网关连接在一起的路由器,可以形象的称为 边界网关
它跟普通路由器的不同之处在于,它的路由表里拥有其他自治系统的主机的路由信息
使用了BGP之后,可以认为在每个边界网关上都运行着一个小程序,它们会将各自的路由表信息通过 TCP 传输给其它的边界网关。其它边界网关上的小程序会对收到的这些数据进行分析,然后将需要的信息添加到自己的路由表里。
所谓BGP,就是在大规模网络中实现节点路由信息共享的一种协议。
BGP 的这个能力正好可以取代Flannel维护主机上的路由表功能。
Calico由以下三个部分组成。
- Calico 的CNI插件
- Felix,是一个DaemonSet,负责在宿主机上插入路由规则(写入Linux内核的FIB转发信息库),以及维护Calico所需的网络设备等工作
- BIRD,是BGP的客户端,负责在急群众分发路由规则信息
Calico不会在宿主机上创建任何网桥设备,这一点与Flannel的host-gw不同。