容器网络方案分类:
按照来源分类:
1、 docker原生网络方案
2、 第三方网络方案
按照方案是否提供跨主机网络:
1、 单主机网络方案
2、 跨主机网络方案
容器网络库及容器网络模型(Container Network Model):
libnetwork 是 docker 容器网络库,最核心的内容是其定义的 Container Network Model (CNM),这个模型对容器网络进行了抽象,由以下三类组件组成:
1、 Sandbox
容器网络栈。Linux network namespace是标准实现。包括容器interface、路由表、dns设置。
2、 Network
常见的实现,比如linux bridge。
3、 Endpoint
作用是联通sandbox和network。
例子:
1、 sandbox,由 Network Namespace 实现,每个容器有自己的network namespace
2、 network,由linux bridge docker0和br-5d863e9f78b6实现。
3、 endppont,由三对veth pair实现。
网络方案介绍:
Bridge
1、 linux bridge,linux Bridge(网桥)是工作于二层的虚拟网络设备,功能类似于物理的交换机。
2、 veth pair,vth pair 是一对虚拟网卡,从一张veth网卡发出的数据包可以直接到达它的peer veth,两者之间存在着虚拟链路。
3、 特点:
1) container独立的network namespace,用veth pair连接到host上的linux bridge
2) 各bridge网络彼此独立,不同网络不联通,因此同一host上的不同网络下的container不通,不同host上的container更不通。加上路由是否就可以通了?
Docker Overlay
特点
1)各container独立的network namespace
2)各host上新起同样的network namespace,里面生成同样的overlay bridge
3)container通过veth pair连到各host上的overlay bridge
4)各host上的overlay bridge通过vxlan设备建立overlay 网络
5)为了使各container能访问外网,overlay网络方案同时在各主机上创建了bridge用于各container访问外部网络
6)使用consul存储状态数据
7)提供dns服务
Macvlan
macvlan 本身是 linxu kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址,即多个 interface,每个 interface 可以配置自己的 IP。macvlan 本质上是一种网卡虚拟化技术,Docker 用 macvlan 实现容器网络就不奇怪了。
1、网卡虚拟化技术,允许一块网卡配置多个mac地址,即多个interface
2、本质还是单主机网络。需要人工在各host上创建network
3、同时在使用的时候,手动为各container分配静态ip地址,且要避免ip冲突
4、不提供dns服务
5、独占host网卡。为避免这种状况,使用网卡虚拟化技术,将一块网卡上配置上多个sub-interface
6、需要真实存在的网关
Flannel
本质上是把docker默认的相互隔离的docker0网络连起来组成了一个更大的网络,实现了跨主机通信,所以就失去了网络隔离性。
flannel 没有创建新的 docker 网络,而是直接使用默认的 bridge 网络。同一主机的容器通过 docker0 连接,跨主机流量通过 flannel.1 转发。
overlay backend方案:
1、各主机上的interface flanne.1
2、etcd管理各主机上的subnet
3、不提供dns服务
Vxlan backend方案:
1、通过vxlan封装解决不同host上的网络联通
host-gw backend方案:
1、通过路由表的方式解决联通性
Weave
weave 是 Weaveworks 开发的容器网络解决方案。weave 创建的虚拟网络可以将部署在多个主机上的容器连接起来。对容器来说,weave 就像一个巨大的以太网交换机,所有容器都被接入这个交换机,容器可以直接通信,无需 NAT 和端口映射。除此之外,weave 的 DNS 模块使容器可以通过 hostname 访问。
weave 运行了三个容器:
weave 是主程序,负责建立 weave 网络,收发数据 ,提供 DNS 服务等。
weaveplugin 是 libnetwork CNM driver,实现 Docker 网络。
weaveproxy 提供 Docker 命令的代理服务,当用户运行 Docker CLI 创建容器时,它会自动将容器添加到 weave 网络。
1、首先要将不同node加入同一个weave网络
2、bridge + open vswtich,分工不同,bridge负责把容器接入weave网络,open vswitch负责在主机间的vxlan数据转发。
3、bridge负责将docker网络接入weave网络,open vswitch负责vxlan隧道收发数据
4、weave网络默认使用一个大subnet
Calico
Calico 是一个纯三层的虚拟网络方案,Calico 为每个容器分配一个 IP,每个 host 都是 router,把不同 host 的容器连接起来。与 VxLAN 不同的是,Calico 不对数据包做额外封装,不需要 NAT 和端口映射,扩展性和性能都很好。
1、三层网络虚拟方案
2、实现方式的主要技术是路由表配置,需要etcd
3、可以使用network policy
网络方案对比
网络模型
跨主机网络意味着将不同主机上的容器用同一个虚拟网络连接起来。这个虚拟网络的拓扑结构和实现技术就是网络模型。
Docker overlay 如名称所示,是 overlay 网络,建立主机间 VxLAN 隧道,原始数据包在发送端被封装成 VxLAN 数据包,到达目的后在接收端解包。
Macvlan 网络在二层上通过 VLAN 连接容器,在三层上依赖外部网关连接不同 macvlan。数据包直接发送,不需要封装,属于 underlay 网络。
Flannel 我们讨论了两种 backend:vxlan 和 host-gw。vxlan 与 Docker overlay 类似,属于 overlay 网络。host-gw 将主机作为网关,依赖三层 IP 转发,不需要像 vxlan 那样对包进行封装,属于 underlay 网络。
Weave 是 VxLAN 实现,属于 overlay 网络。
各方案的网络模型描述如下:
Docker Overlay | Macvlan | Flannel vxlan | Flannel host-gw | weave | Calico | |
---|---|---|---|---|---|---|
网络模型 | Overlay:VxLAN | Underlay | Overlay:VxLAN | Underlay:纯三层 | Overlay:VxLAN | Unerlay:纯三层 |
Distributed Store
Docker Overlay、Flannel 和 Calico 都需要 etcd 或 consul。Macvlan 是简单的 local 网络,不需要保存和共享网络信息。Weave 自己负责在主机间交换网络配置信息,也不需要 Distributed Store。
Docker Overlay | Macvlan | Flannel vxlan | Flannel host-gw | weave | Calico | |
---|---|---|---|---|---|---|
Distributed Store |
Yes | No | Yes | Yes | No | Yes |
IPAM
Docker Overlay 网络中所有主机共享同一个 subnet,容器启动时会顺序分配 IP,可以通过 --subnet 定制此 IP 空间。
Macvlan 需要用户自己管理 subnet,为容器分配 IP,不同 subnet 通信依赖外部网关。
Flannel 为每个主机自动分配独立的 subnet,用户只需要指定一个大的 IP 池。不同 subnet 之间的路由信息也由 Flannel 自动生成和配置。
Weave 的默认配置下所有容器使用 10.32.0.0/12 subnet,如果此地址空间与现有 IP 冲突,可以通过 --ipalloc-range 分配特定的 subnet。
Calico 从 IP Pool(可定制)中为每个主机分配自己的 subnet。
Docker Overlay | Macvlan | Flannel vxlan | Flannel host-gw | weave | Calico | |
---|---|---|---|---|---|---|
IPAM | 单一大subnet | 自定义 | 每个host一个subnet | 每个host一个subnet | 单一大subnet | 每个host一个subnet |
连通与隔离
同一 Docker Overlay 网络中的容器可以通信,但不同网络之间无法通信,要实现跨网络访问,只有将容器加入多个网络。与外网通信可以通过 docker_gwbridge 网络。
Macvlan 网络的连通或隔离完全取决于二层 VLAN 和三层路由。
不同 Flannel 网络中的容器直接就可以通信,没有提供隔离。与外网通信可以通过 bridge 网络。
Weave 网络默认配置下所有容器在一个大的 subnet 中,可以*通信,如果要实现隔离,需要为容器指定不同的 subnet 或 IP。与外网通信的方案是将主机加入到 weave 网络,并把主机当作网关。
Calico 默认配置下只允许位于同一网络中的容器之间通信,但通过其强大的 Policy 能够实现几乎任意场景的访问控制。
性能
性能测试是一个非常严谨和复杂的工程,这里我们只尝试从技术方案的原理上比较各方案的性能。
最朴素的判断是:Underlay 网络性能优于 Overlay 网络。
Overlay 网络利用隧道技术,将数据包封装到 UDP 中进行传输。因为涉及数据包的封装和解封,存在额外的 CPU 和网络开销。虽然几乎所有 Overlay 网络方案底层都采用 Linux kernel 的 vxlan 模块,这样可以尽量减少开销,但这个开销与 Underlay 网络相比还是存在的。所以 Macvlan、Flannel host-gw、Calico 的性能会优于 Docker overlay、Flannel vxlan 和 Weave。
Overlay 较 Underlay 可以支持更多的二层网段,能更好地利用已有网络,以及有避免物理交换机 MAC 表耗尽等优势,所以在方案选型的时候需要综合考虑。
总结起来,各网络方案的重点区别在于:
1、 是用overlay网络技术联通各容器网络,还是纯unerlay技术+路由
2、 再就是overlay技术网络之间的差别,以及各undeylay技术方案之间的差别
兄弟公司底层网络技术选型:
1、兄弟公司1:calico
2、兄弟公司2:open shiftsdn(open shift定制的SDN网络方案,可类比waeve)
calico于waeve对比:
1)技术复杂度:calico < waeve,calico主要基于简单的路由技术,waeve主要基于复杂的SDN技术。
2)性能:calico > waeve,calico不需要对数据包进行二次封装解封,waeve需要对数据包进行二次封装解封。
3)扩展性:calico < waeve,waeve属于overlay网络,可以支持更多的网段。
从技术复杂度和性能方面看,calico均优于waeve。从使用场景看,容器云平台只限于内部使用,不考虑接入外部用户,隔离及扩展性不是重点,与兄弟公司1相似。因此,底层网络方案建议采用calico。