docker overlay网络测试

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的方案。因此是简单的测试,所有我做的比较简单

$export HostIP=

hostname -i

$PROJ="etcd-calico"
$IMG="xxxxx/etcd:latest"
$sudo docker rm -f etcd
$sudo docker run --restart=always -d -v /usr/share/ca-certificates/:/etc/ssl/certs -p 4001:4001 -p 2380:2380 -p 2379:2379 \
--name etcd $IMG \
etcd -name $PROJ \
-advertise-client-urls http://${HostIP}:2379,http://${HostIP}:4001 \
-listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 \
-initial-advertise-peer-urls http://${HostIP}:2380 \
-listen-peer-urls http://0.0.0.0:2380 \
-initial-cluster-token etcd-cluster-1 \
-initial-cluster $PROJ=http://${HostIP}:2380 \
-initial-cluster-state new

3.1. 2 swarm部署
挑选3个机器部署swarm的管理节点

$docker run --restart=always --name swarm-mng -d -p 8888:2375 swarm manage etcd://XXXXX:2379/swarm"

然后所有的节点起agent join上去

$docker run --restart=always --name swarm-agent -d swarm join --addr=$(hostname -i):2375 etcd://xxxx:2379/swarm

3.2 官方overlay部署

管方的overlay配置比较简单

$docker network create  --driver overlay  --subnet 10.1.0.0/16 --gateway=10.1.0.1 vxlan

需要注意指明overlay使用的宿主机器网卡

$cat /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target
Wants=docker-storage-setup.service
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
ExecStart=/usr/bin/docker daemon  -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --registry-mirror=https://wfsgsp6x.mirror.aliyuncs.com --insecure-registry=my.reg  $OPTIONS   \
           --insecure-registry my.reg2 \
           --cluster-advertise=eth0:2376 --cluster-store etcd://XXX:2379/overtest \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
MountFlags=shared
TimeoutStartSec=1min
Restart=on-failure
[Install]
WantedBy=multi-user.target

3.3 calico部署

  1. 部署
    $echo "export ETCD_ENDPOINTS=http://XXXX:2379" >> /etc/profile
    $source /etc/profile;calicoctl node --libnetwork
    $source /etc/profile;calicoctl status
    XXX:
    calico-node container is running. Status: Up 48 seconds
    IPv4 BGP status
    IP: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 |
    +--------------+-------------------+-------+----------+-------------+
  2. 使用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
  3. 使用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
此条目发表在System分类目录。将固定链接加入收藏夹。

发表评论