Docker网络浅析
Docker网络架构源自一种叫作容器网络模型(CNM)的方案,该方案是开源的并且支持插接式连接。Libnetwork是Docker对CNM的一种实现,提供了Docker核心网络架构的全部功能。不同的驱动可以通过插拔的方式接入Libnetwork来提供定制化的网络拓扑。
为了实现开箱即用的效果,Docker封装了一系列本地网络驱动(bridge驱动,overlay驱动,macvlan驱动),覆盖了大部分常见的网络需求,其中包括单机桥接网络(Single-Host Bridge Network)、多机覆盖网络(Multi-Host Overlay),并且支持接入现有VLAN。
bridge驱动
基本原理
基于Linux内核中久经考验达15年之久的Linux Bridge技术
分类
项目 | 默认bridge网络 | 用户自定义bridge网络 |
---|---|---|
连通性 | 相互之间需要通过-p或者--publish选项指明开放的端口,即使是两个容器连接在相同的默认bridge网络之上 | 不需要-p与--publish选项,相互之间的端口全部开放 |
域名解析 | 相互之间使用名称通信时需要指定--link选项,这种方式已过时并且不容易调试 | 无需特别指定选项,可直接通过名称与别名通信 |
热插拔 | 需要停止容器的执行并重新创建容器才能离开或者加入默认bridge网络 | 支持随时加入与离开某个用户自定义bridge网络 |
热插拔 | 系统中只能存在一个默认网络,牵一发而动全身 | 可定义多个用户自定义网络,每个可单独配置 |
热插拔 | 不支持通过--link选项的方式共享环境变量,更高级的共享环境变量的方式:data volume、docker-compose、docker-configs | 支持通过--link选项的方式共享环境变量 |
使用场景
适用于测试开发或者小规模应用环境的使用
特点
1,需要通过端口映射的方式,建立主机到docker端口的映射来提供跨主机间容器的服务通信
2,成熟稳定且高性能
macvlan驱动
基本原理
macvlan虚拟网卡技术,是linux内核再3.9版本之后提供的新特性,允许再同一个物理网卡配置多个mac地址,Macvlan允许你在主机的一个网络接口上配置多个虚拟的网络接口,这些网络interface 有自己独立的MAC地址,也可以配置上IP地址进行通信。Macvlan 下的虚拟机或者容器网络和主机在同一个网段中,共享同一个广播域。
分类
VEPA(Virtual Ethernet Port Aggregator)
所有从 Macvlan 接口发出的流量,不管目的地全部都发送给父接口,即使流量的目的地是共享同一个父接口的其它 Macvlan 接口。如果想在物理交换机层面对虚拟机或容器之间的访问流量进行优化设定,VEPA 模式将是一种比较好的选择。
Bridge
Bridge模式为macvlan的默认使用模式。拥有相同父接口的两块 Macvlan 虚拟网卡是可以直接通讯的,不需要把流量通过父网卡发送到外部网络,广播帧将会被泛洪到连接在”网桥”上的所有其他子接口和物理接口。这比较适用于让共享同一个父接口的 Macvlan 网卡进行直接通讯的场景。
Private
此种模式相当于VEPA模式的增强模式,其完全阻止共享同一父接口的 Macvlan 虚拟网卡之间的通讯。
passthru
此种模式会直接把父接口和相应的MacVLAN接口捆绑在一起,这种模式每个父接口只能和一个 Macvlan 虚拟网卡接口进行捆绑,并且 Macvlan 虚拟网卡接口继承父接口的MAC地址。此种模式的优点是虚拟机和容器可以更改 MAC 地址和其它一些接口参数。
使用场景
macvlan能够将容器网络连接到外部系统以及物理网络,适用于应用中已容器化的部分需要与那些运行在物理网络和VLAN上的未容器化部分进行通信的场景
特点
1,Linux 主机连接的交换机可能会限制同一个物理端口上的 MAC 地址数量。虽然你可以让网络管理员更改这些策略,但有时这种方法是无法实行的(比如你要去给客户做一个快速的 PoC 演示)。
2,许多 NIC 也会对该物理网卡上的 MAC地址数量有限制。超过这个限制就会影响到系统的性能。
3,IEEE 802.11 不喜欢同一个客户端上有多个 MAC 地址,这意味着你的 Macvlan 子接口在无线网卡或 AP 中都无法通信。可以通过复杂的办法来突破这种限制,但还有一种更简单的办法,那就是使用 Ipvlan,感兴趣可以自己查阅相关资料。
4,需要主机网卡开启混杂模式,需要内核支持
overlay驱动
基本原理
Docker使用VXLAN隧道技术创建了虚拟二层覆盖网络。在VXLAN的设计中,允许用户基于已经存在的三层网络结构创建虚拟的二层网络,VXLAN的美妙之处在于它是一种封装技术,能使现存的路由器和网络架构看起来就像普通的IP/UDP包一样,并且处理起来毫无问题。
模型图
VTEP(VXLAN Tunnel Endpoints):vxlan 网络的边缘设备,用来进行 vxlan 报文的处理(封包和解包)。vtep 可以是网络设备(比如交换机),也可以是一台机器(比如虚拟化集群中的宿主机) VNI(VXLAN Network Identifier):VNI 是每个 vxlan 的标识,是个 24 位整数,一共有 2^24 = 16,777,216(一千多万),一般每个 VNI 对应一个租户,也就是说使用 vxlan 搭建的公有云可以理论上可以支撑千万级别的租户 Tunnel:隧道是一个逻辑上的概念,在 vxlan 模型中并没有具体的物理实体想对应。隧道可以看做是一种虚拟通道,vxlan 通信双方(图中的虚拟机)认为自己是在直接通信,并不知道底层网络的存在。从整体来说,每个 vxlan 网络像是为通信的虚拟机搭建了一个单独的通信通道,也就是隧道
vxlan 的工作模型,它创建在原来的 IP 网络(三层)上,只要是三层可达(能够通过 IP 互相通信)的网络就能部署 vxlan。在每个端点上都有一个 vtep 负责 vxlan 协议报文的封包和解包,也就是在虚拟报文上封装 vtep 通信的报文头部。物理网络上可以创建多个 vxlan 网络,这些 vxlan 网络可以认为是一个隧道,不同节点的虚拟机能够通过隧道直连。每个 vxlan 网络由唯一的 VNI 标识,不同的 vxlan 可以不相互影响。
使用场景
不改变现有网络基础设施的前提下,overlay的二层网络完全基于现有主机的三层网络之上实现通信,简易实现大规模的容器应用跨主机通信
特点
1,VXLAN能够突破VLAN的4000数量限制支持高达16M的不同overlay数量,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。
2,主流的容器跨节点数据传输和路由方案
参考文档
https://cizixs.com/2017/09/25/vxlan-protocol-introduction/
https://blog.z0ukun.com/?p=739