張龍春:高效靈活的應(yīng)用調(diào)度與資源管理
經(jīng)過(guò)了十個(gè)城市的路演,華為HDG線(xiàn)下沙龍終于來(lái)到了首都。在北京,開(kāi)發(fā)人員之多,關(guān)注的技術(shù)領(lǐng)域之廣,討論的話(huà)題之深入,堪稱(chēng)HDG歷屆參與討論者之最。
雖然同樣談PaaS,但是華為PaaS平臺(tái)資深架構(gòu)師張龍春則是另辟了一個(gè)角度。他來(lái)自中央軟件院PaaS架設(shè)部,所以他主要談?wù)勅A為設(shè)計(jì)這個(gè)系統(tǒng)的時(shí)候到底是怎么考慮初始架構(gòu)的,從這個(gè)角度看PaaS核心組建高效靈活的應(yīng)用調(diào)度和資源管理。
以下是他的現(xiàn)場(chǎng)演講實(shí)錄:
既然前面的專(zhuān)題我們基本上都已經(jīng)過(guò)一過(guò)了,我們就講一講這些問(wèn)題背后的思想到底是什么。我是來(lái)自中央軟件院PaaS架設(shè)部的,我們平時(shí)設(shè)計(jì)這個(gè)系統(tǒng)的時(shí)候到底是怎么考慮這個(gè)問(wèn)題的,大概從這個(gè)角度我們繼續(xù)來(lái)看一下PaaS的核心組建的高效靈活的應(yīng)用調(diào)度和資源管理。
我們上一個(gè)講題講的是DevOps,我就接著DevOps這個(gè)話(huà)題往下講。我們回顧一下剛才馬大師說(shuō)的DevOps有什么收獲,就是他提到三點(diǎn),他的一個(gè)理解,其實(shí)我也感受頗深的。他提到的***點(diǎn)是DevOps我們期望的是把所有的東西都組建化,第二個(gè)東西所有的組建是可流程化,第三個(gè)是所有的流程可自動(dòng)化。是不是通過(guò)這個(gè)就把整個(gè)從Dev到Ops的所有過(guò)程都管理起來(lái)了。我們知道在一個(gè)開(kāi)發(fā)過(guò)程之中,除了開(kāi)發(fā)程序的研發(fā)要做的事情就是寫(xiě)程序,我接到一個(gè)需求我要分析,我寫(xiě)我的需求設(shè)計(jì)文檔,落到我具體的開(kāi)發(fā)代碼的編寫(xiě)制作之中,***我編譯成一個(gè)ese文件,可以執(zhí)行的文件。通常我們的工作就做完了。交給另一波人,另一波人就去裝機(jī)器,裝完機(jī)器做網(wǎng)絡(luò)設(shè)計(jì)。裝機(jī)器的過(guò)程,做網(wǎng)絡(luò)設(shè)計(jì)的過(guò)程,具體做安裝部署的工作是不是很多都是手工的工作,這個(gè)工作就是我們所謂的去部署上線(xiàn)的過(guò)程,部署完之后我們就去運(yùn)維這個(gè)東西,運(yùn)營(yíng)這個(gè)東西。運(yùn)維這個(gè)東西的時(shí)候,我們不斷的看這個(gè)東西的情況是怎么樣的,如果有問(wèn)題,比如一天早晨起來(lái)機(jī)器宕掉了,是不是再裝一臺(tái)機(jī)器,把這個(gè)再重新部署一下。
這個(gè)過(guò)程里面背后我們可以看到很多都是手工的,或者是跨不同組的這種工作。這種工作一旦手工工作很多的時(shí)候,我們不能把它流程化的時(shí)候,這個(gè)工作的可復(fù)制性就會(huì)比較差,大家會(huì)很辛苦。我相信一個(gè)事情做一遍不難,難的是你不停的做,這個(gè)道理同樣應(yīng)用于整個(gè)研發(fā)領(lǐng)域。我們裝一遍機(jī)器不難,難的是你天天裝機(jī)器,我安裝一次程序不難,難的是每次都安裝這個(gè)程序。而且你改一次參數(shù)可以,改10個(gè)、20個(gè)我可以做,你改100遍的時(shí)候,是不是難免有一次疏忽了。特別是越熟悉的人,越覺(jué)得這個(gè)東西容易疏忽,這時(shí)候越容易產(chǎn)生錯(cuò)誤,這是人的因素。
所以DevOps的精髓就是,我***件事情就是把所有的東西都自動(dòng)化,所有的東西都可操作。可操作之后就可以流程化和編程了,所以這是它的本質(zhì)。只有這樣子我所有的過(guò)程從Dev到Ops的所有過(guò)程都可以做到自動(dòng)化,這是一脈相承的三個(gè)階段。
接著剛才說(shuō)DevOps,我以前經(jīng)常說(shuō)DevOps是管一個(gè)應(yīng)用系統(tǒng)的前半生的。什么叫前半生的?就是從調(diào)研接需求,到開(kāi)發(fā),一直到這個(gè)程序?qū)懗鰜?lái),整個(gè)鏡像打開(kāi)了,開(kāi)始編譯部署,這是前半生。什么叫后半生呢?我部署上去了,我要運(yùn)營(yíng),我要監(jiān)控監(jiān)管,日常出報(bào)表,定期看結(jié)果,***到經(jīng)過(guò)五年十年這個(gè)程序下線(xiàn)了,這是它的后半生。我以前提過(guò)這樣一個(gè)話(huà)題,DevOps是管前半生的,而我們的PaaS運(yùn)營(yíng)平臺(tái)是管后半生的。但是我一節(jié)課仔細(xì)聽(tīng)了馬大師的演講,我新的感覺(jué)是其實(shí)DevOps是管一個(gè)應(yīng)用一生的,只不過(guò)它的后半生還用了DevOps的思想,把它放到了PaaS去管了它的后半生。所以我現(xiàn)在的觀(guān)點(diǎn)是DevOps是管整個(gè)應(yīng)用的一生,后半生是靠PaaS幫它一起實(shí)現(xiàn)的。我們站在這個(gè)思想上來(lái)想。
回過(guò)頭來(lái)看一下,***一個(gè)話(huà)題很多內(nèi)容,前面每一個(gè)話(huà)題里面都提到了,所以這個(gè)形式并不很重要,關(guān)鍵是你理清什么內(nèi)容,所以我們不一定非得看片子本身的內(nèi)容,包括挑戰(zhàn)啊,包括發(fā)展趨勢(shì)啊,大家都很了解了,我們就講講DevOps的后半生,PaaS是怎么幫它實(shí)現(xiàn)的。
我們想一個(gè)應(yīng)用程序,我們作為一個(gè)開(kāi)發(fā)人員做一個(gè)應(yīng)用程序,一個(gè)應(yīng)用系統(tǒng)的時(shí)候,我們期望一個(gè)什么模式是大家比較理想的模式。我們一直說(shuō)附用,能夠把以前任的結(jié)果沿襲下來(lái),不要發(fā)明文字。其實(shí)說(shuō)這些東西的背后我們都希望,我作為一個(gè)開(kāi)發(fā)者可能希望的是,***是不是有現(xiàn)成的代碼,現(xiàn)成的應(yīng)用,現(xiàn)有的功能,我可以拿來(lái)就用,不需要自己再做一遍了。第二現(xiàn)有的安裝,現(xiàn)有的調(diào)試,現(xiàn)有的部署,是不是都是現(xiàn)成的,我拿來(lái)就可以用了。我要做的事情就是把業(yè)務(wù)邏輯開(kāi)發(fā)往上一部署就OK了。包括將來(lái)運(yùn)維的時(shí)候,現(xiàn)在很多應(yīng)用會(huì)碰到波峰波谷的情況,雙十一的秒殺啊,或者是有些時(shí)候特殊的公關(guān)事件,或者是公共事件出現(xiàn)時(shí)候的流量的沖擊。類(lèi)似在這種情況下,我的系統(tǒng)也可以很靈活的處理這種背后的對(duì)于資源的需求,如果這些東西都可以有一個(gè)現(xiàn)有的系統(tǒng)幫我們承載,我們的工作只做應(yīng)用邏輯、業(yè)務(wù)邏輯就可以了。當(dāng)然這是很理想的,我相信理想的情結(jié)還是要有的,雖然實(shí)際上不一定完全能做到這一步。
在這種理想的情況下,我們期望能夠讓一個(gè)平臺(tái)幫我們把編譯、測(cè)試、運(yùn)維的東西都實(shí)現(xiàn)掉,這就是一個(gè)比較理想的場(chǎng)景了。所以我們期望PaaS核心的模塊也能達(dá)到這一步,才能達(dá)到我們理想中的目的。這就是我們?cè)O(shè)計(jì)PaaS,或者是PaaS存在的一個(gè)意義。經(jīng)常有人會(huì)問(wèn)這么一個(gè)問(wèn)題,你們做PaaS的,PaaS到底是干什么的,能給我?guī)?lái) 好處呢。我通常會(huì)這樣想,得看問(wèn)的這個(gè)人是誰(shuí)。問(wèn)的這個(gè)人如果是一個(gè)偏研發(fā)的同事,我通常會(huì)這么說(shuō),PaaS里面有很多服務(wù),你寫(xiě)程序的時(shí)候,這些東西都是現(xiàn)成的,而且都是很好的,你點(diǎn)一點(diǎn),布一布就可以了,這些功能都是現(xiàn)成的。
但是如果是偏運(yùn)維的同事,我們可以這么說(shuō),PaaS可以把你日常的工作都涵蓋掉。舉個(gè)例子,你部署的時(shí)候安裝機(jī)器,還要調(diào)操作系統(tǒng),還要裝程序,還要配參數(shù),環(huán)境變量,各種變量的東西?,F(xiàn)在的做法是,有一個(gè)表述包,把你所有的事情開(kāi)發(fā)人員都幫你表述好了,你要做的事情就是看一下機(jī)器的總量夠不夠,物理總量是夠的,一臺(tái)機(jī)器有了,你把這個(gè)包放上去,點(diǎn)一下安裝,等一下喝杯水,回來(lái)這個(gè)東西做完了。你再看看日常的工作,會(huì)給你發(fā)一個(gè)報(bào)告,你看一看結(jié)果,你可能要做的事情是根據(jù)業(yè)務(wù)的需要,制定一定自動(dòng)化的策略,比如說(shuō)彈性伸縮的策略等等。你告訴系統(tǒng),當(dāng)我的負(fù)載到什么程度的時(shí)候,你是不是幫我破一點(diǎn)節(jié)點(diǎn),當(dāng)負(fù)載到什么程度的時(shí)候你是不是把節(jié)點(diǎn)降下來(lái),這種狀態(tài)是不是比較理想。
如果一個(gè)客戶(hù)問(wèn)我的時(shí)候,大概會(huì)有這樣一個(gè)回答。客戶(hù)說(shuō)你們PaaS到底能做什么,特別是像企業(yè)的客戶(hù)。PaaS通常能做到這一塊,***這個(gè)PaaS里面有現(xiàn)成的很多現(xiàn)有的服務(wù),你的應(yīng)用開(kāi)發(fā)就非常的簡(jiǎn)單。而部署和維護(hù)的成本會(huì)非常的低,能夠減少你的應(yīng)用開(kāi)發(fā),就是你來(lái)了新需求,到最終上線(xiàn)的這個(gè)時(shí)間會(huì)減少很多,這是***個(gè)。第二個(gè)是過(guò)去你作為一個(gè)個(gè)的很獨(dú)立的開(kāi)發(fā)的系統(tǒng),都是獨(dú)立采購(gòu)硬件資源的,在這種情況下你就會(huì)發(fā)現(xiàn)每一個(gè)資源池可能都不飽滿(mǎn),但是你每一個(gè)資源池又得考慮峰值情況,肯定得把提前的余量預(yù)留好。這時(shí)候你整個(gè)機(jī)器的管理、運(yùn)維,包括資源的平均利用率都不會(huì)高。所以有這個(gè)PaaS,除了剛才說(shuō)的你的業(yè)務(wù)溝通市場(chǎng)的時(shí)間縮短以外,還可以把資源重新的利用起來(lái)。你可以把一組的應(yīng)用部署到一套的平臺(tái)里面去,這樣你整個(gè)資源利用率提高了,你的運(yùn)營(yíng)運(yùn)維的效果也好了。這是站在業(yè)務(wù)的角度看待問(wèn)題。
所以我們站在不同的維度看PaaS,就能看到不同的PaaS。所以PaaS就是有不同的面,我們這么來(lái)看,這就是我們看PaaS的來(lái)源,從每一個(gè)角度來(lái)看PaaS。
docker大家都知道這個(gè)概念,docker里有一個(gè)很重要的概念,叫打包概念。打包的意思,就是把所有的東西都打在一起。不要小看打包這個(gè)概念,有時(shí)候量變會(huì)引起質(zhì)變,當(dāng)你把所有的依賴(lài)都?jí)嚎s在一個(gè)包里的時(shí)候,當(dāng)你所有應(yīng)用的啟停都簡(jiǎn)單到一個(gè)機(jī)器的啟和停的時(shí)候,一個(gè)東西才會(huì)發(fā)生變化。舉個(gè)例子,我們過(guò)去部署應(yīng)用程序的時(shí)候,我們知道通常部署一個(gè)應(yīng)用程序需要把一個(gè)應(yīng)用程序安裝到一個(gè)目錄上去,需要去配各種各樣的配置文件,是不是有時(shí)候還需要看環(huán)境變量,有時(shí)候我們的應(yīng)用程序還會(huì)寫(xiě)一些start up或者start stop的腳本,或者(16:54)的腳本,這些腳本還要和其他的應(yīng)用程序交互。這些東西雖然看起來(lái)不是很復(fù)雜,但是往往都是每一個(gè)應(yīng)用程序很個(gè)性化的東西。當(dāng)這種個(gè)性化的東西沒(méi)有形成一個(gè)標(biāo)準(zhǔn)的時(shí)候,這個(gè)應(yīng)用程序的啟和停就變成個(gè)性化的事情了。
所以我們知道為什么過(guò)去那些PaaS平臺(tái)會(huì)定一系列的標(biāo)準(zhǔn),我需要一個(gè)什么東西,把程序的啟停封裝起來(lái),來(lái)達(dá)到我對(duì)外提供統(tǒng)一的啟停和應(yīng)用管理的目的。但是容器化之后就不一樣了,容器化之后你所有的東西都放在了容器里面,這個(gè)時(shí)候所有的啟停都被認(rèn)為是容器的啟停,所以整個(gè)應(yīng)用的啟停簡(jiǎn)單的就變成一個(gè)程序的啟停,就是容器的啟停。這樣一下子就把應(yīng)用程序?qū)ν獾慕涌谧兊梅浅8蓛簟?/p>
我們剛才最早的時(shí)候也提到一個(gè)觀(guān)點(diǎn),我們期望我們應(yīng)用后半生的管理都變成,***是組件化的,第二是可編排的,第三所有的編排都是自動(dòng)化的。如果按照這個(gè)角度來(lái)看,***件事情就是要求我們寫(xiě)出來(lái)的應(yīng)用程序,至少有一個(gè)很合適的界面給我們提供出來(lái),讓它可以很容易的被編排,被使用。因?yàn)镻aaS這個(gè)概念出來(lái)的并不是剛剛這一年、兩年才有的,很多年前都有。但是有了容器化之后,就是docker只是容器的一種標(biāo)準(zhǔn),有了容器化之后,才發(fā)展的更快起來(lái),這也是有一定的相輔相成的作用。容器化之后,就是我們應(yīng)用程序的管理有了一個(gè)標(biāo)準(zhǔn),這是***個(gè)。
第二個(gè)sefe,就是交付。過(guò)去的交付也有通過(guò)集中的或者軟件倉(cāng)庫(kù)的方式交付,但是以容器化的角度的交付,現(xiàn)在是正式的把這個(gè)問(wèn)題變成一個(gè)業(yè)界的常態(tài)了。過(guò)去可能是有些應(yīng)用做,有些應(yīng)用不做。但是你有了容器化的概念以后,交付就是基本上大家都會(huì)選用這種集中的注冊(cè)中心交付的模式,或者是集中的軟件交付的模式。這種模式使我們的交付也變得標(biāo)準(zhǔn)和單一了。再加上我們說(shuō)的所謂的隔離,針對(duì)這個(gè)事情我也談?wù)勔粋€(gè)理解。
我們做PaaS的時(shí)候,一方面做PaaS平臺(tái)本身,另外我們也在研究另外一個(gè)話(huà)題,到底傳統(tǒng)的應(yīng)用是怎么能夠搬到PaaS上來(lái)的。一般我們說(shuō)***件事情我要建云,第二件事情是要遷云,就是把東西遷上來(lái)。當(dāng)我們建一個(gè)PaaS平臺(tái),沒(méi)有人來(lái)用的時(shí)候,那就只是技術(shù)上的一個(gè)先進(jìn)性而已,我說(shuō)來(lái)說(shuō)去沒(méi)有人用。但是又有多少應(yīng)用是新建的呢,很多是從傳統(tǒng)的應(yīng)用遷移到云上來(lái)的。遷移到云上來(lái)的時(shí)候,我們知道傳統(tǒng)的應(yīng)用,我們過(guò)去看到的很多應(yīng)用在前幾年,在容器化發(fā)展之前,那些應(yīng)用基本都是以虛機(jī)化的應(yīng)用比較多。我們知道虛機(jī)化的應(yīng)用,那時(shí)候通常是以虛擬機(jī)為單位進(jìn)行隔離。所以它的隔離性只能體現(xiàn)在虛擬機(jī)上,應(yīng)用如果享用隔離,就必須建不同的虛擬機(jī)。所以通常的做法就是一個(gè)應(yīng)用會(huì)啟一個(gè)虛擬機(jī),或者一個(gè)集中的應(yīng)用啟一個(gè)虛擬機(jī)。
但是我們知道虛擬機(jī)的啟停和容器的啟停級(jí)別肯定不在一個(gè)級(jí)別上的,容器其實(shí)就是一個(gè)啟一個(gè)進(jìn)程,容器如果還能提供隔離機(jī)制的話(huà),我們就能產(chǎn)生***個(gè)好處,我們可以在一臺(tái)機(jī)器上布很多的容器。而每一個(gè)容器之間是互相隔離的,因?yàn)檫@個(gè)技術(shù)大家都很了解,我只是談?wù)勀芙o大家?guī)?lái)的好處,傳統(tǒng)應(yīng)用的不同組件就可以核設(shè)到一臺(tái)機(jī)器上去。核設(shè)到一臺(tái)機(jī)器上的好處就是,我不需要很多很小的虛擬機(jī)。舉個(gè)例子,我現(xiàn)在的物理機(jī)規(guī)模都很大,48核,128的,256內(nèi)存的機(jī)器。過(guò)去畫(huà)10個(gè)虛擬機(jī)或者20個(gè)虛擬機(jī)。但是一旦畫(huà)完虛擬機(jī)之后,虛擬化本身的消耗也很牛,而且這個(gè)管理也很麻煩。在這種情況下,如果我們可以把一個(gè)應(yīng)用的不同組件核設(shè)到一臺(tái)機(jī)器,同時(shí)又能夠做到一定的隔離性,這樣我應(yīng)用的部署是不是也會(huì)變得相對(duì)的簡(jiǎn)單起來(lái)了,這也是一個(gè)站在虛擬化和容器化角度來(lái)看應(yīng)用部署革新性的變化。就是我程序的核設(shè)部署變得非常簡(jiǎn)單,而虛擬機(jī)的用度可以不需要畫(huà)的非常的小,這樣我應(yīng)用的管理也會(huì)變得非常的容易。所以從這些角度來(lái)看的話(huà),應(yīng)用這個(gè)層面,將來(lái)的管理就會(huì)有新的不同的理解和突破。
剛才提到應(yīng)用本身的變革之后,回到剛才這個(gè)話(huà)題上我們可以簡(jiǎn)單的說(shuō)一下。容器化來(lái)了之后,讓我們的應(yīng)用程序的啟停變得非常的簡(jiǎn)單,它對(duì)外的接口變成單一化、容易化去處理。第二它整個(gè)的遞送變得非常簡(jiǎn)單,我們不需要手工做各種各樣的拷貝。第三它在一臺(tái)機(jī)器上可以核設(shè)很多的應(yīng)用程序,讓我們的程序管理變得簡(jiǎn)單。
在這種情況下我們?cè)傧隤aaS再往上的能力,我們剛才說(shuō)了有了容器化的特點(diǎn)之外,是不是離我們剛才最早說(shuō)的理想的模式到底還差多遠(yuǎn)呢。剛才說(shuō)了一個(gè)應(yīng)用的后半生我們希望***做到的是,***個(gè)它的安裝、部署、管理、彈性伸縮全變成自動(dòng)化了,全是可編排的,我的應(yīng)用寫(xiě)什么,應(yīng)用程序運(yùn)用什么功能,也都是平臺(tái)自己給我提供的,這是一個(gè)理想的模式。要達(dá)到這個(gè)理想的模式,是不是剛才說(shuō)的docker的那三個(gè)特征,就能滿(mǎn)足我們所有的需求了呢,現(xiàn)在看還是差一些。
會(huì)差哪些呢?我們做一個(gè)應(yīng)用的時(shí)候,分析一個(gè)應(yīng)用的時(shí)候,往往一個(gè)應(yīng)用并不都是一個(gè)簡(jiǎn)單的應(yīng)用,一個(gè)應(yīng)用并不是簡(jiǎn)單的,甚至連最簡(jiǎn)單的應(yīng)用,我要做一個(gè)高可用的外部的BBS的應(yīng)用,或者一個(gè)blood的應(yīng)用,是不是都有一個(gè)前端,一個(gè)緩存,一個(gè)數(shù)據(jù)庫(kù),再加一個(gè)什么東西,都是相對(duì)復(fù)雜的幾個(gè)節(jié)點(diǎn)或者幾類(lèi)東西組成的。這幾個(gè)節(jié)點(diǎn),幾類(lèi)東西,我們單獨(dú)拿一個(gè)節(jié)點(diǎn),或者一類(lèi)程序,拿docker來(lái)做,好像都能夠提升部署的效率或者效果。
但是作為一個(gè)整體的應(yīng)用,我是不是還得把這幾個(gè)東西單獨(dú)手工的弄一遍呢?還有一個(gè)機(jī)制能夠把一個(gè)應(yīng)用不同的組件,或者是不同的部分,能夠把它編串起來(lái),形成一個(gè)整體。我們以這個(gè)整體為單位,來(lái)看應(yīng)用,是不是這樣就會(huì)比較理想一些。所以我們就希望另外一個(gè)概念,有一個(gè)機(jī)制是跨不同的,每一個(gè)應(yīng)用程序,組成一個(gè)虛擬整體的應(yīng)用的角度。這個(gè)時(shí)候我們通常會(huì)說(shuō),當(dāng)然這個(gè)調(diào)度的核心有很多,我們可能會(huì)選Kuberentes,因?yàn)榻裉焐衔缙渌膶?zhuān)題也都提到了我們有Kuberentes,有很多很多的平臺(tái)做這件事情。不管是哪個(gè)平臺(tái)都要解決這些問(wèn)題。
舉個(gè)例子,一個(gè)應(yīng)用的不同節(jié)點(diǎn)它的關(guān)系是什么,它啟停的順序有沒(méi)有要求。上一個(gè)應(yīng)用的不同節(jié)點(diǎn)之間要不要理解對(duì)方的存在,這個(gè)應(yīng)用程序給外部提供服務(wù)的時(shí)候,別人怎么能找得到它。這個(gè)應(yīng)用如果做擴(kuò)縮容的時(shí)候,到底是整個(gè)應(yīng)用做擴(kuò)縮容,還是某個(gè)節(jié)點(diǎn)是瓶頸的時(shí)候做擴(kuò)縮容。這些東西怎么做,如果這些東西都不能組件化或者做好的話(huà),我們只看docker自身是沒(méi)有意義的。所以我們總需要這些東西,把這些東西都做掉。所以我們就希望有另外一個(gè)更全面的系統(tǒng)來(lái)覆蓋這些內(nèi)容。僅僅是單機(jī)的容器往往是不夠的,所以一個(gè)生態(tài)環(huán)境里面還需要很多其他的內(nèi)容。
我們提到了Kuberentes,這是編排方案的一種,我們其實(shí)在這上面做了一些擴(kuò)展和擴(kuò)充,也會(huì)把這些回饋到社區(qū)去,希望這個(gè)東西能夠做的更好,業(yè)界有其他的。只不過(guò)Kuberentes現(xiàn)在看,在社區(qū)的發(fā)展上這一塊發(fā)展的比較紅火。我們知道技術(shù)上沒(méi)有絕對(duì)的先進(jìn)和落后性,這是***。第二開(kāi)源的世界里面大家都能互相看到對(duì)方技術(shù)的實(shí)現(xiàn),就算我今天比你差一點(diǎn),不代表我明天會(huì)比你差,所以絕對(duì)的好和差我認(rèn)為是在一個(gè)瞬間存在的,但是長(zhǎng)時(shí)間看是不存在的。但是一個(gè)東西是不是能發(fā)展的好,得看社區(qū)的紅火程度。如果說(shuō)人多,眾人拾柴火焰高,只有人多了,這個(gè)事情才能發(fā)展的起來(lái)。所以我們可以看Kuberentes社區(qū)的熱度還是非常高的。
我們往下看,基本概念就不說(shuō)了,說(shuō)了很多遍了,而且大家到網(wǎng)上隨便一搜都能知道這些基本的概念。這是它整體的架構(gòu),我也不怎么說(shuō)了。這是一個(gè)典型應(yīng)用創(chuàng)建的流程,這是調(diào)度器的分析過(guò)程。我就提到一個(gè)調(diào)度器的算法,剛才我們也提到了一個(gè)應(yīng)用不是被拆解成很多單一的應(yīng)用組件,一個(gè)大的應(yīng)用會(huì)看成是很多組件的一個(gè)組合。一個(gè)應(yīng)用布下之后,我們過(guò)去的做法是說(shuō),我要布一個(gè)應(yīng)用,部署在哪臺(tái)機(jī)器上去,通常我們過(guò)去的想法都是這樣操作這件事情。我布一個(gè)應(yīng)用到這臺(tái)機(jī)器上去,這個(gè)機(jī)器的IP假設(shè)是192 168.1.1的節(jié)點(diǎn),我要把這個(gè)應(yīng)用部署到這個(gè)節(jié)點(diǎn)。請(qǐng)注意,我說(shuō)的我要把應(yīng)用部署到這個(gè)節(jié)點(diǎn)。因?yàn)檫@個(gè)節(jié)點(diǎn)是我知道的,它能夠滿(mǎn)足用戶(hù)的或者這個(gè)應(yīng)用需求的。這種做法,當(dāng)然做肯定是沒(méi)有問(wèn)題,這叫命令式的一種做法,就是我做這件事情。
倒過(guò)來(lái)我們可以看,是不是還有另一種不同的做法。另外一種做法就是,我要布一個(gè)應(yīng)用,我希望有一個(gè)CPU,2G內(nèi)存的機(jī)器布它就夠了,我有這樣一個(gè)需求。我把這個(gè)需求下下去,反正你這個(gè)系統(tǒng)幫我能找到這樣一個(gè)東西,你能按照我的需求提供這樣一個(gè)資源,就把我的應(yīng)用給部好了,這是不是也是一個(gè)做法。
這個(gè)做法和剛才那個(gè)做法的區(qū)別是什么呢?剛才那個(gè)做法是命令式的,我要做這件事情。第二個(gè)做法是我有這個(gè)需求,請(qǐng)你幫我做這件事。這兩個(gè)是有區(qū)別的,對(duì)于我們一個(gè)理想的模式而言,我們應(yīng)用程序的將來(lái)運(yùn)營(yíng)和運(yùn)維理想的模式,***種和第二種最終結(jié)果并沒(méi)有什么區(qū)別。但是好處在什么地方呢?當(dāng)我提出是一個(gè)需求的時(shí)候,這個(gè)需求的滿(mǎn)足是有系統(tǒng)幫我去想怎么去做的,就有一定的主動(dòng)性。當(dāng)它有了主動(dòng)性的時(shí)候,它的主動(dòng)性是不是可以復(fù)制。我現(xiàn)在告訴它我需要部署一個(gè)1C2G的資源就夠了。當(dāng)這個(gè)1C2G的資源出錯(cuò)了,這臺(tái)機(jī)器壞掉了。因?yàn)樗牢业男枨?,還可以再找一個(gè)1C2G的資源,是不是它有了主動(dòng)性之后,可以幫我做更多的事情。如果我告訴他部署在192.168.1.1的機(jī)器上,如果這臺(tái)機(jī)器壞掉了,平臺(tái)能幫我們干什么呢。它只能說(shuō)抱歉這臺(tái)機(jī)器壞掉了,我還有一個(gè)1.2的能不能用,我還得告訴它1.2的我看看能用,你再用。就是當(dāng)我指定到動(dòng)作本身的時(shí)候,這個(gè)時(shí)候系統(tǒng)的主動(dòng)性就降低了。我們期望的是我們只提需求,讓平臺(tái)幫我們做決策和調(diào)度。這時(shí)候當(dāng)系統(tǒng)出問(wèn)題,或者系統(tǒng)沒(méi)有出問(wèn)題,將來(lái)壓力變大的時(shí)候,我需要做擴(kuò)縮容的時(shí)候,這個(gè)時(shí)候它的主動(dòng)性就可以繼續(xù)發(fā)揮作用,這就是我們調(diào)度系統(tǒng)需要做的事情。
調(diào)度系統(tǒng)就是把過(guò)去命令式的調(diào)度算法,變成我是需求,讓它主動(dòng)幫我調(diào)度算法的過(guò)程。這就是很多調(diào)度器底層需要做的事情,我們來(lái)提要求,它來(lái)提實(shí)現(xiàn)。它來(lái)提實(shí)現(xiàn)的話(huà)有很多方法,一般我們會(huì)講一個(gè)例子,基本的調(diào)度器。***它得把排他性的元素給去掉。舉個(gè)例子,我不希望部在一個(gè)網(wǎng)絡(luò)很差的節(jié)點(diǎn)上,我不希望和那個(gè)應(yīng)用程序部一起,我不希望怎么怎么著,就是一些排他性的條件一定要先去執(zhí)行掉。因?yàn)檫@個(gè)排他性的條件一旦發(fā)揮作用,所有涉及到的可能的資源都要排他性的去掉。第二個(gè)階段如果所有排他性的都去掉了,所有剩下的都是侯選的了,都是可用的了。在都是可用的情況下我選一個(gè)***的,更合適的節(jié)點(diǎn)做這件事情。所以整個(gè)系統(tǒng)調(diào)度核心就是從這兩個(gè)角度看問(wèn)題,***個(gè)是先做排他性的,第二再做***性的。所以在KBS里面也是有這套調(diào)度器的過(guò)程和不同的算法組成的,不同的算法我們都可以配的。這些算法都是我們可以插進(jìn)去的,當(dāng)然了它提供了一些默認(rèn)的基本的算法,可以讓我們使用預(yù)定義的算法做資源的調(diào)度,這是一個(gè)基本的調(diào)度的過(guò)程。
其實(shí)親和性和反親和性的也是調(diào)度的一個(gè)過(guò)程而已,親和性和反親和性就是剛才算法的一些特例,但是為什么單獨(dú)提出來(lái)呢?因?yàn)樵诤芏嗨惴ɡ锩?,在很多的?shí)際場(chǎng)景里面,親和性和反親和性的作用還是非常大的。舉個(gè)例子,我們?cè)谧鰬?yīng)用的,剛才說(shuō)我們過(guò)去是命令式的,現(xiàn)在是需求式的,提需求,去定義的方式去做的。我的需求定于的方式去做的時(shí)候,其實(shí)我真的不知道底層到底能給我調(diào)度到什么地方去,因?yàn)椴皇俏抑付ǖ墓?jié)點(diǎn)。因?yàn)榘雅潘詶l件去掉之后,合適的節(jié)點(diǎn)可能還有幾十個(gè),這種情況下我們有時(shí)候?yàn)榱藨?yīng)用的特別的需要,特別是高可用的需要,或者是一些其他的需要,會(huì)有一些特別的要求。這種特別的要求就要求有些應(yīng)用程序是希望離的越遠(yuǎn)越好,或者說(shuō)它不希望在一個(gè)物理機(jī)器上存在。這樣就導(dǎo)致這一臺(tái)物理機(jī)器如果出了故障,它所有的節(jié)點(diǎn)都宕掉了。如果它在不同數(shù)據(jù)中心,你換一個(gè),它的數(shù)據(jù)中心還在。這就有點(diǎn)類(lèi)似于反親和的戰(zhàn)略。
親和性策略是什么意思呢?剛好這兩個(gè)應(yīng)用,一個(gè)應(yīng)用是白天忙的,一個(gè)應(yīng)用就是晚上忙的。本來(lái)它倆之間對(duì)資源的需求就是交叉的,它倆如果親和在一起是不是比較理想。如果我們指令性的告訴它,這兩個(gè)應(yīng)用***能放在一起。當(dāng)然我們所謂說(shuō)的無(wú)論是親和性還是反親和性,都是一個(gè)建議,就是我對(duì)它的一個(gè)要求。它如果在滿(mǎn)足的情況下,盡量會(huì)幫我們鋪在一起。當(dāng)兩個(gè)應(yīng)用程序剛好對(duì)資源的需求有波峰、波谷差異的時(shí)候,我們?nèi)绻o它一個(gè)親和性需求的話(huà),就會(huì)盡量的把這兩個(gè)應(yīng)用鋪在一起,這就是親和性和反親和性。其實(shí)親和性和反親和性也是上一頁(yè)說(shuō)的這些調(diào)度算法的一類(lèi),只不過(guò)我單獨(dú)拎出來(lái)的意思是,這些東西其實(shí)是我們真正業(yè)務(wù)使用之后需要著重考慮的算法。
有了這些之后,我們應(yīng)用的部署過(guò)程就變成了我只需要告訴你,我要部一個(gè)應(yīng)用了,需要什么樣的資源,你大概按照我的標(biāo)準(zhǔn)部就可以了,是不是把部的過(guò)程交給了一個(gè)平臺(tái)了。交給這個(gè)平臺(tái)之后,剛才我們也提到這個(gè)應(yīng)用真正部的過(guò)程,就是它選到這個(gè)節(jié)點(diǎn),真正部的過(guò)程也變成了。過(guò)去是我要把程序拷上來(lái),還要安裝,還要執(zhí)行它的安裝腳本,啟動(dòng)的時(shí)候要執(zhí)行啟動(dòng)腳本。重啟的時(shí)候壓執(zhí)行重啟腳本。這樣一系列過(guò)程就變成一個(gè)容器的啟和停,是不是這個(gè)啟停的過(guò)程也標(biāo)準(zhǔn)化了。所以通過(guò)這兩層的概念,把我們應(yīng)用部署的過(guò)程就統(tǒng)一起來(lái)了。是不是離我們剛才說(shuō)理想的模式又進(jìn)了一步。
我們?cè)倩剡^(guò)頭看一下,我們剛才說(shuō)一個(gè)應(yīng)用后半生的理想模式大概是什么樣的,我再簡(jiǎn)單重復(fù)一下。我們期望***我的應(yīng)用要使用的這些功能,現(xiàn)成的如果有,我拿現(xiàn)成的就OK了,這是***個(gè)我希望的模式。第二個(gè)我的程序只關(guān)心我的業(yè)務(wù)邏輯,我寫(xiě)完之后我的應(yīng)用的部署、管理,生命周期所有的東西,是不是今天幫我們自動(dòng)就完成了,這就是我理想的一個(gè)模式。所以如果做到剛才說(shuō)的這兩點(diǎn)之后,是不是離我們理想的模式又近了一步。剛才說(shuō)到理想模式的前一個(gè)問(wèn)題,我希望是不是現(xiàn)有的這些應(yīng)用,現(xiàn)有的功能如果有,我直接利用就可以了,我不需要再開(kāi)發(fā)了,我不需要把這個(gè)東西再發(fā)明一遍了。
這件事情是怎么幫它做的呢?平臺(tái)希望提供一整套的服務(wù)目錄這個(gè)概念。我們知道在整個(gè)PaaS平臺(tái)里面會(huì)管兩大類(lèi)的東西,其實(shí)兩大類(lèi)的東西本質(zhì)是一類(lèi)東西,都是應(yīng)用。但是我們還給這兩大類(lèi)應(yīng)用稍微做了一下擴(kuò)展分類(lèi)。一類(lèi)東西叫做純的應(yīng)用程序,叫應(yīng)用,還有一類(lèi)叫服務(wù),其實(shí)服務(wù)也是一類(lèi)應(yīng)用。但是服務(wù)和應(yīng)用稍微有一點(diǎn)點(diǎn)區(qū)別。這個(gè)服務(wù)是可以被自動(dòng)化使用的應(yīng)用,叫服務(wù)。我們的應(yīng)用可以給人用,當(dāng)然也可以給外部用。而服務(wù)主要是給另一個(gè)應(yīng)用,或者另一個(gè)服務(wù)用的,這種東西其實(shí)也是一種應(yīng)用,只是我們把它給稍微的做了一下歸類(lèi)。所有的服務(wù)系統(tǒng)都會(huì)有一個(gè)服務(wù)的目錄,目錄里面有我系統(tǒng)里面現(xiàn)存的,大家通常知道的redis服務(wù),SEQ的服務(wù),DDS的服務(wù),有很多這種服務(wù),這種都是大家都會(huì)用到的通用的服務(wù)。
這種服務(wù)應(yīng)用程序開(kāi)發(fā)的時(shí)候我們用就行了,甚至我們過(guò)去說(shuō),我拿一個(gè)輪子的話(huà),可能會(huì)編譯到我的代碼里面去,這是一種使用方法。再往后的使用方法,既然大家都耦合了,是不是說(shuō)我要想用個(gè)redis,我就從平臺(tái)里面訂購(gòu)一個(gè)事例就可以了。平臺(tái)只需要告訴我說(shuō)你訪(fǎng)問(wèn)的redis的地址是什么,你的用戶(hù)名密碼是什么,是不是就夠了。我們告訴系統(tǒng)說(shuō)我需要一個(gè)redis服務(wù),我需要10G的空間,我希望它高可用,我就是提這些要求。類(lèi)似于剛才我部一個(gè)應(yīng)用的時(shí)候,我提一個(gè)要求,我需要1個(gè)CPU,2個(gè)G的內(nèi)存,或者我需要一個(gè)實(shí)際的網(wǎng)卡,或者我需要一個(gè)1G的網(wǎng)卡,或者我需要一個(gè)本地盤(pán)是什么,我需要一個(gè)遠(yuǎn)程盤(pán)是什么,你提要求就行了。
服務(wù)也是一樣的概念,你的應(yīng)用程序提一個(gè)要求,系統(tǒng)就會(huì)把服務(wù)給你找到這個(gè)服務(wù),給你生成你需要的實(shí)例,然后把訪(fǎng)問(wèn)信息給你,你就可以使用這個(gè)服務(wù)了。這個(gè)時(shí)候是不是離我們剛才的理想又近了一步。
我現(xiàn)在想用服務(wù),系統(tǒng)也給我提供了,服務(wù)的在哪兒我不用管,服務(wù)的容量我只要提就行了,要求只要提就可以了。它就會(huì)告訴我訪(fǎng)問(wèn)的地址和用戶(hù)名和密碼。而我的應(yīng)用,我只需要寫(xiě)程序就可以了,我部署的時(shí)候只需要提要求,我需要什么CPU,什么內(nèi)存就可以了。到底這個(gè)機(jī)器的IP,部在哪兒,我都不需要case。是不是我們應(yīng)用程序離這個(gè)項(xiàng)目又近了一步,我們***只關(guān)注業(yè)務(wù)邏輯本身這件事情更理想化一點(diǎn)了。
實(shí)現(xiàn)剛才這個(gè)過(guò)程,我們PaaS里面完成了兩大件事情,一個(gè)就是整個(gè)應(yīng)用生命周期的管理,第二個(gè)就是與服務(wù)有關(guān)的管理。我們希望離理想模式再近一步,我們過(guò)去可能寫(xiě)了很多的應(yīng)用程序,可能我寫(xiě)很多的組件。如果我只寫(xiě)一個(gè)簡(jiǎn)單的應(yīng)用程序,就是web的,中間一個(gè)redis,下面就是一個(gè)mySQL,一個(gè)很簡(jiǎn)單的應(yīng)用大概是這樣的模式構(gòu)成的。
所以我們PaaS還會(huì)提供另外一種能力,就是我現(xiàn)在已經(jīng)開(kāi)發(fā)的應(yīng)用組件,我有一種編排的能力,我把這種已有的組件可以通過(guò)一種描述,把它編排起來(lái)。這個(gè)編排里面寫(xiě)哪些信息呢?一個(gè)信息是我一個(gè)大的應(yīng)用,編排一個(gè)大的應(yīng)用,里面有多少個(gè)小的應(yīng)用組成,這些應(yīng)用之間的關(guān)系是什么,它們啟停的優(yōu)先順序是什么。如果這個(gè)東西都可以用一種描述語(yǔ)言描述出來(lái)之后,我們把這個(gè)描述語(yǔ)言打成包,是不是我以后部署直接把這個(gè)描述語(yǔ)言部下去就可以了。系統(tǒng)可以根據(jù)我的描述語(yǔ)言對(duì)它提供的要求,執(zhí)行我們描述性的一些語(yǔ)句,***能夠負(fù)責(zé)把整個(gè)應(yīng)用啟起來(lái)的目的。如果這個(gè)東西有的話(huà),以后如果這個(gè)應(yīng)用架構(gòu)發(fā)生變化之后,我是不是簡(jiǎn)單的改改描述語(yǔ)言就可以了。朝這個(gè)方向走的話(huà),我們通常說(shuō)PaaS還會(huì)提供一個(gè)能力,就是整個(gè)上面跨應(yīng)用的編排能力。這個(gè)編排能力有的話(huà),就使我們應(yīng)用的部署和將來(lái)的變化,變得非常的容易。這個(gè)編排能力有的時(shí)候,就是一種描述語(yǔ)言,描述語(yǔ)言的好處是說(shuō),我寫(xiě)完之后可以管理版本,每一次變化直接調(diào)調(diào)那個(gè)描述的東西就可以了。
對(duì)于這個(gè)描述語(yǔ)言再增強(qiáng)的需求是什么呢,有沒(méi)有一個(gè)可視化的方法,把這個(gè)描述語(yǔ)言給展示出來(lái)。我們很清楚的看到,過(guò)去從腦子里看到我有一個(gè)應(yīng)用,前面有一個(gè)web的應(yīng)用,中間一個(gè)redis或者什么,我都在嘴上說(shuō)。是不是我可以畫(huà)出來(lái),上面一個(gè)這個(gè),這里一個(gè),中間連一根線(xiàn),這根線(xiàn)就描述了它的依賴(lài)關(guān)系。這根線(xiàn)的關(guān)系可能是代表了我依賴(lài)于一個(gè)redis的服務(wù),這個(gè)服務(wù)我再講細(xì)一點(diǎn),服務(wù)也算很多類(lèi)型。這個(gè)服務(wù)可能因?yàn)槟氵@個(gè)應(yīng)用程序存在而部的一個(gè)服務(wù),也可能是應(yīng)用公共的一個(gè)服務(wù)。
所以框到這兒之后,我們?cè)倩剡^(guò)頭看看我們的理想能實(shí)現(xiàn)到什么程度了。我們有這樣一個(gè)平臺(tái),***是我們所有的應(yīng)用,我先不講前半生,前半生里可能含的是我先寫(xiě)代碼,我寫(xiě)一個(gè)代碼。假設(shè)我一個(gè)應(yīng)用有很多微服務(wù)組成,我先定義了微服務(wù)的IDL,上個(gè)話(huà)題。我寫(xiě)了IDL,就把一個(gè)應(yīng)用拆成很多很多的部件組成。把IDL編譯成一個(gè)組件,每一個(gè)組件裝代碼,我在每個(gè)組件里面寫(xiě)我自己的應(yīng)用程序,業(yè)務(wù)邏輯。寫(xiě)完業(yè)務(wù)邏輯,提交到源代碼的倉(cāng)庫(kù)上去。這個(gè)應(yīng)用后面編譯和部署的流程,通過(guò)上個(gè)講期我們說(shuō)的DevOps拖拉拽的環(huán)節(jié),我給它制訂了一些標(biāo)標(biāo)準(zhǔn)的拖拉拽的過(guò)程。***一個(gè)節(jié)點(diǎn)如果所有的編譯都OK,那么就是上鏡像,然后去部署。部署的時(shí)候,因?yàn)槲覀兲崆皶?huì)設(shè)計(jì)好一個(gè)應(yīng)用有多少組件組成的,這些組件之間的關(guān)系我就用一個(gè)圖形化的工具,假定我這些應(yīng)用的鏡像都已經(jīng)OK了,我就提前把這個(gè)自動(dòng)化的工具,把應(yīng)用各個(gè)的關(guān)系和部署的組件的關(guān)系畫(huà)成一個(gè)部署的圖,畫(huà)完之后存在系統(tǒng)里面作為一個(gè)模板放在那兒就可以了。
之后我就開(kāi)始去開(kāi)發(fā),開(kāi)發(fā)之后我只要一提交我的源代碼,是不是它的整個(gè)DevOps流程就開(kāi)始往下走。走到***一步,是不是生成了各種各樣的鏡像。生成鏡像之后,又會(huì)觸發(fā)部署的過(guò)程,這個(gè)部署的過(guò)程就是我們剛剛說(shuō)的用圖形化工具編排的那個(gè)應(yīng)用的整個(gè)部署的關(guān)系描述。然后靠那個(gè)關(guān)系描述,因?yàn)槟莻€(gè)關(guān)系描述里面并不規(guī)定我一定要部署在哪些機(jī)器上,我只需要資源需求就可以了。我下面只要有了足夠的資源,有系統(tǒng)幫我們?nèi)グ衙恳粋€(gè)節(jié)點(diǎn)都挑一個(gè)很合適的資源,分配給它。分配給它之后,同時(shí)把它部下去。部下去之后,就完成了我們整個(gè)應(yīng)用的代碼編寫(xiě),到***整個(gè)上線(xiàn)的過(guò)程。
剛才我們也提到了因?yàn)槲覀冊(cè)谠O(shè)計(jì)那個(gè)圖的時(shí)候,會(huì)除了做部署上的策略以外,還會(huì)有一些其他策略。舉個(gè)例子,像彈性伸縮策略,灰度發(fā)布策略,這些策略都可以在那個(gè)圖里面描述出來(lái)。這些策略最終會(huì)結(jié)合什么呢,因?yàn)镻aaS底層有一定的兼并性?;旧线@樣離我們期望的目標(biāo)就比較接近了,最終我們監(jiān)控的部分配合到彈性伸縮的策略,和我們灰度發(fā)布的策略,使我們的整個(gè)應(yīng)用,在將來(lái)運(yùn)營(yíng)的過(guò)程之中,舉個(gè)例子,比如負(fù)荷很高的時(shí)候,可以增加一些節(jié)點(diǎn),負(fù)荷很低的時(shí)候,在我的空檔的周期之后會(huì)把節(jié)點(diǎn)降下來(lái)。大概這樣整個(gè)的過(guò)程就OK了。
剛才我是站在研發(fā)角度去看PaaS給我們開(kāi)發(fā)的過(guò)程帶來(lái)的好處,我再稍微總結(jié)一下,我們期望做到的是什么呢。***我們DevOps能夠把我整個(gè)應(yīng)用的生命周期前半生和后半生都管起來(lái)。第二我后半生管的時(shí)候,我只提一些要求,由平臺(tái)主動(dòng)的幫我們進(jìn)行各種各樣的調(diào)度。第三我們運(yùn)維過(guò)程里面的這些東西,都是根據(jù)我們的調(diào)度策略和算法自動(dòng)的幫我們完成,而不是我們手工要做的。能夠把這些東西都實(shí)現(xiàn),我們的service可以提供讓我們能夠把現(xiàn)有應(yīng)用的能力整合起來(lái),能夠把這些點(diǎn)都實(shí)現(xiàn)了之后,我們就希望關(guān)注于寫(xiě)業(yè)務(wù)邏輯,使我們整個(gè)應(yīng)用的管理變得更加的簡(jiǎn)單。這就是我們期望在做PaaS設(shè)計(jì)的過(guò)程里面,要做的這一點(diǎn)。所以我們所有的組件都是圍繞這些點(diǎn)去做的。剛才也提到一些問(wèn)題,我們?nèi)プ稣{(diào)度的時(shí)候會(huì)有哪些問(wèn)題,我的部分基本到這里就結(jié)束了。
(結(jié)束)