/ vxlan

Kubernets,Flannel,Docker网络性能深度测试

啰嗦

前阵子我们CacheMoment.com的产品上线了, 随着正式和测试用户的增多,愈发感觉docker的管理和调度是个问题。在产品还在开发的阶段时,我一直用自己写的ansible(后来改为了chef+Rake任务)基于docker的API来管理,后面觉得需要自己要做的事情太多,这个东西开发量也不小,对于一个只有3个人的初创公司来说,太耗精力。毕竟创业初期,产品是第一位的。再后来看到了shipyard和swarm都觉得很不错,当时因为swarm还不够成熟就放弃了,选择了shipyard,用起来很爽~。不过用了段时间后发现,这个东西不适合生产级别,内部测试或者玩儿玩儿还是可以的,很精炼。于是就把目光转向了Google的Kubernetes。

其实我很早就接触了Kubernetes(以下简称k8s),那时学习曲线太(浮)陡(躁),而且当时的我更拥抱使用Docker Native API的Swarm。在这次深入调研了1周k8s后,有些醍醐灌顶的感觉。如果你也做过多年的运维,尤其是参与过运维体系(技术+管理)的建立、管理,或者对之有些想法的人,我相信从k8s上你能感受的不仅仅是技术本身,还有很多对于集群管理经验的体现。对于Swarm和Kubernetes的对比,不在本文的讨论范畴,以后再详聊。

正文

Docker网络模式及性能

我们的产品对于网络的要求比较高,那自然使用docker了之后,自然要关心下docker的网络性能了,不幸的是如果你使用默认的Bridge模式的话,性能差的没法看,基本也就30% ~ 40% Native的性能。Host模式的话大约能有95%左右。具体可以参见一下github上关于这部分的讨论
https://github.com/docker/docker/issues/7857

Docker+Flannel(k8s的标配)

Kubernets 默认使用了CoreOS项目里的Flannel,其依赖于同样来自CoreOS的Etcd。

Flannel默认有几种工作模式:

  • udp - 默认

  • vxlan - 目前CacheMoment正在使用的模式

  • host-gw

  • aws

  • gce

  • alloc

测试过程

测试主要是对比3个数据,原生(宿主机),docker+flannel udp模式,docker+flannel vxlan模式。

测试是在ustack广东一区上,机器类型是standard-2(2 vCPU, 4G RAM)
软件版本:

  • kubernetes v1.1.1
  • flannel v0.5.5
  • etcd v2.2.2
  • docker v1.9.0-1
原生(Native)

ustack原生网络性能

吐槽一下: 性能真挫,所以后买云主机,别光看磁盘和CPU。

docker+flannel udp模式

docker+flannel udp

docker+flannel vxlan模式

docker+flannel vxlan

汇总一下对比结果

对比结果

高下立判。vxlan模式无论是吞吐还是延迟都已经非常接近原生的性能。

其实如果原生的网络性能更好的话,比如在AWS或者DO上,这个性能差距估计更大。

如何开启flannel vxlan?

全新安装

其实很简单,在etcd里创建网络的时候增加一个backend的参数即可。

etcdctl set /cachemoment.com/network/config '{"Network": "172.88.0.0/16", "Backend": {"Type": "vxlan"}}'
由UDP模式切换到VXLAN模式

1 删除原来所有的子网信息

etcdctl rm --recursive /cachemoment.com/network/subnets

2 添加新的vxlan模式的子网

shell > etcdctl set /cachemoment.com/network/config '{"Network": "172.88.0.0/16", "Backend": {"Type": "vxlan"}}'


shell > {"Network": "172.88.0.0/16", "Backend": {"Type": "vxlan"}}

3 重启flannel,docker服务

for i in flannel docker do;then
  systemctl restart $i
done

生效后可以看到,flannel的网卡接口会由flanne0变为flannel.1

fannle.1

如果没生效的话,可以强制重建

systemctl stop docker
ifconfig docker0 down
brctl delbr docker0
systemctl start docker

斯逼

其实我个人更喜欢OVS,毕竟相对Weave和Flannel来说,成熟许多。而且网络规模,业务并发量大的话OVS更稳定一些,就是配置是最麻烦的。至于Weave,性能没法看,不推荐在生产使用,不过可以期待新的fast datapath技术,据官方说性能很牛逼https://github.com/weaveworks/weave/releases/tag/v1.2.0 具体大家可以google一下老外的一些测试报告。

比如这个Weave Networking Performance with the New Fast Data Path