百分點(diǎn)和云知聲兩家公司都在使用Kubernetes。在百度資深科學(xué)家王益的協(xié)調(diào)下,兩方共同努力使用Kubernetes,成倍地提升集群利用率和團(tuán)隊(duì)工作效率,并且一起開發(fā)了開源的Kubernetes“發(fā)行版”Sextant——實(shí)現(xiàn)幾乎零操作的全自動(dòng)安裝和部署Kubernetes集群。目前有多家互聯(lián)網(wǎng)同仁在準(zhǔn)備使用和參與開發(fā)。
Kubernetes能夠提升集群利用率
目前很多互聯(lián)網(wǎng)公司的集群的CPU總體利用率在20%以下。而Google的集群CPU總體利用率從十年前開始就是70%上下??紤]到即使是只有數(shù)十臺(tái)服務(wù)器的小型公司,擴(kuò)容一倍服務(wù)器也需要耗費(fèi)幾十萬美元。使用Kubernetes管理集群有望擴(kuò)容兩三倍,從而節(jié)約一筆“巨款”。
這一提升背后,是傳統(tǒng)的的集群管理方式的兩個(gè)特點(diǎn):一是每個(gè)團(tuán)隊(duì)為各自的業(yè)務(wù)目標(biāo)申請(qǐng)各自的服務(wù)器,二是通過ssh登陸使用服務(wù)器。團(tuán)隊(duì)在努力完成業(yè)務(wù)目標(biāo)的前幾周或者幾個(gè)月的探索期里,服務(wù)器利用率很高。但是解決了業(yè)務(wù)問題之后,利用率就下降了。然而團(tuán)隊(duì)往往并不能釋放資源,因?yàn)橹饔^上會(huì)擔(dān)心下一個(gè)業(yè)務(wù)目標(biāo)來臨的時(shí)候,要重新申請(qǐng)服務(wù)器??陀^上因?yàn)橛脩舻顷懙椒?wù)器上使用,留下不少數(shù)據(jù),不便騰挪。甚至因?yàn)樘剿鞴ぷ髁鞒虖?fù)雜,記不清哪些數(shù)據(jù)需要備份。
這一模式的另一個(gè)弊端是:雖然一家公司可能有百萬臺(tái)服務(wù)器,但一個(gè)需要一千臺(tái)服務(wù)器的作業(yè)卻很難執(zhí)行起來,因?yàn)榧簩?shí)際上是割裂的,分屬不同團(tuán)隊(duì)。反觀AlphaGo:每個(gè)實(shí)驗(yàn)使用1000臺(tái)機(jī)器,4000個(gè)GPU,開發(fā)團(tuán)隊(duì)意識(shí)到革命性的AI探索的核心是計(jì)算基礎(chǔ)架構(gòu)的革命。
分布式操作系統(tǒng)針對(duì)以上問題,管理整個(gè)數(shù)據(jù)中心的服務(wù)器,讓各個(gè)團(tuán)隊(duì)不再申請(qǐng)服務(wù)器,而是申請(qǐng)計(jì)算資源quota,比如,1000 CPU + 4000 GPU + 4000 GB內(nèi)存。quota有優(yōu)先級(jí)——通常一個(gè)為產(chǎn)品服務(wù)更新模型的作業(yè)的優(yōu)先級(jí)高于實(shí)驗(yàn)作業(yè)。這樣,即時(shí)實(shí)驗(yàn)作業(yè)先啟動(dòng),當(dāng)產(chǎn)品作業(yè)啟動(dòng)的時(shí)候,如果集群資源不足,分布式操作系統(tǒng)可以暫停實(shí)驗(yàn)作業(yè),為產(chǎn)品作業(yè)騰出資源,等產(chǎn)品作業(yè)結(jié)束之后再繼續(xù)執(zhí)行實(shí)驗(yàn)作業(yè)。
另一方面,分布式操作系統(tǒng)會(huì)把不同類型的作業(yè)調(diào)度在同一臺(tái)機(jī)器上,利用不同作業(yè)著重依賴不同硬件資源(CPU、內(nèi)存、磁盤IO、網(wǎng)絡(luò)IO)的特點(diǎn),充分利用每一臺(tái)服務(wù)器的硬件資源。而且因?yàn)楹芏鄼C(jī)器都在分布式操作系統(tǒng)管理之下,所以即使集群利用率高達(dá)80%,剩下的很多機(jī)器的20%也足以應(yīng)付突發(fā)流量增加等問題。
Kubernetes能夠提升團(tuán)隊(duì)工作效率
因?yàn)樗凶鳂I(yè)都由分布式操作系統(tǒng)來調(diào)度,工程師們不需要也不可以登陸到服務(wù)器。這降低了安全隱患,不需要工程師先登陸“跳板機(jī)”再從跳板機(jī)登陸服務(wù)器(跳板機(jī)記錄工程師的每次操作,在發(fā)生信息泄露時(shí),用于回溯尋找“嫌疑人”),從而提升了工作效率。
此外,Kubernetes改變了工程師們的日常工作流程——通過要求開發(fā)團(tuán)隊(duì)交付Docker image而不只是可執(zhí)行文件,Kubernetes簡(jiǎn)化了集成測(cè)試,省去了發(fā)布、打包、部署、執(zhí)行、監(jiān)控、清理垃圾等運(yùn)維工作。
Kubernetes帶來的另一類工作效率提升,在于降低了并行計(jì)算框架(如MapReduce、Spark、Storm等)的開發(fā)難度和成本。開發(fā)者不再必需套用幾個(gè)成熟的開源框架來寫自己的分布式程序,而是可以基于Kubernetes方便地開發(fā)自己的并行計(jì)算框架——畢竟用一個(gè)框架來描述很多算法架,往往意味著“樣樣精通,樣樣稀松”。
值得注意的是,基于Kubernetes用Go語言開發(fā)的MapReduce框架,其代碼行數(shù)是Hadoop MapReduce的百分之一,這意味著bug概率的極大降低,和處理bug的工作時(shí)間的極大節(jié)省。在目前AI和大數(shù)據(jù)為主流的互聯(lián)網(wǎng)業(yè)務(wù)中,這極大地釋放了團(tuán)隊(duì)探索大規(guī)模AI技術(shù)的潛力。尤其是很多設(shè)計(jì)中就為Kubernetes考慮的并行計(jì)算框架,例如Tensorflow,更進(jìn)一步強(qiáng)化了這一趨勢(shì)。
Kubernetes在實(shí)踐中痛點(diǎn)和解決方法
在技術(shù)研發(fā)工作中碰到的最大痛點(diǎn)是:Kubernetes集群的安裝需要大量繁瑣的手工操作。而且因?yàn)镵ubernetes和相關(guān)技術(shù)在高速演進(jìn),很多手工操作需要重復(fù)執(zhí)行。此外,手工操作數(shù)十臺(tái)甚至數(shù)百臺(tái)服務(wù)器很容易出錯(cuò)。
為此,百分點(diǎn)和云知聲聯(lián)合開發(fā)了幾乎是零操作的Kubernetes集群安裝和部署系統(tǒng)Sextant。
在開發(fā)之初,開發(fā)者以為Sextant很簡(jiǎn)單,比如利用Ansible等軟件自動(dòng)化手工操作即可,但實(shí)際情況要復(fù)雜得多。
首先,Ansible等工具不能重裝服務(wù)器操作系統(tǒng),而Kubernetes集群的單機(jī)操作系統(tǒng)不宜再用CentOS等常見Linux發(fā)行版本,而是適合使用CoreOS。常見Linux distribution都有包管理系統(tǒng),比如CentOS的yum和Debian的apt-get。包管理是為桌面系統(tǒng)設(shè)計(jì)的:每個(gè)桌面系統(tǒng)的用戶很少,因此可以預(yù)估需要安裝的軟件,并使用包管理系統(tǒng)來安裝。但是在集群中,Kubernetes可能調(diào)度任何人開發(fā)的任何作業(yè)到任何一臺(tái)服務(wù)器上執(zhí)行。如果用包管理系統(tǒng)安裝這些程序依賴的包,那么每臺(tái)服務(wù)器上都要安裝各個(gè)版本的Python、Java、Ruby、Perl、Scala,以及各種語言的各個(gè)版本對(duì)應(yīng)的常用庫(libraries/packages)。僅安裝這些依賴,就需要消耗大量存儲(chǔ)資源。所以Kubernetes用容器技術(shù)替換包管理系統(tǒng)——每個(gè)程序的依賴都封裝在Docker image里,而不是安裝在單機(jī)操作系統(tǒng)中。而這樣一來,開發(fā)人員就不需要包管理了,而對(duì)單機(jī)操作系統(tǒng)的期待,變成了Linux kernel的自動(dòng)升級(jí)。這恰好是仿照Google服務(wù)器操作系統(tǒng)打造的CoreOS所提供的。
可能很多集群的服務(wù)器上都已經(jīng)安裝了非CoreOS的操作系統(tǒng)了。為了方便重裝系統(tǒng),Sextant會(huì)在數(shù)據(jù)中心中的一臺(tái)bootstrapper服務(wù)器上部署PXE service,然后依次重啟其他服務(wù)器。這些服務(wù)器啟動(dòng)的時(shí)候,BIOS/EFI從PXE service引導(dǎo)CoreOS,并將CoreOS安裝到本地磁盤,并配置Kubernetes,隨后重啟服務(wù)器,這臺(tái)服務(wù)器便可自動(dòng)成為Kubernetes集群的一員了。為了將這種變化限定于數(shù)據(jù)中心里的一部分服務(wù)器,Sextant可以利用VLAN等隔離措施。因?yàn)镵ubernetes是以容器的形式運(yùn)行的,而每當(dāng)Kubernetes升級(jí)時(shí),Sextant將升級(jí)版本的容器鏡像放到bootstrapper服務(wù)器上,集群即可自動(dòng)升級(jí)Kubernetes。每當(dāng)CoreOS升級(jí)的時(shí)候,Sextant也將新版本放到bootstrapper服務(wù)器上,CoreOS會(huì)自動(dòng)升級(jí)和重啟,并且保證每次同時(shí)重啟的機(jī)器數(shù)量是集群總數(shù)的一個(gè)極小的比例,不影響不中斷Kubernetes調(diào)度的分布式作業(yè)。所有的升級(jí)和安裝,都不依賴集群可以直接訪問互聯(lián)網(wǎng),從而保證了安全性。
大數(shù)據(jù)和人工智能的產(chǎn)業(yè)實(shí)踐
互聯(lián)網(wǎng)產(chǎn)業(yè)的核心一直是用服務(wù)器代替人力來服務(wù)萬千用戶。比如搜索引擎代替圖書館管理員,推薦系統(tǒng)代替服裝銷售員和報(bào)刊亭,互聯(lián)網(wǎng)廣告系統(tǒng)代替廣告代理公司,互聯(lián)網(wǎng)金融代替農(nóng)村信用社。在這些成功的商業(yè)模式背后,無一不是大數(shù)據(jù)和AI的支持——互聯(lián)網(wǎng)產(chǎn)品收集每天高達(dá)百億甚至千億次用戶行為(比如queries和clicks)用于訓(xùn)練人工智能系統(tǒng)(比如點(diǎn)擊率預(yù)估模型),來提升在線產(chǎn)品的服務(wù)質(zhì)量。
近年來,語音和視覺技術(shù)隨deep learning進(jìn)一步發(fā)展,創(chuàng)造了IoT、AR和無人車等新興領(lǐng)域。顯而易見的是,未來的互聯(lián)網(wǎng)會(huì)和人們的生活契合得更緊密,會(huì)收集更多更細(xì)致的數(shù)據(jù),也需要更大規(guī)模人工智能技術(shù)的支持。而這些恰好是百分點(diǎn)和云知聲的業(yè)務(wù)基礎(chǔ)和技術(shù)長(zhǎng)項(xiàng)。Kubernetes提供了一個(gè)合作的平臺(tái):和Mesos、YARN等上一代技術(shù)被設(shè)計(jì)來調(diào)度離線作業(yè)相比,Kubernetes可以同時(shí)調(diào)度離線和在線作業(yè)。尤其是Kubernetes的service和load balancer的概念,使其可以調(diào)度在線服務(wù)、日志收集處理和存儲(chǔ)、AI模型的訓(xùn)練等各類不同的作業(yè)。
在有Kubernetes之前,公司之間的合作往往是松耦合的;而在Kubernetes平臺(tái)上,開發(fā)團(tuán)隊(duì)可以同時(shí)運(yùn)行百分點(diǎn)的EFK技術(shù)用于收集和管理數(shù)據(jù),以及云知聲的大規(guī)模AI系統(tǒng)從數(shù)據(jù)中提取知識(shí)和提升服務(wù)質(zhì)量。這次合作給予我雙方更有信心的進(jìn)一步開辟全新的合作圖景,嘗試細(xì)粒度的強(qiáng)強(qiáng)聯(lián)合。
提升效率,迎接大數(shù)據(jù)和AI大潮
Sextant是一個(gè)早期開源項(xiàng)目,隨著Kubernetes技術(shù)的演進(jìn),Sextant還需要長(zhǎng)期維護(hù)的開發(fā)。
百分點(diǎn)和云知聲的技術(shù)團(tuán)隊(duì)以充分開放的心態(tài),愿意分享各自業(yè)務(wù)中Kubernetes技術(shù)的使用經(jīng)驗(yàn)。也愿意幫助業(yè)界同仁使用Sextant簡(jiǎn)化Kubernetes部署。更歡迎相關(guān)技術(shù)人員一起合作投入到Sextant的開發(fā)工作中,提升團(tuán)隊(duì)工作效率和計(jì)算能力,迎接大數(shù)據(jù)和AI的大潮。