腾讯Gaia平台的Docker应用实践(3)
下面介绍一下SR-IOV技术,SR-IOV技术是一个硬件虚拟化技术,它可以由一个网卡虚拟出多个功能接口,每个功能接口实际上是可以做一个网卡使用的.通过这种硬件取代内核的虚拟网络设备的方式,可以极大的提高网络的性能,并且减少了物理机CPU的消耗.Docker 1.9.0版本支持网络插件的方式,所以我们实现了一个SR-IOV的网络插件,去非常方便的使用这种方式. 下面(图4)的一个图表就是我们测试使用SR-IOV之后所带来的性能的提升.横坐标是测试的主要是在虚拟化比是1:1和1:4的情况下,网络流量包的大小是1个字节、64个字节和256个字节的情况下SR-IOV的方式相比NAT方式所带来的包量的提升. 图 4 Docker Overlay网络模式第三就是Overlay网络为我们提供了多租户网络隔离功能,并且每个租户可以分配一个独立的虚拟的IP段.这种方式不需要分配一个内网的IP,也不需要依赖于NAT的方式,这种方式想必是以后必然会用上的一种多租户的一个解决方案.但是Docker原生的Libnetwork在overlay driver为接入的Container默认连接了一个NAT网络对外提供服务,通过这个NAT的网络Container就不单可以访问与自己位于一个Overlay的其它的Container,也可以访问外网,因为它是通过NAT的方式去访问的.但是很多Container并不一定需要访问内网或者外网,所以我们给Libnetwork对象增加了一个internal开关,创建完全与外界隔离的一个网络. 图 5 这个图(图5 )是位于不同主机上的5个Container,C1和C2构成一个Overlay网络,C3、C4、C5构成另外一个Overlay网络,这两个网络彼此之间不同,如果说某些Container想要对外提供服务,这时候我们可以给它分配一个内网的IP,让它对外提供服务. Container数据存储接下来分享一下我们在存储方面的工作.Container数据存储相信也是使用Docker的人绕不开的一个问题.我们的做法就是在Container迁移后不需要保留的数据,就给它分配一个host volume进行存储它的数据.如果这个Container迁移之后它的数据需要保留,给它分配一个Ceph RBD存储,我们是使用了Ceph volume plugin为每个Container分配一个RBD的存储目录. Container资源隔离接下来介绍一下我们在资源隔离方面的一些工作.Docker本身对内存的控制是hard limit方式,就是Container的进程的内存如果超过它申请的,比如说5G的一个总的上限,它就会将这个Container给杀掉.但是这种方式就非常不方便,比如说用户可能并不知道它的Container实际到峰值的时候使用到多少的内存,并且在很多情况下当Container超过它的内存上限的时候,这个机器的所有内存其实还有很多的空闲,这时候我们的做法是为这个机器上所有的Container设置一个总的流程上限,Hard limit.单个Container内存使用超出申请值,如果这个机器的所有Container没有超出设置的总的Hard limit值时不会触发kill,只有当总的内存超过Hard limit一定的百分比之后,才kill那些超出内存申请值最多的Container,这种方式可以大大降低集群中Container被kill的几率. 网络出带宽控制下面一点是我们在做网络出带宽的控制的时候发现,如果直接使用net_cls的方式对流量进行标志的时候,数据包会经过bridge之后pid会发生丢失,这时候打的标记是没有效果的.所以我们的做法就是在iptables的mangle表中对Container出流量按IP进行标记,这个时候我们就可以方便的使用TC工具对标记的流量进行限制. 容器中资源显示问题下面一个问题也是很多讲师都讲到的问题,是容器中自然显示的问题,原先跑在物理机或者虚拟机中的业务在使用腾讯网管系统记录机器的资源使用情况,但是如果都迁移到Container中之后,这个时候Container中显示的资源可能是主机的资源,那并不是它自己实际使用的资源.所以我们就需要解决这个问题,可能有一些团队是通过修改内核的方式去解决的,但是修改内核可能还需要自己维护这些patch.我们的做法就是通过FUSE实现了一个用户态的文件系统,这个用户态的文件系统使用的是Cgroup的数据统计Container的实际资源使用,它可以为每个Container生成仿真的meminfo stats或者diskstats cpuuinfo文件,然后在启动Container的时候将这些文件直接mount到Container中,这个程序是用go语言实现的,使得它非常方便的嵌入到Docker的代码中,整个过程对Docker用户透明,这个链接(?https://github.com/chenchun/cgroupfs)是我们做的这个功能的代码的地址. 文:陈纯 文章出处:Docker (编辑:ASP站长网) |