前言
业界有很多容器网络实现,为什么选它们俩进行比较?我的标准是一容器一 IP,高效转发,隔离, 已有网络基础设施的兼容程度高,丰富的特性。所以,Overlay,Flannel 之类的没考虑,Linux Bridge 虽然简单,功能上无法应对复杂需求。筛选下来,只有它们比较值得去研究比较一下。当然,Docker 原生的 MAC VLAN 也不错,但我更倾向使用网络插件,因为可以独立升级。
接下来会简单介绍一下这两个网络插件,并从网络模型,实现机制,转发效率,软件成熟程度等方面进行比较。
Calico简介
Calico 是一个多主机路由软件,还包含一个分布式防火墙。 Calico 是专门为容器和虚拟机尤其是 Docker 和 OpenStack 环境设计的。 Tigera 公司赞助,用 Python 语言开发。看起来, Calico 有望成为这样一种解决方案:用户能够在生产环境部署容器,同时保证严格的安全。
Calico 为每个容器或者虚拟机分配一个独立的 IP 地址,然后在每台物理主机上定义包含这些 IP 地址的 iptables 规则,实现了防火墙功能。 Calico 在每个物理节点上跑一个高效的vRouter, 由它对外广播本机各容器的路由信息。它基于BGP协议,不仅适用于小规模部署,在route reflector的帮助下,更能应用于大型DataCenter。包的转发用是的Linux内核的转发功能,高效而简单。只要编排框架支持为每个服务分配一个 IP 地址,就可以集成使用 Calico 。借数人云老肖一个图:
从本质上讲,Calico巧妙地把容器们的访问信息,包装在路由信息里,把L3作为容器访问的隔离方式,并使用 Linux 转发内核,很好地作出隔离与性能间的权衡。不象 Vxlan,Weave,为了隔离损失了性能, 也不象 host 模式,为了性能而损失了隔离性。在大型 IDC 的部署中,Calico 官方的部署模式建议为『AS Per Rack model』,即每个机架一个自治域,自治域间通过L2全连接或者L3树形连接。只要 IDC 接受内部跑 BGP,这种网络结构的扩展能力还是比较强的。
二层核心交换部署
三层核心交换部署
Contiv Netplugin 简介
Contiv Netplugin 是来自思科的解决方案。编程语言为 Go。它基于 OpenvSwitch,以插件化的形式支持容器访问网络,支持 VLAN,Vxlan,多租户,主机访问控制策略等。作为思科整体支持容器基础设施contiv项目的网络部分,最大的亮点在于容器被赋予了 SDN 能力,实现对容器更细粒度,更丰富的访问控制功能。另外,对 Docker CNM 网络模型的支持,并内置了 IPAM 接口,不仅仅提供了一容器一 IP,而且容器的网络信息被记录的容器配置中,伴随着容器的整个生命周期,减低因为状态不同步造成网络信息丢失的风险。有别于 CNI,这种内聚化的设计有利于减少对第三方模块的依赖。随着项目的发展,除了 Docker,还提供了对 Kubernetes 以及 Mesos 的支持,即 CNI 接口。
-
Netmaster 后台进程负责记录所有节点状态,保存网络信息,分配 IP 地址。
-
Netplugin 后台进程作为每个宿主机上的 Agent 与 Docker 及 OVS 通信,处理来自 Docker 的请求,管理 OVS。Docker 方面接口为 remote driver,包括一系列 Docker 定义的 JSON-RPC(POST) 消息。OVS 方面接口为 remote ovsdb,也是 JSON-RPC 消息。以上消息都在 localhost 上处理。
-
集群管理依赖 etcd/serf。
分析比较
我们逐个点来聊聊:
两者都支持 CNI 和 CNM 网络模型。Calico是先有CNI,再有CNM。Netplugin先有CNM,再支持CNI。因为Mesos的关系,Calico比较偏向CNI阵型。至于哪种网络模型更好,CNI最简单,为了通用性而对功能与配置方式有所牺牲。CNM也不复杂,设计更优雅, 容器网络相关信息持久在容器内部,与Docker的交互更紧密点。如果计划用Docker作为 Containerizer的话,建议用CNM。计划支持Docker外多种Containerizer的话,用CNI。Netplugin支持CNI的方式比较特别,有一个cniplugin binary脚本执行后并不是直接跑脚本配置网络,而是http去请求内部cniserver,这个跟兼容已有contiv model有关。
从实现机制来看,Calico 的本质是基于BGP的三层交换,加上iptable的访问控制,从而支持各种profile rule。
Netplugin 的话以OpenvSwitch为基石,不仅支持VLAN bridge二层协议,也支持三层的BGP协议(vrouter)。访问控制基于OpenFlow Table,属于SDN应用于容器网络的典范。Calico运用了传统Linux已有的各种模块来搭建自己的产品,掌握起来起容易,而且文档方面比较丰富,前提是需要客户接受这种创新性的BGP协议使用方式。Netplugin更符合近传统的网络框架,引入 OVS的确会提高复杂度,然而它能提供更丰富的功能,特别有利于针对
SDN