1. docker网络现状
当前虽然docker网络的解决方案很多,但是docker官方的方案都不是太成熟,原因有以下几点:1. host/bridge这种模式只适合自己在virtualbox上玩玩,bridge模式NAT依赖contrack表在session多的时候会让你机器都登陆不上(不要YY把nf_conntrack_max配置的大点能高枕无忧)。2. 剩下的macvlan/ipvlan其实是更适合中大型企业现有VLAN模型的方案,无耐对内核的要求太高,基本就是没法用。没人会因为尝试docker把生产OS切到4.X的版本。3. 在最新版本的docker中,已经可以创建overlay的网络类型了。但是稳定性还有待考验。
在我看来,一个成熟的虚拟化网络整体方案,需要满足2个场景:1. 支持传统的基本VLAN模式,这是能在企业内快速实施的基础条件。因此现在大家的企业对docker的扩展都是在用ovs之类的支持vlan。2. 支持overlay,但是这个overlay不是纯孤立的一个网络。需要能做到跨network的联通,也要能做到与真实网络的打通。
2. 尝试过的docker网络方案
目前尝试过calico和官方的overlay方案。
2.1 calico方案
calico本质上是自己在一组机器上创建一个BGP网络,自己控制一个虚拟网络中下一跳得路由,三层能通的机器都部署calico。如果是在共有云的机器上,因为大家都会在宿主机器上做arp绑定等控制,只需要加一下IPIP让豹纹发出之前做一次ipip封装即可。对calico的测试用得比较多,一个主管的判断就是:能用,不够可靠。所谓的不够可靠主要体现在几方面:1. 有时扩容一个节点,calico-node容器死活起不来,无奈的时候只能把KVstore整个目录干掉,相当于整个集群铲了重建。2. 一个机器重启,发现起不来了。。然后整个集群重建。
2.2 官方overlay的方案
官方overlay的方案相对来说会更可靠,因为它会随着docker每个release的版本不断成熟。相关的例子可以参考nginx商业化后的行为,天然会排斥一些和自己有竞争关系的公司的方案。官方的overlay本质上是走vxlan,性能上可能会calico稍微差一些。
3. 部署案例
3.1 swarm部署
3.1.1 etcd部署每个方案的实施都是需要先部署一个swarm集群。swarm部署的基础关键在准备好一套KV的方案。因此是简单的测试,所有我做的比较简单
hostname -i
3.1. 2 swarm部署挑选3个机器部署swarm的管理节点
然后所有的节点起agent join上去
3.2 官方overlay部署
管方的overlay配置比较简单
需要注意指明overlay使用的宿主机器网卡
3.3 calico部署
1. 部署$
echo "
export ETCD_ENDPOINTS=http://XXXX:2379" >> /etc/profile$
source /etc/profile;
calicoctl node --libnetwork$
source /etc/profile;
calicoctl statusXXX:calico-node container is running. Status: Up 48 secondsIPv4 BGP statusIP:XXXX.37 AS Number: 64511 (inherited)+--------------+-------------------+-------+----------+-------------+| Peer address | Peer type | State | Since | Info |+--------------+-------------------+-------+----------+-------------+| XXXX.22 | node-to-node mesh | up | 06:04:52 | Established ||
XXXX.23 | node-to-node mesh | up | 06:04:52 | Established ||
XXXX.39 | node-to-node mesh | up | 06:04:52 | Established |+--------------+-------------------+-------+----------+-------------+
- 使用docker的ipam driver 创建网络(支持端口暴露,不支持策略控制)$docker network create –driver calico –opt nat-outgoing=true –opt ipip=false –subnet=10.10.0.0/22 vnet$docker network create –driver calico –opt nat-outgoing=true –opt ipip=true –subnet=10.11.0.0/22 ipipnet
- 使用calico自己的IPAM(支持访问策略控制,不支持端口暴露)$calicoctl pool add 100.100.1.0/24 –nat-outgoing$calicoctl pool add 100.100.2.0/24 –nat-outgoing$docker network create –driver calico –ipam-driver calico –subnet=100.100.1.0/24 vnet1$docker network create –driver calico –ipam-driver calico –subnet=100.100.2.0/24 vnet2