gh_mirrors/lib/libnetwork代码实现原理:深入理解CNM容器网络模型
2026/4/25 23:43:45 网站建设 项目流程

gh_mirrors/lib/libnetwork代码实现原理:深入理解CNM容器网络模型

【免费下载链接】libnetworknetworking for containers项目地址: https://gitcode.com/gh_mirrors/lib/libnetwork

libnetwork是一个为容器提供网络功能的开源项目,其核心目标是实现强大的容器网络模型(CNM),为应用程序提供一致的编程接口和所需的网络抽象。本文将深入解析libnetwork如何实现CNM容器网络模型,帮助新手和普通用户理解容器网络的核心原理。

容器网络模型(CNM)核心组件

CNM(Container Network Model)是libnetwork实现的容器网络模型,它规范了为容器提供网络所需的步骤,同时提供了可用于支持多种网络驱动程序的抽象。CNM建立在三个主要组件之上:

Sandbox(沙箱)

Sandbox包含容器网络堆栈的配置,包括容器接口的管理、路由表和DNS设置。Sandbox的实现可以是Linux网络命名空间、FreeBSD Jail或其他类似概念。一个Sandbox可以包含来自多个网络的多个端点。

Endpoint(端点)

Endpoint将Sandbox连接到Network。Endpoint的实现可以是veth对、Open vSwitch内部端口或类似组件。一个Endpoint只能属于一个网络,并且如果已连接,只能属于一个Sandbox。

Network(网络)

Network是一组能够直接相互通信的Endpoint的集合。Network的实现可以是Linux桥、VLAN等。网络由许多端点组成。

CNM对象详解

NetworkController

NetworkController对象提供了进入libnetwork的入口点,为用户(如Docker Engine)公开了用于分配和管理网络的简单API。libnetwork支持多个活动驱动程序(内置和远程)。NetworkController允许用户将特定驱动程序绑定到给定网络。

Driver

Driver不是用户可见的对象,但驱动程序提供实际的网络实现。NetworkController提供了一个API来配置具有特定于驱动程序的选项/标签的驱动程序,这对libnetwork是透明的,但可以由驱动程序直接处理。驱动程序可以是内置的(如Bridge、Host、None和overlay)和远程的(来自插件提供商),以满足各种用例和部署场景。

Network

Network对象是上面定义的CNM: Network的实现。NetworkController提供API来创建和管理Network对象。每当创建或更新Network时,相应的Driver将收到事件通知。LibNetwork在抽象级别处理Network对象,以提供属于同一网络的一组端点之间的连接以及与其他网络的隔离。Driver执行提供所需连接和隔离的实际工作。连接可以在同一主机内或跨多个主机。因此,Network在集群内具有全局范围。

Endpoint

Endpoint表示服务端点。它为网络中容器公开的服务与网络中其他容器提供的其他服务提供连接。Network对象提供API来创建和管理端点。一个端点只能附加到一个网络。对相应Driver进行端点创建调用,该驱动程序负责为相应的Sandbox分配资源。由于Endpoint表示服务,而不一定是特定容器,因此Endpoint在集群内具有全局范围。

Sandbox

Sandbox对象表示容器的网络配置,如IP地址、MAC地址、路由、DNS条目。当用户请求在网络上创建端点时,将创建Sandbox对象。处理NetworkDriver负责分配所需的网络资源(如IP地址),并将称为SandboxInfo的信息传递回libnetwork。libnetwork将利用特定于操作系统的构造(例如Linux的netns)将网络配置填充到由Sandbox表示的容器中。一个Sandbox可以有多个端点连接到不同的网络。由于Sandbox与给定主机中的特定容器相关联,它具有表示容器所属主机的本地范围。

CNM生命周期

CNM的使用者(如Docker)通过CNM对象及其API进行交互,以将他们管理的容器联网:

  1. DriversNetworkController注册。内置驱动程序在libnetwork内部注册,而远程驱动程序通过插件机制向libnetwork注册(插件机制正在开发中)。每个driver处理特定的networkType

  2. 使用libnetwork.New()API创建NetworkController对象,以管理网络分配并可选地使用特定于驱动程序的Options配置Driver

  3. 使用控制器的NewNetwork()API通过提供namenetworkType创建NetworknetworkType参数有助于选择相应的Driver并将创建的Network绑定到该Driver。从此时起,对Network的任何操作都将由该Driver处理。

  4. controller.NewNetwork()API还接受可选的options参数,该参数携带驱动程序特定的选项和Labels,驱动程序可以将其用于其目的。

  5. 可以调用network.CreateEndpoint()在给定网络中创建新端点。此API还接受驱动程序可以使用的可选options参数。这些"选项"既包含众所周知的标签,也包含特定于驱动程序的标签。驱动程序将依次被调用driver.CreateEndpoint,并且它可以选择在Network中创建Endpoint时保留IPv4/IPv6地址。驱动程序将使用driverapi中定义的InterfaceInfo接口分配这些地址。IP/IPv6需要完成端点作为服务定义以及端点公开的端口,因为本质上服务端点只不过是应用程序容器正在侦听的网络地址和端口号。

  6. endpoint.Join()可用于将容器附加到Endpoint。如果该容器的Sandbox尚不存在,Join操作将创建一个。驱动程序可以使用Sandbox Key来识别附加到同一容器的多个端点。此API还接受驱动程序可以使用的可选options参数。

  7. 容器停止时可以调用endpoint.Leave()Driver可以清理在Join()调用期间分配的状态。当最后一个引用的端点离开网络时,LibNetwork将删除Sandbox。但是,只要端点仍然存在,LibNetwork就会保留IP地址,并在容器(或任何容器)再次加入时重用它们。这确保了容器的资源在停止和再次启动时被重用。

  8. endpoint.Delete()用于从网络中删除端点。这会导致删除端点并清理缓存的sandbox.Info

  9. network.Delete()用于删除网络。如果网络上有任何现有端点,LibNetwork将不允许删除继续。

网络流实现示例

overlay驱动程序使用VXLAN等覆盖网络封装实现可以跨多个主机的网络。以下是overlay网络流的示意图,展示了容器如何通过overlay网络进行通信:

总结

libnetwork通过实现CNM容器网络模型,为容器提供了灵活、可扩展的网络解决方案。其核心组件Sandbox、Endpoint和Network相互协作,实现了容器之间的网络连接和隔离。通过不同的驱动程序(如bridge、overlay等),libnetwork可以适应各种网络环境和需求。希望本文能帮助您深入理解libnetwork的代码实现原理和CNM容器网络模型。

要开始使用libnetwork,您可以通过以下命令克隆仓库:

git clone https://gitcode.com/gh_mirrors/lib/libnetwork

更多详细信息,请参考项目中的官方文档:docs/design.md。

【免费下载链接】libnetworknetworking for containers项目地址: https://gitcode.com/gh_mirrors/lib/libnetwork

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询