Calico 是一种容器之间互通的网络方案。

在虚拟化平台,比如OpenStack、Docker等,都需要实现workloads之间的互连,同时也需要对容器做隔离控制。就像云服务器的安全组,只开放特定的端口,白名单之类的,需要提供隔离和管控机制。

        在多数的虚拟化平台实现中,通常都是用二层隔离技术来实现容器的网络,这些二层的技术有一些弊端,比如需要依赖VLAN,bridge或者隧道技术,其中bridge带来了复杂性,VLAN隔离和tunnel隧道则消耗更多的资源,并对物理环境有要求,随着网络规模的增大,整体会变得越加复杂。

把Host当做Internet中的路由器,使用BGP同步路由,并使用iptables来做安全访问策略,设计出了Calico方案。calico不使用隧道或NAT来实现转发,而是巧妙的把所有二三层流量转换成三层流量,并通过host上的路由配置完成跨host转发。

优势

  • 更优的资源利用: 二层网络通讯需要依赖广播消息机制,广播消息的开销与host的数量成指数级增长,calico使用的三层路由方法,则完全抑制了二层广播,减少了资源开销。另外二层网络使用VLAN隔离技术,天生有4096个规格的限制,即便可以使用vxlan解决,单vxlan又带来了隧道开销的新问题,而calico不使用VLAN或者vxlan,资源利用率更高;
  • 可扩展性:Calico使用与Internet类似的方案,Internet的网络比任何书籍中心都大,Calico同样天然具有可扩展性;
  • 简单更容器调试:没有隧道,workloads之间的路径更短更简单,配置更少,在host上更容器进行debug调试;
  • 更少依赖:Calico仅依赖三层路由可达;
  • 可适配性:较少的依赖使它能适配所有的VM、Container、白盒或者混合环境场景;

架构

Calico网络模型主要工作组件:

1.Felix:运行在每一台 Host 的 agent 进程,主要负责网络接口管理和监听、路由、ARP 管理、ACL 管理和同步、状态上报等。

2.etcd:分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性,可以与kubernetes共用;

3.BGP Client(BIRD)

calico为每一台Host部署一个BGP Client,使用BIRD实现,BIRD是一个单独的持续发展的项目,实现了众多动态理由协议比如BGP、OSPF、RID等。在Calico的角色是监听Host上由Felix注入的路由信息,然后通过BGP协议广播告诉剩余的Host节点,从而实现网络互通。

4.BGP Route Reflector

在大型网络规模中,如果仅仅使用 BGP client 形成 mesh 全网互联的方案就会导致规模限制,因为所有节点之间俩俩互联,需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,使所有 BGP Client 仅与特定 RR 节点互联并做路由同步,从而大大减少连接数。

Felix

Felix会监听Etcd的存储,从它获取事件,比如说用户在这台机器上加了一个IP,或者是创建了一个容器等。用户创建Pod后,Felix负责将其网卡、IP、MAC都设置好,然后再内核的路由表里面写一条,注明这个IP应该到这张网卡。同样如果用户指定了隔离策略,Felix同样会将该策略创建到ACL中,以实现隔离。

BIRD

BIRD是一个标准的路由程序,他从内核里面获取哪一些IP的路由发生了变化,然后通过标准BGP路由协议扩散到整个其它的宿主机,让外界都知道这个IP在这里,你们路由的时候得到这里来。

架构特点

由于Calico是一种纯三层的实现,因此可以避免与二层方案相关的数据包封装的操作,中间没有任何的NAT,没有任何的overlay,所以它的转发效率可能是所有方案中最高的,因为它的包直接走原生TCP/IP的协议栈,它的隔离也因为这个栈而变得好做。因为TCP/IP的协议栈提供了一整套的防火墙的规则,所以它可以通过IPTABLES的规则达到比较复杂的隔离逻辑

Calico网络Node之间的两种网络

IPIP

从字面意思来理解,就是把一个IP数据包又套在一个IP包里,即把IP层封装到IP层的一个tunnel,它的作用其实基本想到哪与一个基于IP层的网桥。一般来说,普通的网桥是基于Mac层的,根本不需要IP,而这个ipip则是通过两端的路由做一个tunnel,把两个本来不通的网络通过点对点连接起来。

BGP

边界网关协议(Border Gateway Protocol, BGP)是互联网上一个核心的去中心化自治路由协议。它通过维护IP路由表或‘前缀’表来实现自治系统(AS)之间的可达性,属于矢量路由协议。BGP不使用传统的内部网关协议(IGP)的指标,而使用基于路径、网络策略或规则集来决定路由。因此,它更适合被称为矢量性协议,而不是路由协议。BGP,通俗的讲就是讲接入到机房的多条线路(如电信、联通、移动等)融合为一体,实现多线单IP,BGP 机房的优点:服务器只需要设置一个IP地址,最佳访问路由是由网络上的骨干路由器根据路由跳数与其它技术指标来确定的,不会占用服务器的任何系统。

IPIP工作模式

BGP工作模式

BGP网络想比较IPIP网络,最大的不同之处就是在于没有了隧道设备tunl0。

IPIP网络pod之间的流量发送到tunl0,然后tunl0发送到对端设置。BGP网络中,pod之间的流量直接从网卡发送目的地,减少了tunl0这个环节。

两种网络的对比

IPIP网络

流量:tunl0 设备封装数据,形成隧道,承载流量。

适用网络类型:适用于互相访问的pod不在同一个网段中,跨网段访问的场景。外层封装的ip能够解决跨网段的路由问题。

效率:流量需要tunl0设备封装,效率略低

BGP网络

流量:使用路由信息导向流量

适用网络类型:适用于互相访问的pod在同一个网段,适用于大型网络。

效率:原生hostGW,效率高

存在的问题

  • 租户隔离问题: calico的三层方案是直接在host上进行路由寻址,那么对于多租户如果使用同一个CIDR网络就面临着地址冲突的问题;
  • 路由规模问题: 通过路由规则可以看出,路由规模和pod分布有关,如果pod离散分布在host集群中,就会产生较多的路由项;
  • iptables 规则规模问题: 1台host上可能虚拟化十几个或者几十上百个容器实例,过多的iptables规则造成复杂性和不可调试性,同时也存在性能损耗;
  • 跨子网时的网关路由问题:当对端网络不为二层可达时,需要通过三层路由机时,需要网关支持自定义路由配置,即pod的目的地址为本网段的网关地址,再由网关进行跨三层转发。
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐