本系列文章将介绍 Docker的相关知识:html
(1)Docker 安装及基本用法linux
(2)Docker 镜像nginx
(3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境docker
(4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源后端
(5)Docker 网络api
(6)若干企业生产环境中的容器网络方案安全
Docker 在早期只有单机上的网络解决方案,在 1.19 版本引入了原生的 overlay 网络解决方案,可是它的性能损耗较大,可能没法适应一些生产环境的要求。除了Docker 提供的解决方案外,还有其它一些开源的解决方案。本文首先会简介各类已有的方案,而后根据公开分享的资料,总结一下部分企业在生产环境中对容器网络的选型和考量。服务器
Flannel 是由 CoreOS 主导的解决方案。Flannel 为每个主机的 Docker daemon 分配一个IP段,经过 etcd 维护一个跨主机的路由表,容器之间 IP 是能够互相连通的,当两个跨主机的容器要通讯的时候,会在主机上修改数据包的 header,修改目的地址和源地址,通过路由表发送到目标主机后解包。封包的方式,能够支持udp、vxlan、host-gw等,可是若是一个容器要暴露服务,仍是须要映射IP到主机侧的。网络
Calico 是个年轻的项目,基于BGP协议,彻底经过三层路由实现。Calico 能够应用在虚机,物理机,容器环境中。在Calico运行的主机上能够看到大量由 linux 路由组成的路由表,这是calico经过自有组件动态生成和管理的。这种实现并无使用隧道,没有NAT,致使没有性能的损耗,性能很好,从技术上来看是一种很优越的方案。这样作的好处在于,容器的IP能够直接对外部访问,能够直接分配到业务IP,并且若是网络设备支持BGP的话,能够用它实现大规模的容器网络。但BGP带给它的好处的同时也带给他的劣势,BGP协议在企业内部还不多被接受,企业网管不太愿意在跨网络的路由器上开启BGP协议。架构
跨主机的容器网络解决方案不外乎三大类:
来源:https://www.douban.com/note/530365327/
结论:
方案 | 结论 | 优点 | 劣势 |
weave(udp) | 真是惨,生产环境就别考虑了。看了下他们的架构,以为即使是 fast-data-path 也没多大意义。 | 无 | 就是个渣渣,概念好毛用都没 |
calico | calico 的 2 个方案都有不错的表现,其中 ipip 的方案在 big msg size 上表现更好,但蹊跷是在 128 字节的时候表现异常,屡次测试如此。bgp 方案比较稳定,CPU 消耗并无 ipip 的大,固然带宽表现也稍微差点。不过总体上来讲,不管是 bgp 仍是 ipip tunnel,calico 这套 overlay sdn 的解决方案成熟度和可用度都至关不错,为云上第一选择。 | 性能衰减小,可控性高,隔离性棒 | 操做起来仍是比较复杂,好比对 iptables 的依赖什么的 |
flannel | flannel 的 2 个方案表现也凑合,其中 vxlan 方案是由于无法开 udp offload 致使性能偏低,其余的测试报告来看,一旦让网卡自行解 udp 包拿到 mac 地址什么的,性能基本上能够达到无损,同时 cpu 占用率至关漂亮。udp 方案受限于 user space 的解包,仅仅比 weave(udp) 要好一点点。好的这一点就是在实现方面更加高效。 | 部署简单,性能还行,能够兼容老版本 docker 的启动分配行为,避免 launcher | 无法实现固定 IP 的容器漂移,无法多子网隔离,对上层设计依赖度高,没有 IPAM,对 docker 启动方法有绑定 |
docker 原生 overlay 方案 | 其实也是基于 vxlan 实现的。受限于 cloud 上不必定会开的网卡 udp offload,vxlan 方案的性能上限就是裸机的 55% 左右了。大致表现上与 flannel vxlan 方案几乎一致。 | docker 原生,性能凑合 | 对内核要求高(>3.16),对 docker daemon 有依赖需求 ( consul / etcd ),自己驱动实现仍是略差点,能够看到对 cpu 利用率和带宽比一样基于 vxlan 的 flannel 要差一些,虽然有 api 但对 network 以及多子网隔离局部交叉这种需求仍是比较麻烦,IPAM 就是个渣 |
综上,云上能用 BGP 就果断上 calico bgp 方案,不能用 BGP 也能够考虑 calico ipip tunnel 方案,若是是 coreos 系又能开 udp offload,flannel 是不错的选择。Docker overlay network 还有很长一段路要走,weave 就不用考虑了。
(0)PPTV 容器云架构
(1)网络需求
(2)选中的方案
最终 PPTV 选中基于docker的bridge模式,将默认的docker bridge网桥替换为 linuxbridge,把 linuxbridge 网段的 ip 加入到容器里,实现容器与传统环境应用的互通。
docker network create --gateway10.199.45.200 --subnet 10.199.45.0/24 -o com.docker.network.bridge.name=br-oak--aux-address "DefaultGatewayIPv4=10.199.45.1" oak-net
(3)问题及解决方案
经过网桥的方式解决容器网络有两个问题:
(1)网络需求
让每一个容器拥有本身的网络栈,特别是独立的 IP 地址
可以进行跨服务器的容器间通信,同时不依赖特定的网络设备
有访问控制机制,不一样应用之间互相隔离,有调用关系的可以通信
(2)调研过程和最终的选择
调研了几个主流的网络模型:
Docker 原生的 Bridge 模型:NAT 机制致使没法使用容器 IP 进行跨服务器通信(后来发现自定义网桥能够解决通信问题,可是以为方案比较复杂)
Docker 原生的 Host 模型:你们都使用和服务器相同的 IP,端口冲突问题很麻烦
Weave OVS 等基于隧道的模型:因为是基于隧道的技术,在用户态进行封包解包,性能折损比较大,同时出现问题时网络抓包调试会很蛋疼
各类方案的限制:
Weave:它的思路是共享IP而非绑定。在传输层先找到目标地址,而后把包发到对端,节点之间互相经过协议共享信息。Flannel和Weave的特色是相似的,都用的是UDP或者是VxLAN的技术。事实上使用UDP性能是不好的,VxLAN和UDP差很少,它有一个网络切隔,并且在里面能够跑二层协议。还有一种是IPIP封包,直接把一个IP包封装在一个IP包里面。以上不难看出,原生网络性能比较差,使用UDP的时候性能损失在50%以上,使用VxLAN也会有20%~30%的损耗。因此我要在内核上封包,使用硬件来解决这些问题。并且容器和容器之间出现通信故障,调试的时候很是困难
(3)Calico 使用总结
根据 2016 北京容器大会 《魅族云容器化建设》 文档的一些总结:
(1)使用 OVS port 替代 OVS veth 能够带来较大的性能提高
(2)使用 SR-IOV
(3)使用 DPDK
上面的几个生产环境中的网络解决方案,它们的目的都是为了把容器看成虚机用,所以都有共同的需求,好比:
要知足以上要求,可能 OVS/Linux-bridge + VLAN 方案应用的比较多,同时看起来 Calico 方案看起来前景不错。
参考连接: