21.1 容器网络模型

libnetwork中容器网络模型(Container Networking Model,CNM)十分简洁,可以让上层使用网络的大量应用容器最大程度上不去关心底层实现。

容器网络模型的结构如图21-1所示。

21.1 容器网络模型 - 图1

图21-1 容器网络模型

包括三种基本元素:

·Sandbox(沙盒):代表一个容器(准确地说,是其网络命名空间);

·Endpoint(接入点):代表网络上可以挂载容器的接口,会分配IP地址;

·Network可以连通多个接入点的一个子网。

可见,对于使用CNM的容器管理系统来说,具体底下网络如何实现,不同子网彼此怎么隔离,有没有QoS,都可以不关心。只要插件能提供网络和接入点,只需把容器给接上或者拔下,剩下的都是插件驱动自己去实现。这样就解耦和容器和网络功能,十分灵活。

CNM的典型生命周期如图21-2所示。首先,是驱动注册自己到网络控制器,网络控制器使用驱动类型,来创建网络,然后在创建的网络上创建接口,最后把容器连接到接口上即可。销毁过程则正好相反,先把容器从接入口上卸载,然后删除接入口和网络即可。

21.1 容器网络模型 - 图2

图21-2 容器网络的生命周期

目前CNM支持的驱动类型有四种:Null、Bridge、Overlay、Remote。简单介绍如下:

·Null:不提供网络服务,容器启动后无网络连接;

·Bridge:就是Docker传统上默认用Linux网桥和Iptables实现的单机网络;

·Overlay:是用vxlan隧道实现的跨主机容器网络;

·Remote:扩展类型,预留给其他外部实现的方案,比如有一套第三方的SDN方案(如OpenStack Neutron),就可以接进来。

从位置上看,libnetwork上面支持Docker,下面支持网络插件,自身处于十分关键的中间层。读者如果熟悉计算机网络协议模型的话,libnetwork就是最核心的TCP/IP层。

目前,已有大量的网络方案开始支持libnetwork。包括OpenStack Kuryr项目,通过支持libnetwork,让Docker可以直接使用Neutron提供的网络功能。Calico等团队也编写了插件支持libnetwork,从而无缝地支持Docker网络功能。