1. 容器网络模型(CNM)
Docker网络架构建立在一组称为容器网络模型(CNM)的接口上。CNM的理念实现了在不同基础设施的应用程序可移植性,同时在功能方面也具有不错的表现。
CNM架构
CNM中有几个比较重要的概念。它们都是与操作系统和基础架构无关的,因此无论基础架构堆栈如何,应用程序都可以无感知的使用。
沙箱(Sandbox)-沙箱包含容器的网络堆栈的配置。这包括对容器接口,路由表和DNS设置的管理。沙盒的实现可以是Linux网络命名空间,FreeBSD Jail或其他类似的概念。沙盒可能包含来自多个网络的许多端点(Endpoint)。
端点(Endpoint)-端点将沙盒连接到网络。存在Endpoint构造,因此可以从应用程序中抽象出到网络的实际连接。这有助于保持可移植性,以便服务可以使用不同类型的网络驱动程序,而不必担心其与该网络的连接方式。
网络-CNM未根据OSI模型指定网络。网络的实现可以是Linux网桥,VLAN等。网络是端点之间具有连通性的集合。未连接到网络的端点将无法在网络上建立连接。
2. CNM驱动程序接口
容器网络模型提供了两个可插拔的开放接口,用户,社区和供应商可以使用它们来控制网络中的某些功能,可见性或网络控制。
2.1 网络驱动种类
1. 网络驱动程序(Network Drivers):Docker网络驱动程序才是网络正常工作的实际实现。可以在给定的Docker引擎或集群上同时使用多个网络驱动程序,但是每个Docker网络只能通过单个网络驱动程序实例化。 CNM网络驱动程序有两种类型:
- 内置网络驱动程序(Built-In Network Drivers)
内置网络驱动程序是Docker引擎自带的。支持多种功能(如覆盖网络(overlay)或本地网桥(bridge)等。
- 插件网络驱动程序(Plug-In Network Drivers):
插件网络驱动程序是由社区和其他供应商创建的网络驱动程序。这些驱动程序可用于提供与现有软件和硬件的集成。如果用户需要现有网络驱动程序不支持的特定功能,则用户还可以创建自己的驱动程序。
2. IPAM驱动程序(IPAM Drivers):Docker具有内置的IP地址管理驱动程序,如果未指定,则可为网络和端点提供默认子网或IP地址。 IP地址也可以通过网络,容器和服务创建命令手动分配。还存在提供与现有IPAM工具集成的插件IPAM驱动程序。
2.2 Docker内置网络驱动程序
Docker内置网络驱动程序是Docker Engine的一部分,不需要任何额外的模块。它们是通过标准docker网络命令调用和使用的。
- 桥接(Bridge)
桥接器驱动程序在由Docker管理的主机上创建一个Linux桥接器。默认情况下,同一网桥上的容器将能够相互通信。也可以通过桥驱动程序配置对容器的外部访问,比如暴露端口给宿主机。
2. 覆盖(Overlay )
覆盖驱动会创建一个网络,用于支持多主机网络之间的通信。它综合使用本地Linux桥接器和VXLAN,在物理网络基础结构之上实现了容器到容器通信。
3. MACVLAN :
MACVLAN桥接模式在容器接口和父主机接口(或子接口)之间建立连接。它可用于在物理网络路由时向容器提供IP地址。
4. 主机(Host)
通过主机驱动程序,容器可以使用主机的网络堆栈。没有名称空间分隔,并且容器上的主机可以直接使用主机上的所有接口。
5. None
none驱动程序为容器提供了自己的网络堆栈和网络名称空间,但未在容器内部配置接口。如果没有其他配置,容器将与主机网络堆栈完全隔离。
2.3 默认Docker网络
默认情况下,每个Docker主机上都将存在一个none,host和bridge网络。
docker network ls
NETWORK ID NAME DRIVER SCOPE
586a36e086f7 bridge bridge local
2bfc11ef0ee5 host host local
58d16c5e8fc6 none null local
这些网络无法删除。实例化Swarm时,会自动创建两个附加网络,即名为docker_gwbridge的网桥网络和名为ingress的覆盖网络,用于集群联网。
docker network ls命令显示了Docker Swarm的以下默认Docker网络:
NETWORK ID NAME DRIVER SCOPE
1475f03fbecb bridge bridge local
e2d8a4bd86cb docker_gwbridge bridge local
407c477060e7 host host local
f4zr3zrswlyg ingress overlay swarm
c97909a4b198 none null local
除了这些默认网络之外,还可以创建用户定义的网络。
2.4 网络范围
从docker network ls输出中可以看出,Docker网络驱动程序具有作用域(SCOPE)的概念。网络作用域是驱动程序的域,local表示本机作用域,在主机范围内提供连接和网络服务(例如DNS或IPAM),swarm表示群集作用域,可跨群群集提供连接和网络服务。群集范围网络在整个群集中将具有相同的网络ID,而本地范围网络将在每个主机上具有唯一的网络ID。
3. Linux网络基础
Linux内核具有非常成熟和高性能的TCP / IP堆栈实现(除了DNS和VXLAN等其他本机内核功能)。 Docker网络使用内核网络堆栈作为底层创建高级网络驱动程序。简而言之,Docker网络就是Linux网络。
现有Linux内核功能的这种实现可确保高性能和鲁棒性。最重要的是,它提供了跨许多发行版和版本的可移植性,从而增强了应用程序的可移植性。
Docker使用多种Linux网络构建模块来实现其内置的CNM网络驱动程序。该列表包括Linux桥接器,网络名称空间,veth对和iptables。网络工具的组合为复杂的网络策略提供了转发规则,网络分段和管理工具。
- Linux桥(Bridge)
Linux网桥是第2层设备,它是Linux内核内部物理交换机的虚拟实现。它根据MAC地址转发流量,该MAC地址通过检查流量动态学习。 Linux桥接器在许多Docker网络驱动程序中广泛使用。 Linux桥接器不应与Docker桥接器网络驱动程序混淆,后者是Linux桥接器的更高级别的实现。
- 网络命名空间(namespace)
Linux网络名称空间是内核中的隔离网络堆栈,具有自己的接口,路由和防火墙规则。考虑到容器和Linux主机间的的安全性方面,用于隔离容器。网络名称空间可确保同一主机上的两个容器无法相互通信,甚至不能与主机本身进行通信,除非配置为通过Docker网络进行通信。通常,CNM网络驱动程序为每个容器实现单独的名称空间。但是,容器可以共享相同的网络名称空间,甚至可以是主机的网络名称空间的一部分。主机网络名称空间包含主机接口和主机路由表。
- 虚拟以太网设备(veth)
虚拟以太网设备或veth都是Linux网络接口,充当两个网络名称空间之间的连接线。 veth是全双工链接,在每个名称空间中都有一个接口。一个接口中的流量被引向另一接口。创建Docker网络时,Docker网络驱动程序利用veth在名称空间之间提供显式连接。当容器连接到Docker网络时,veth的一端放置在容器内部(通常视为ethX接口),而另一端连接到Docker网络。
- iptables
iptables是本机数据包过滤系统,自2.4版以来已成为Linux内核的一部分。它是功能丰富的L3 / L4防火墙,可为包标记,伪装和丢弃提供规则链。内置的Docker网络驱动程序广泛使用iptables来划分网络流量,提供主机端口映射以及标记流量以进行负载平衡决策。
4. Docker网络控制平面
Docker分布式网络控制平面除了传播控制平面数据外,还管理Swarm范围的Docker网络的状态。它是Docker Swarm集群的内置功能,不需要任何其他组件,例如外部KV存储。控制平面使用基于SWIM的Gossip协议在Docker容器集群之间传播网络状态信息和拓扑。 Gossip协议在达到群集内最终的一致性时非常高效,同时在大型群集上保持恒定的消息大小,故障检测时间和收敛时间不变。这样可确保网络能够在许多节点上进行扩展,而不会引入扩展问题,例如收敛缓慢或误报节点故障。
控制平面是高度安全的,通过加密通道提供机密性,完整性和身份验证。每个网络都对它进行了范围划分,减少了给定主机接收数据的更新时间。
它由几个组件组成,这些组件共同协作以在大型网络中实现快速融合。控制平面的分布式特性可确保群集控制器故障不会影响网络性能。
Docker网络控制平面组件如下:
消息分发:以对等方式更新节点,将每次交换中的信息发到更大的节点组。对等组的固定间隔和大小可确保网络使用情况保持恒定。跨对等体的指数信息传播可确保收敛速度快且在任何群集大小范围内均不受限制。
故障检测:利用直接和间接的hello消息排除网络拥塞和特定路径,以免导致误报的节点故障。
全量状态同步:定期同步,以更快地实现一致性并解决网络分区。
拓扑感知:此算法能够容忍自身与其他对等方之间的相对延迟。这用于优化对等组,从而使收敛更快,更有效。
控制平面加密:可防止中间人攻击和其他可能危害网络安全的攻击。
Docker网络控制平面是Swarm的组件,并且需要Swarm集群才能运行。
来源:oschina
链接:https://my.oschina.net/woniuyi/blog/4949826