《Kubernetes网络权威指南》读书笔记 | 容器网络的第一个标准:CNM

Posted COCOgsta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Kubernetes网络权威指南》读书笔记 | 容器网络的第一个标准:CNM相关的知识,希望对你有一定的参考价值。

书籍来源:《Kubernetes网络权威指南:基础、原理与实践》

一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:《Kubernetes网络权威指南》读书笔记 | 汇总_COCOgsta的博客-CSDN博客


目前有两种主流的网络接口方案,即Docker主导的Container Network Model(CNM)和Kubernetes社区主推的Container Network Interface(CNI)。

2.4.1 CNM标准

CNM模型如图2-3所示。

图2-3 CNM模型

从上图不难发现,CNM有3个主要概念:

  • Network Sandbox:容器网络栈,包括网卡、路由表、DNS配置等。;

  • Endpoint:Network Sandbox和Backend Network的中间桥梁。对应的技术实现有veth pair设备、tap/tun设备、OVS内部端口等;

  • Backend Network:一组可以直接相互通信的Endpoint集合。对应的技术实现包括Linux bridge、VLAN等。CNM依赖另外两个关键的对象来完成网络管理功能:

    • Network Controller:对外提供分配及管理网络的APIs;
    • Driver:它通过插件式的接入方式,提供最终网络功能的实现。

CNM还支持标签(label),用户可以通过定义label这样的元数据自定义Libnetwork和驱动的行为。

2.4.2 体验CNM接口

介绍几个常见的Docker daemon和CNM接口交互的过程。

  1. Create Network

这一系列调用发生在使用docker network create的过程中。

(1)IpamDriver.RequestPool:创建subnetpool用于分配IP。

(2)IpamDriver.RequestAddress:为gateway获取IP。

(3)NetworkDriver.CreateNetwork:创建网络和子网。

  1. Create Container

这一系列调用发生在使用docker run创建一个容器的过程中。也可以通过docker network connect触发。

(1)IpamDriver.RequestAddress:为容器获取IP。

(2)NetworkDriver.CreateEndpoint:为容器创建网络接口。

(3)NetworkDriver.Join:为容器和外部网络驱动绑定。

(4)NetworkDriver.ProgramExternalConnectivity:使容器与外部进行网络连接。

(5)NetworkDriver.EndpointOperInfo:返回容器网络信息。

  1. Delete Container

这一系列调用发生在使用docker delete删除一个容器的过程中。也可以通过docker network disconnect触发。

(1)NetworkDriver.RevokeExternalConnectivity:撤销容器与外部网络的连接。

(2)NetworkDriver.Leave:容器与外部网络驱动解绑。

(3)NetworkDriver.DeleteEndpoint:删除容器内的网络设备。

(4)IpamDriver.ReleaseAddress:删除port并释放IP。

  1. Delete Network

这一系列调用发生在使用docker network delete的过程中。

(1)NetworkDriver.DeleteNetwork:删除Network。

(2)IpamDriver.ReleaseAddress:释放gateway的IP。

(3)IpamDriver.ReleasePool:删除subnetpool。

除了命令行,Docker还提供了CNM的remote plugin,即RESTful API。remote plugin监听一个指定的端口,Docker Daemon直接通过这个端口与remote plugin进行交互。

2.4.3 Libnetwork

Libnetwork通过插件的形式为Docker容器提供网络功能,用户可以根据自己的需求实现自己的网络驱动,以便提供不同的网络功能。

Libnetwork的网络控制器(Network Controller)负责将网络驱动和一个Docker网络进行对接。每个网络驱动负责为对接的网络提供服务,例如IPAM(IP地址管理)等。

Docker Daemon和Libnetwork的调用过程如图2-4所示。

图2-4 Docker Daemon和Libnetwork的调用过程

无论使用哪种网络类型,Docker Daemon与Libnetwok的交互流程都是一样的,它很好地对底层(驱动)实现进行了抽象。

结合CNM,Libnetwork所要达成的效果应该是:用户可以创建一个或多个网络,一个容器可以加入一个或多个网络。同一个网络中的容器可以通信,不同网络中的容器隔离。即创建容器与创建网络是分开的:

创建两个overlay网络net1和net2:

运行一个容器net1c1,加入net1网络:

2.4.4 Libnetwork扩展

Libnetwork支持remote的网络驱动。远端的网络驱动,只要实现了以下接口,就能支持Docker容器网络的生命周期管理。

以上是关于《Kubernetes网络权威指南》读书笔记 | 容器网络的第一个标准:CNM的主要内容,如果未能解决你的问题,请参考以下文章

《Kubernetes网络权威指南》读书笔记 | iptables

《Kubernetes网络权威指南》读书笔记 | 打通CNI与Kubernetes:Kubernetes网络驱动

《Kubernetes网络权威指南》读书笔记 | Kubernetes网络策略:为你的应用保驾护航

《Kubernetes网络权威指南》读书笔记 | 最常用的Docker网络技巧

《Kubernetes网络权威指南》读书笔记 | Linux隧道网络的代表:VXLAN

《Kubernetes网络权威指南》读书笔记 | 主角登场:Linux容器