近日,大数据公司百分点集团与人工智能公司云知声联合发布了Kubernetes的“发行版”:Sextant。Kubernetes是Google开源的集群管理系统,或者称为分布式操作系统。很多Kubernetes的开发者,同时也是Google内部使用的分布式操作系统Borg的开发者。而Borg是Google保持能人所不能的计算能力的核心,它让Google虽不是第一家搜索引擎公司,却被Peter Thiel誉为“zero to one”典范。但是,像单机操作系统Linux一样,Kubernetes虽然开源了,安装和部署却相当复杂,需要专业知识和专业团队。
百分点和云知声两家公司都在使用Kubernetes。在百度资深科学家王益的协调下,两方共同努力使用Kubernetes,成倍地提升集群利用率和团队工作效率,并且一起开发了开源的Kubernetes“发行版”Sextant——实现几乎零操作的全自动安装和部署Kubernetes集群。目前有多家互联网同仁在准备使用和参与开发。
Kubernetes能够提升集群利用率
目前很多互联网公司的集群的CPU总体利用率在20%以下。而Google的集群CPU总体利用率从十年前开始就是70%上下。考虑到即使是只有数十台服务器的小型公司,扩容一倍服务器也需要耗费几十万美元。使用Kubernetes管理集群有望扩容两三倍,从而节约一笔“巨款”。
这一提升背后,是传统的的集群管理方式的两个特点:一是每个团队为各自的业务目标申请各自的服务器,二是通过ssh登陆使用服务器。团队在努力完成业务目标的前几周或者几个月的探索期里,服务器利用率很高。但是解决了业务问题之后,利用率就下降了。然而团队往往并不能释放资源,因为主观上会担心下一个业务目标来临的时候,要重新申请服务器。客观上因为用户登陆到服务器上使用,留下不少数据,不便腾挪。甚至因为探索工作流程复杂,记不清哪些数据需要备份。
这一模式的另一个弊端是:虽然一家公司可能有百万台服务器,但一个需要一千台服务器的作业却很难执行起来,因为集群实际上是割裂的,分属不同团队。反观AlphaGo:每个实验使用1000台机器,4000个GPU,开发团队意识到革命性的AI探索的核心是计算基础架构的革命。
分布式操作系统针对以上问题,管理整个数据中心的服务器,让各个团队不再申请服务器,而是申请计算资源quota,比如,1000 CPU + 4000 GPU + 4000 GB内存。quota有优先级——通常一个为产品服务更新模型的作业的优先级高于实验作业。这样,即时实验作业先启动,当产品作业启动的时候,如果集群资源不足,分布式操作系统可以暂停实验作业,为产品作业腾出资源,等产品作业结束之后再继续执行实验作业。
另一方面,分布式操作系统会把不同类型的作业调度在同一台机器上,利用不同作业着重依赖不同硬件资源(CPU、内存、磁盘IO、网络IO)的特点,充分利用每一台服务器的硬件资源。而且因为很多机器都在分布式操作系统管理之下,所以即使集群利用率高达80%,剩下的很多机器的20%也足以应付突发流量增加等问题。
Kubernetes能够提升团队工作效率
因为所有作业都由分布式操作系统来调度,工程师们不需要也不可以登陆到服务器。这降低了安全隐患,不需要工程师先登陆“跳板机”再从跳板机登陆服务器(跳板机记录工程师的每次操作,在发生信息泄露时,用于回溯寻找“嫌疑人”),从而提升了工作效率。
此外,Kubernetes改变了工程师们的日常工作流程——通过要求开发团队交付Docker image而不只是可执行文件,Kubernetes简化了集成测试,省去了发布、打包、部署、执行、监控、清理垃圾等运维工作。
Kubernetes带来的另一类工作效率提升,在于降低了并行计算框架(如MapReduce、Spark、Storm等)的开发难度和成本。开发者不再必需套用几个成熟的开源框架来写自己的分布式程序,而是可以基于Kubernetes方便地开发自己的并行计算框架——毕竟用一个框架来描述很多算法架,往往意味着“样样精通,样样稀松”。
值得注意的是,基于Kubernetes用Go语言开发的MapReduce框架,其代码行数是Hadoop MapReduce的百分之一,这意味着bug概率的极大降低,和处理bug的工作时间的极大节省。在目前AI和大数据为主流的互联网业务中,这极大地释放了团队探索大规模AI技术的潜力。尤其是很多设计中就为Kubernetes考虑的并行计算框架,例如Tensorflow,更进一步强化了这一趋势。
Kubernetes在实践中痛点和解决方法
在技术研发工作中碰到的最大痛点是:Kubernetes集群的安装需要大量繁琐的手工操作。而且因为Kubernetes和相关技术在高速演进,很多手工操作需要重复执行。此外,手工操作数十台甚至数百台服务器很容易出错。
为此,百分点和云知声联合开发了几乎是零操作的Kubernetes集群安装和部署系统Sextant。
在开发之初,开发者以为Sextant很简单,比如利用Ansible等软件自动化手工操作即可,但实际情况要复杂得多。
首先,Ansible等工具不能重装服务器操作系统,而Kubernetes集群的单机操作系统不宜再用CentOS等常见Linux发行版本,而是适合使用CoreOS。常见Linux distribution都有包管理系统,比如CentOS的yum和Debian的apt-get。包管理是为桌面系统设计的:每个桌面系统的用户很少,因此可以预估需要安装的软件,并使用包管理系统来安装。但是在集群中,Kubernetes可能调度任何人开发的任何作业到任何一台服务器上执行。如果用包管理系统安装这些程序依赖的包,那么每台服务器上都要安装各个版本的Python、Java、Ruby、Perl、Scala,以及各种语言的各个版本对应的常用库(libraries/packages)。仅安装这些依赖,就需要消耗大量存储资源。所以Kubernetes用容器技术替换包管理系统——每个程序的依赖都封装在Docker image里,而不是安装在单机操作系统中。而这样一来,开发人员就不需要包管理了,而对单机操作系统的期待,变成了Linux kernel的自动升级。这恰好是仿照Google服务器操作系统打造的CoreOS所提供的。
可能很多集群的服务器上都已经安装了非CoreOS的操作系统了。为了方便重装系统,Sextant会在数据中心中的一台bootstrapper服务器上部署PXE service,然后依次重启其他服务器。这些服务器启动的时候,BIOS/EFI从PXE service引导CoreOS,并将CoreOS安装到本地磁盘,并配置Kubernetes,随后重启服务器,这台服务器便可自动成为Kubernetes集群的一员了。为了将这种变化限定于数据中心里的一部分服务器,Sextant可以利用VLAN等隔离措施。因为Kubernetes是以容器的形式运行的,而每当Kubernetes升级时,Sextant将升级版本的容器镜像放到bootstrapper服务器上,集群即可自动升级Kubernetes。每当CoreOS升级的时候,Sextant也将新版本放到bootstrapper服务器上,CoreOS会自动升级和重启,并且保证每次同时重启的机器数量是集群总数的一个极小的比例,不影响不中断Kubernetes调度的分布式作业。所有的升级和安装,都不依赖集群可以直接访问互联网,从而保证了安全性。
大数据和人工智能的产业实践
互联网产业的核心一直是用服务器代替人力来服务万千用户。比如搜索引擎代替图书馆管理员,推荐系统代替服装销售员和报刊亭,互联网广告系统代替广告代理公司,互联网金融代替农村信用社。在这些成功的商业模式背后,无一不是大数据和AI的支持——互联网产品收集每天高达百亿甚至千亿次用户行为(比如queries和clicks)用于训练人工智能系统(比如点击率预估模型),来提升在线产品的服务质量。
近年来,语音和视觉技术随deep learning进一步发展,创造了IoT、AR和无人车等新兴领域。显而易见的是,未来的互联网会和人们的生活契合得更紧密,会收集更多更细致的数据,也需要更大规模人工智能技术的支持。而这些恰好是百分点和云知声的业务基础和技术长项。Kubernetes提供了一个合作的平台:和Mesos、YARN等上一代技术被设计来调度离线作业相比,Kubernetes可以同时调度离线和在线作业。尤其是Kubernetes的service和load balancer的概念,使其可以调度在线服务、日志收集处理和存储、AI模型的训练等各类不同的作业。
在有Kubernetes之前,公司之间的合作往往是松耦合的;而在Kubernetes平台上,开发团队可以同时运行百分点的EFK技术用于收集和管理数据,以及云知声的大规模AI系统从数据中提取知识和提升服务质量。这次合作给予我双方更有信心的进一步开辟全新的合作图景,尝试细粒度的强强联合。
提升效率,迎接大数据和AI大潮
Sextant是一个早期开源项目,随着Kubernetes技术的演进,Sextant还需要长期维护的开发。
百分点和云知声的技术团队以充分开放的心态,愿意分享各自业务中Kubernetes技术的使用经验。也愿意帮助业界同仁使用Sextant简化Kubernetes部署。更欢迎相关技术人员一起合作投入到Sextant的开发工作中,提升团队工作效率和计算能力,迎接大数据和AI的大潮。