《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接口交互的过程。
- Create Network
这一系列调用发生在使用docker network create的过程中。
(1)IpamDriver.RequestPool:创建subnetpool用于分配IP。
(2)IpamDriver.RequestAddress:为gateway获取IP。
(3)NetworkDriver.CreateNetwork:创建网络和子网。
- Create Container
这一系列调用发生在使用docker run创建一个容器的过程中。也可以通过docker network connect触发。
(1)IpamDriver.RequestAddress:为容器获取IP。
(2)NetworkDriver.CreateEndpoint:为容器创建网络接口。
(3)NetworkDriver.Join:为容器和外部网络驱动绑定。
(4)NetworkDriver.ProgramExternalConnectivity:使容器与外部进行网络连接。
(5)NetworkDriver.EndpointOperInfo:返回容器网络信息。
- Delete Container
这一系列调用发生在使用docker delete删除一个容器的过程中。也可以通过docker network disconnect触发。
(1)NetworkDriver.RevokeExternalConnectivity:撤销容器与外部网络的连接。
(2)NetworkDriver.Leave:容器与外部网络驱动解绑。
(3)NetworkDriver.DeleteEndpoint:删除容器内的网络设备。
(4)IpamDriver.ReleaseAddress:删除port并释放IP。
- 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网络技巧