CNI(Container Network Interface即容器网络接口)是由CoreOS提出的一个容器网络规范,包含方法规范、参数规范等,是Linux容器网络配置的一组标准和库,用户可以根据这些标准和库来开发自己的容器网络插件。CNI已经被Kubernetes、Mesos、Cloud Foundry、rkt使用,同时Calico、Weave等项目都为CNI提供插件。

CNI的目的是在容器运行时首先创建容器的网络命名空间,然后确定这个网络容器应该属于哪个网络,需要使用哪个网络插件,网络配置使用JSON格式方便存储在一个文件中。 CNI规定了一个容器运行时和网络插件之间的接口规范,这个接口通过JSON的语法定义了CNI插件所需要提供的输出和输出。 CNI只关心容器的网络连接,在容器创建时分配网络资源(包括虚拟网卡,IP地址,DNS,网络路由等)、在容器删除时删除分配的网络资源。CNI接口只要实现两个方法,一个在创建容器时调用,一个在删除容器时调用。 可查看Container Networking Interface Proposal中的Add container to networkDelete container from network

在容器创建时,容器运行时会先分配一个网络命名空间以及一个容器ID,然后连同一些CNI配置参数传给网络驱动,接着网络驱动会将该容器连接到网络并将分配的IP地址以JSON的格式返回给容器运行时。

参考