Fannel纯三层路由的方式实现不同宿主机间的容器通信,这种方式工作的前提是宿主机之间是二层连通的。需要注意的是,宿主机之间二层不连通的情况也是广泛存在的,这就不得不提到calico网络方案了。
- Calico网络方案同时解决了宿主机二层连通和不连通的的场景下,容器之间通过纯三层路由通信的问题。
- Fannel通过etcd和宿主机上的fanneld维护路由信息,calico使用了BGP自动在集群里分发、更新、记录路由。在大规模网络环境下,其可靠性和可扩展性是fannel方案不可比的。
下面就开始讲述calico网络方案的场景。先了解下calico的几个功能模块:
- Calico的CNI插件。这是calico与k8s对接的部分。
- Felix。它是一个daemonset,负责在宿主机上插入更新路由规则、配置ACLs、维护calico插件所需的网络设备等工作。
- BIRD。它就是BGP的客户端,负责在集群里分发、收集路由信息。
- BIRD Reflector。大规模部署时,摒弃所有节点互联的mesh模式,通过一个或者多个BGP Route Refletor集中式的路由分发。
Calico项目,实际上是将集群里的所有宿主机,都当作边界路由器,它们组成了一个全连通的网络BGP Mesh,互相之间通过BGP协议交换路由规则,这些节点成为BGP Peer。
1. 宿主机二层互通场景
如图Figure -- 1所示,calico插件与fannel的host-gw模式的另一个不同之处就是,它不会在宿主机上创建类似docker0、cni0这样的网桥设备,Veth Pair在宿主机的一端的接口直接暴露在宿主机上,并通过设置路由规则,将容器IP暴露到宿主机的通信路由上。
Figue -- 1
分析下IP包转发的流程:
1)节点1通过Veth Pair在宿主机一侧的端口收到“原始IP”包