新一代企业级容器云平台GaiaStack:支持全类型应用

作者:罗韩梅

12月7-9日,由中国计算机学会主办,CCF大数据专家委员会承办,中国科学院计算技术研究所、中科天玑数据科技股份有限公司、CSDN协办的2017中国大数据技术大会(BDTC 2017)在北京新云南皇冠假日酒店盛大召开。腾讯技术工程事业群数据平台部资源调度和容器云负责人罗韩梅在12月8日的“大数据分析与生态系统论坛”上,以《腾讯Docker云平台GaiaStack》进行了主题演讲。

大家好,我是罗韩梅。GaiaStack是基于kubernetes打造的Docker私有云平台,腾讯内部所有BG都有产品或者服务在GaiaStack上运行。GaiaStack的本质是一个资源管理和调度平台,作为一个云操作系统服务于上层的各类应用。

GaiaStack是基于kubernetes,但是和kubernetes还是有很多不同。GaiaStack提供了从构建到交付到运行的一整套解决方案,包括代码构建、持续集成、容器服务、镜像仓库、服务编排等功能。我们最初的目标是服务公司内部产品的,现在借助互联网+和腾讯云开放GaiaStack的能力,服务更多的政企用户。

下面是GaiaStack的逻辑架构图,可以看到kubernetes是我们的核心系统,因此GaiaStack对用户交付的基本单元就是pod。但是也可以看到kubernetes只是GaiaStack的一个组件,还有很多其他关键组件。

GaiaStack更详细的物理架构图如下,主要还是基于kubernetes、Docker、Ceph、ES、etcd等开源系统,也有我们自研的很多关键组件,包括webportal、gate、apiswitch、deployment、CI-server等。我们将所有组件划分为三个层次,分别是global层、IDC层和cluster层,将所有集群的公共服务放到global层,由于IDC内部和跨IDC的网络环境差异比较大,所以我们将同一个IDC的多个集群可以共享的组件放到IDC层,如Ceph、Monitor等。

GaiaStack的特性非常多:首先是自动化运维,包括集群管理、监控告警、系统日志管理、用户账户管理等等,提供可视化、自动化的工作,降低使用者的人力成本和学习成本;支持企业内多集群、多租户管理模式,更加适用开发/测试环境的隔离,地区之间共享公共服务、企业内部多种业务共享集群等;全系统HA、热升级,即使GaiaStack平台版本升级,也不会影响应用的执行;协议兼容方面,同时支持Docker compose和kubernetes编排,支持多种Docker用户的使用习惯;更多维度的资源管理,保证可以更加安全的使用容器云;弹性伸缩可以全自动秒级扩容缩容,及时响应业务需求;依托腾讯内部稳定的Ceph服务,开发Docker云硬盘功能;也支持多种不同的网络模式。这里没有列出的还有很多,比如用户日志检索、WebShell、代码构建、操作记录审计等等。

做Docker容器云的厂商也有不少,其特性实现大多大同小异。GaiaStack最大的特色,就是它是一个真正通用的集群OS,目标是支持ALL。这个ALL的支持,根本上是为了做在线和离线业务的资源共享。我们都知道在线服务通常都具有以天为周期的资源特征,但是每个小时资源又多不同,甚至波动很大。为了充分利用资源,我们将在线和离线混布,这是一个具有极大收益的事情。但是kubernetes、Docker、kernel等很多底层系统却还没有准备好。为此,GaiaStack在底层能力建设这块投入了很多工作,主要包括kernel、Docker、Ceph、registry、kubernetes这几个方面。

首先是kernel。Docker云平台使用Docker来做资源的隔离,但本质上是使用了内核的cgroups来实现的。我们要做在线和离线的共享,而共享的前提一定是隔离。Docker和虚拟机相比,最被诟病的就是隔离做的不足,GaiaStack在内核引入对网络入带宽和disk IO的subsystem,来完善我们的资源控制。并且除了资源维度的增加,我们对所有资源还都采用了一种弹性的管理方式。

下面以网络入带宽为例:这个图是没有网络入带宽控制时,两个进程的带宽和时延都得不到任何保证。我们对网络IO的控制目标主要有两个:一是保证配额资源,第二是当有空闲资源时,不要浪费,可以借用其他cgroups的空闲带宽。当然还有优先级相关的控制,以及性能的要求。

加入了GaiaStack的网络入带宽控制之后,对于资源需求分别是50M和800M的两个cgroups,机器可供分配的总带宽是850M,也就是没有空闲带宽,两个cgroups都按照自己的资源需求得到了带宽。第二个图,机器上仍然是850M的总带宽,两个cgroups分别是20和70M,那么有130M的空闲带宽,我们可以看到两个cgroups可以用到超过自己配额的资源。

在diskIO的控制方面,其实cgroups是有一个blkio的子系统的,但是几乎没有哪家Docker云平台使用,根本原因有两个:第一,blkio对buffer IO是没有控制的。

第二,blkio有两个控制策略,分别是io weight和   throttle模式,但是其实这两个模式都不实用。Io weight使用时间片进行分割,而不是通过iops或者bps进行衡量。用户观察到的传输数据波动比较大。而throttle模式本质上是一种hard控制模式,无法充分利用资源。我们对disk IO的控制和前面对网络入带宽的控制目标是一致的。下图是控制效果,对于buffer write的测试,总的带宽有空闲,那么这两个Docker不但可以用到保证值,而且都可以达到ceil值。对于direct write,效果也是类似的。

Docker也是GaiaStack重点建设的底层能力,我们的Docker在腾讯内部是开源的,腾讯很多业务都使用我们的Docker,也有不少团队一起做贡献,当然我们也积极的向社区提交我们的一些patch。我们Docker的优化主要有这几个方面:首先最多的还是bug fix,保证线上的稳定性。另一个重点特性就是热升级的功能,保证当平台要升级Docker daemon时,对上面运行的应用进程完全不影响。第三个部分就是为Docker增加了很多插件,比如弹性内存控制、RBD插件、网络插件等,丰富了Docker的功能。

Ceph是GaiaStack的一个子团队,我们对Ceph的使用主要有两个方面:一是做离线数据的存储。有不少的业务,尤其是非hadoop生态的新的离线业务,他们更喜欢用Cephfs,因为可以完全透明的使用Cephfs,就像使用本地磁盘上的数据一样。Cephfs是Ceph最复杂,也是最不稳定的地方,所以GaiaStack在这块做了不少的优化,包括在可扩展性方面,实现了多MDS,在性能方面,特别针对大目录中大量文件的场景做了性能优化,另外,在内核的Cephfs模块,也fix了大量的内核bug,以及新特性开发。对Ceph的第二个使用是云硬盘。GaiaStack实现了两类云硬盘,普通云硬盘和内置云硬盘。内置云硬盘支持临时云硬盘和可迁移云硬盘。

下面是对kubernetes的建设。这里不得不说kubernetes真的已经很强大了,但是我们如果要把kubernetes用到ALL的场景下,对它的改造也是一言难尽。首先是quota管理,kubernetes的quota是以pod为单位的,而在线应用和离线应用有个很重要的地方在于准入检查,所以对于在线业务,我们不能以pod为单位去检查。在app这里,其实kubernetes已经支持了非常多的应用类型,但是我们发现不论是在线还是离线,实际场景中,还是不够用。比如在线业务,尤其是腾讯的业务,很多都有灰度升级的强烈需求,这里的灰度和kubernetes的灰度还不太一样。很多用户是想长时间的让业务在多版本的稳定状态下,所以我们开发了tapp的应用类型;在网络模式方面,没有哪种网络模式是最优的,只有最适合的。比如host网络性能很好,但是有端口冲突,需要应用适应,特别是使用了第三方库的业务来说,更加困难;Floating IP看起来很方便,但是很多场景下IP资源是有限的;overlay的IP资源没有限制,但是互通性不好;NAT一定程度上解决了端口冲突,但是性能不足,等等,所以GaiaStack让应用可以选择最适合的网络模式;磁盘管理是非常重要的一块,依托我们前面讲的Ceph,我们有些集群已经完全消灭了本地磁盘,全部采用云硬盘,可以让云硬盘跟着pod走,也可以让云硬盘当作临时工作目录,随时创建,随时销毁;最后,对于GPU应用,kubernetes简单的把GPU卡当作一种资源,我们增加了GPU的调度逻辑,考虑了GPU的拓扑关系,让应用可以获得更好的性能。

Registry是GaiaStack的基本组件,我们服务在线应用时,一般没有什么问题,但在离线应用中,需要大规模的应用部署时,性能问题就暴露的比较明显了,为此,我们开发了P2P的Registry。在镜像下载过程中,引入BT协议,在blob上传时,对blob生成种子,在下载镜像的blob时,先下载种子,再通过种子文件下载数据。而在具体的实现中,我们采用了一个外部的agent组件,这样不需要修改Docker daemon,对Docker做到了零入侵。

看下P2P registry的效果,我们可以看到,随着节点数的增加,并没有显著延长镜像的下载时间,并且节省了大量的registry流量。

最后,我们谈谈GaiaStack的开放。GaiaStack立足于开源项目,已经向社区提交了大量的issue,同时,也会以私有云的方式开放给广大政企用户,目前已经上架到腾讯云的黑石上。黑石是在腾讯云直接售卖物理机,在私有云场景下,与Docker结合,可以达到最优的效果,而且GaiaStack也针对黑石的环境做了专门的对接,比如,兼容了黑石网络,GaiaStack自研了遵循CNI网络标准的kubernetes网络插件,与黑石的VPC网络进行了打通,使得容器与容器,容器与黑石物理机,容器与集群外同VPC的服务均可以直接路由。兼容了黑石负载均衡,直接使用容器的VPC IP注册黑石的负载均衡,避免了kubernetes基于iptables NAT实现的nodePort方式的性能损失等。当然,除了在黑石的环境,在腾讯云的虚拟机环境,在用户自己的机房环境下,GaiaStack也可以以私有云的方式服务。为了更好的开放,我们将GaiaStack全面产品化,引入了套件做自动化,可视化的部署和运营系统。比如主机视图、服务视图,也可以在页面上自动扩容集群,下线机器等。同时,为了更好的运营云平台,我们引入了主机管理、服务管理、业务管理、用户管理、监控、告警、日志、配置管理等等,让GaiaStack成为一站式的容器云PAAS平台。