28.5 网络支持
围绕Docker网络的管理和使用,现在已经诞生了一些方便用户操作的工具和项目,代表性的工具包括pipework、Flannel、Weave以及Calico项目。
28.5.1 pipework
JerOme Petazzoni编写了一个叫pipework的shell脚本,代码托管在https://github.com/jpetazzo/pipework,该工具封装了底层通过ip、brctl等网络设备操作命令,可以简化在比较复杂的场景对容器连接的操作命令。
使用该工具,可以轻松地配置容器的IP地址、为容器划分VLan等功能。
例如,分别启动两个终端,在其中创建两个测试容器c1和c2,并查看默认网卡配置。
利用pipework为容器c1和c2添加新的网卡eth1,并将它们连接到新创建的br1网桥上,如下所示:
- $ sudo pipework br1 c1 192.168.1.1/24
- $ sudo pipework br1 c2 192.168.1.2/24
此时在主机系统中查看网桥信息,会发现新创建的网桥br1,并且有两个veth端口连接上去:
- $ sudo brctl show
- bridge name bridge id STP enabled interfaces
- br1 8000.868b605fc7a4 no veth1pl17805
- veth1pl17880
- docker0 8000.56847afe9799 no veth89934d8
此时,容器c1和c2可以通过子网192.168.1.0/16相互连通。
另外,pipework还支持指定容器内的网卡名称、MAC地址、网络掩码和网关等配置,甚至通过macvlan连接容器到本地物理网卡,实现跨主机通信。
pipework代码只有200多行,建议进行阅读,有助于理解如何利用Linux系统上的iproute等工具实现容器连接的配置。
28.5.2 Flannel
Flannel由CoreOS公司推出,现在主要面向Kubernetes,为其提供底层的网络虚拟化方案,代码托管在https://github.com/coreos/flannel。
Flannel的设计是典型的采用覆盖网络的思路,在每个主机上添加一个隧道端点,所有跨主机的流量会经过隧道端点进行隧道封包(典型为VXLAN协议,Docker Swarm也支持),直接发送到对端,如图28-11所示。

图28-11 Flannel网络示意图
跟传统的基于覆盖网络的网络虚拟化方案类似,这种设计的优势在于有很好的扩展性,只要IP连通的主机即可构成同一个虚拟网络,甚至跨数据中心。问题也很明显,一个是隧道协议目前还比较难追踪,另一个是解包和封包处理负载重,如果没有硬件offload则往往性能会有损耗。还有就是当中间路径存在负载均衡设备时,要避免均衡出现失效。
28.5.3 Weave Net
Weave Net由Weave公司开发的面向容器的网络虚拟化方案,项目托管在https://github.com/weaveworks/weave。
解决容器网络跨主机问题的思路主要是打通跨主机容器之间的通信,主要手段无非是用覆盖网络建立隧道或者是通过更改包头进行转发。
Weave Net的设计比较有意思,在每个主机上添加一个路由器,在混杂模式下使用pcap在网桥上截获网络数据包,如果该数据包是要发送到其他主机上的,则通过UDP进行转发,到目的主机所在的路由器上,目的路由器执行相反的过程利用pcap解析网包再发送给网桥。整个过程是模拟了一个隧道方式。参见图28-12。

图28-12 Weave网络示意图
这样设计的好处是可以进行细粒度的管理,整个转发过程很容易追踪;潜在的问题是对管理平面(特别是路由器的自动收敛和学习)要求比较复杂,并且执行pcap过程会比较消耗计算资源。实际部署中要考虑结合软件定义网络和硬件处理等手段来缓解这两个问题。
28.5.4 Calico
Calico项目官方网站在https://www.projectcalico.org/。
Calico的设计则更为直接,干脆不支持网络虚拟化,直接采用传统的路由转发机制,也是在每个节点上配置一个vRouter,负责处理跨主机的流量。vRouter之间通过BGP自动学习转发策略。

图28-13 Calico网络示意图
由于Calico不采用隧道方式,而是依赖于传统的IP转发,这就限制了它的应用场景,无法跨数据中心,无法保障中间路径安全。但带来了容易管理、转发性能会好的一些优势。
Calico目前支持VM、Docker、Kubernetes、Openstack等多个项目的容器网络功能。
