本文來(lái)自微信公眾號(hào)“twt企業(yè)IT社區(qū)”,作者/汪照輝,中國(guó)銀河證券架構(gòu)師,專注于容器云、微服務(wù)、DevOps、數(shù)據(jù)治理、數(shù)字化轉(zhuǎn)型等領(lǐng)域,對(duì)相關(guān)技術(shù)有獨(dú)特的理解和見(jiàn)解。擅長(zhǎng)于軟件規(guī)劃和設(shè)計(jì),提出的“平臺(tái)融合”的觀點(diǎn)越來(lái)越得到認(rèn)同和事實(shí)證明。發(fā)表了眾多技術(shù)文章探討容器平臺(tái)建設(shè)、微服務(wù)技術(shù)、DevOps、數(shù)字化轉(zhuǎn)型、數(shù)據(jù)治理、中臺(tái)建設(shè)等內(nèi)容,受到了廣泛關(guān)注和肯定。
一直都有很多人迷惑于容器應(yīng)該屬于IaaS或是PaaS層,也搞不清楚容器云到底是該歸到哪里,該由哪個(gè)團(tuán)隊(duì)來(lái)建設(shè)、哪個(gè)團(tuán)隊(duì)來(lái)維護(hù)。K8s是不是就等同于容器云?所以我們看到概念和定義的混亂,在實(shí)施容器云的時(shí)候也會(huì)有眾多的分歧,無(wú)所適從。目前又有眾多的公司推出容器化PaaS的概念,更搞不清楚誰(shuí)是誰(shuí)了。那么容器、容器云、容器化PaaS以及與Docker、Kubernetes之間是個(gè)什么樣的關(guān)系?這是需要我們明確并理解的問(wèn)題。
容器是一種操作系統(tǒng)級(jí)虛擬化技術(shù),Docker是一種容器引擎。使用Docker來(lái)運(yùn)行操作容器。但從容器自身來(lái)說(shuō),其提供的是IaaS層能力。Kubernetes提供了容器調(diào)度和管理的能力,加上云計(jì)算租戶功能,實(shí)現(xiàn)容器云平臺(tái)功能。而基于容器技術(shù)所構(gòu)建的應(yīng)用開(kāi)發(fā)、應(yīng)用托管和應(yīng)用運(yùn)維平臺(tái)則可以稱為容器化PaaS平臺(tái),它是一種輕量化PaaS實(shí)現(xiàn)。結(jié)合日志、監(jiān)控、認(rèn)證、權(quán)限等基礎(chǔ)能力則可以構(gòu)建企業(yè)級(jí)的平臺(tái)和可復(fù)用服務(wù),采用微服務(wù)架構(gòu)實(shí)現(xiàn)企業(yè)技術(shù)服務(wù)中臺(tái)能力,支撐企業(yè)業(yè)務(wù)敏捷研發(fā)和模式轉(zhuǎn)型。
一、容器
容器是一種輕量虛擬化技術(shù),它不同于VMware虛擬化,所以其隔離性相對(duì)差、安全性差,但輕量也正是其特點(diǎn)。容器的概念其實(shí)也早就有之,只不過(guò)實(shí)踐的選擇有差別。早在2006年的時(shí)候,我當(dāng)時(shí)所在的公司就提出了基于java的多jvm Containers概念并進(jìn)行了產(chǎn)品實(shí)踐,一個(gè)java容器可以運(yùn)行多個(gè)jvm,不過(guò)因?yàn)閖ava自身特性導(dǎo)致的后來(lái)轉(zhuǎn)型并不成功,最后不得不放棄了。應(yīng)用層容器和操作系統(tǒng)級(jí)容器的實(shí)現(xiàn)還是有很大差別。操作系統(tǒng)級(jí)的容器設(shè)計(jì)明顯更合理,更易于實(shí)現(xiàn)和推廣。通過(guò)標(biāo)準(zhǔn)化鏡像封裝,從而實(shí)現(xiàn)了環(huán)境一致性。
容器為了彈性伸縮能力傾向于無(wú)狀態(tài)應(yīng)用,這樣簡(jiǎn)化了容器設(shè)計(jì)實(shí)現(xiàn)的復(fù)雜性。所以基于容器自身的特點(diǎn),容器適用的場(chǎng)景并不是無(wú)限的。當(dāng)然kubernetes從1.9版本正式支持有狀態(tài)應(yīng)用,增強(qiáng)了容器的場(chǎng)景適應(yīng)能力,擴(kuò)展了適用場(chǎng)景。
經(jīng)常有人拿容器和虛擬機(jī)比較,雖然都是虛擬化,但二者差別還是很大的。虛擬機(jī)就好比是一個(gè)完整的人,而容器類似于媽媽肚子里的胎兒。它需要依賴于母體來(lái)生存,所以我們可以看到容器在操作系統(tǒng)中以進(jìn)程的方式運(yùn)行。容器的虛擬化損耗約1%,而虛擬機(jī)的損耗約20%左右。但是容器帶來(lái)了管理和運(yùn)維的復(fù)雜性。Docker提供了CLI和REST API方式,都需要很高學(xué)習(xí)成本,在達(dá)到一定數(shù)量的容器后用CLI來(lái)管理和運(yùn)維將會(huì)是噩夢(mèng),所以有Docker Swarm、Mesos、Kubernetes等容器調(diào)度管理框架的出現(xiàn),提升管理和運(yùn)維效率,降低運(yùn)維難度和工作量。
既然容器也是操作系統(tǒng)級(jí)的虛擬化,其可以看作類似于虛擬機(jī)的對(duì)象,容器本身提供的服務(wù)依然是基礎(chǔ)設(shè)施資源服務(wù),所以容器應(yīng)該是處于IaaS層。而基于容器技術(shù)和容器調(diào)度管理技術(shù)如kubernetes實(shí)現(xiàn)的容器云平臺(tái)則封裝了容器操作,提供平臺(tái)能力,所以容器云平臺(tái)應(yīng)該屬于PaaS層。這也是很多人直接把容器云平臺(tái)稱為PaaS平臺(tái)的原因吧。不過(guò)確切的說(shuō),容器云平臺(tái)并非真的PaaS。目前很多容器云平臺(tái)所提供的能力無(wú)法滿足應(yīng)用開(kāi)發(fā)、應(yīng)用托管、應(yīng)用運(yùn)維的PaaS平臺(tái)能力要求,而通常僅僅實(shí)現(xiàn)租戶+云端的容器調(diào)度管理能力,依然有大量的CLI運(yùn)維工作。對(duì)使用容器云的人員的學(xué)習(xí)成本和要求都比較高。
二、容器云
Kubernetes并不等于容器云,kubernets只是一種容器調(diào)度管理框架,和docker swarm、mesos等一樣,用于調(diào)度、管理容器。比如調(diào)度容器到匹配的資源上,管理容器的彈性伸縮、灰度發(fā)布、負(fù)載路由等。云計(jì)算很重要的一個(gè)概念是租戶。租戶租用共享的云計(jì)算資源,按需和用量計(jì)費(fèi),不用則不產(chǎn)生費(fèi)用。而kubernetes中是沒(méi)有租戶的概念的。所以僅有kubernetes是不夠的,kubernetes可以看作是容器云平臺(tái)的內(nèi)核,我們需要使用kubernetes來(lái)實(shí)現(xiàn)容器云平臺(tái),但還需要基于kubernetes進(jìn)行封裝,支持租戶共享基礎(chǔ)設(shè)施資源等能力。
租戶可以是一個(gè)跨平臺(tái)的概念。在容器云平臺(tái)建設(shè)中,有容器云平臺(tái)的租戶設(shè)計(jì)是基于kubernetes的namespaces來(lái)劃分的,一個(gè)租戶使用一個(gè)namespaces,這會(huì)帶來(lái)很大的局限性。雖然租戶的定義沒(méi)有明確標(biāo)準(zhǔn),但從理論上說(shuō)租戶是高于kubernetes的,所以在kubernetes內(nèi)部沒(méi)有租戶的概念,而是用namespaces來(lái)實(shí)現(xiàn)資源隔離。在容器云平臺(tái)實(shí)踐中,需要考慮租戶的設(shè)計(jì),可能是跨越多個(gè)kubernetes集群的,甚至跨越多個(gè)IaaS平臺(tái)用kubernetes實(shí)現(xiàn)容器調(diào)度,也就是可以把容器調(diào)度到不同的云平臺(tái)上運(yùn)行,比如同時(shí)可以把容器調(diào)度到騰訊云、華為云、AWS云等云平臺(tái)上(通過(guò)云管來(lái)實(shí)現(xiàn)資源的統(tǒng)一管控,支撐容器云平臺(tái)的資源調(diào)度),從而實(shí)現(xiàn)高等級(jí)備份和容災(zāi)等。這就需要考慮基于Kubernetes多集群之上的容器云平臺(tái)能力的抽象和設(shè)計(jì)。
容器適用于輕量、彈性、無(wú)狀態(tài)等業(yè)務(wù)場(chǎng)景,這也決定了在傳統(tǒng)行業(yè)其應(yīng)用場(chǎng)景并不廣闊。傳統(tǒng)行業(yè)業(yè)務(wù)追求穩(wěn)定性,并不需要頻繁的變更和重啟。重啟可能會(huì)帶來(lái)數(shù)據(jù)的丟失,也可能造成業(yè)務(wù)流量處理的波動(dòng)。另外需要認(rèn)識(shí)到,生產(chǎn)環(huán)境和測(cè)試環(huán)境的要求是不一樣的。測(cè)試環(huán)境可以敏捷的迭代測(cè)試、快速的環(huán)境準(zhǔn)備、頻繁的部署刪除,但生產(chǎn)環(huán)境往往要求持續(xù)穩(wěn)定的運(yùn)行。所以容器更多的適合測(cè)試環(huán)境,以更快的構(gòu)建測(cè)試環(huán)境,確?;貧w測(cè)試環(huán)境一致性,更快更頻繁的構(gòu)建、發(fā)布、部署、測(cè)試、反饋,從而提升效率,減少出錯(cuò)頻率。這也是我們公司各個(gè)團(tuán)隊(duì)都樂(lè)意轉(zhuǎn)到容器云平臺(tái)的一個(gè)原因。生產(chǎn)環(huán)境則要求穩(wěn)定,應(yīng)用服務(wù)部署之后,不需要頻繁的啟停,也很少頻繁的彈性伸縮,往往需要提前規(guī)劃好系統(tǒng)容量需求,確保平穩(wěn)和穩(wěn)定。
一種技術(shù)解決不了所有問(wèn)題。容器不是萬(wàn)能,它有適合的場(chǎng)景。我們不能削足適履,而是要理解容器的特點(diǎn),選擇合適的業(yè)務(wù)場(chǎng)景。企業(yè)內(nèi)需要不同技術(shù)的組合來(lái)滿足企業(yè)業(yè)務(wù)需求,而容器適合支撐輕量、彈性、無(wú)狀態(tài)業(yè)務(wù)應(yīng)用。所以測(cè)試環(huán)境我盡可以把kafka、Mysql、ES等快速部署起來(lái)用于測(cè)試,但這些組件在生產(chǎn)環(huán)境就需要物理化部署,而不是容器化部署。測(cè)試和生產(chǎn)在性能、穩(wěn)定性、效率等方面的要求是不一樣的,所以不同的場(chǎng)景需要考慮不同的方式。
也有很多人鼓吹容器節(jié)省資源,這只是相對(duì)的。每個(gè)容器都是一個(gè)完整的業(yè)務(wù)應(yīng)用及依賴包組合,依賴的文件越多,部署容器越多,重復(fù)的資源占用就越多。浪費(fèi)就越多,反而比如一臺(tái)服務(wù)器上直接起若干服務(wù)。而且大量的容器如果調(diào)度不合理往往會(huì)導(dǎo)致資源爭(zhēng)搶的出現(xiàn),應(yīng)用性能不時(shí)受到影響。什么時(shí)候容器云會(huì)節(jié)省資源?在達(dá)到一定量后,中大規(guī)模應(yīng)用之后,可以實(shí)現(xiàn)資源的分時(shí)段使用,比如白天做業(yè)務(wù)處理,晚上做數(shù)據(jù)分析、計(jì)算、整合、統(tǒng)計(jì)等,相當(dāng)于使資源分片,但這取決于業(yè)務(wù)的運(yùn)行資源和時(shí)段要求以及容器量,只有達(dá)到一定量之后才能更好的規(guī)劃和分時(shí)利用資源,從而達(dá)到“節(jié)省資源”的目的。但這些對(duì)容器云平臺(tái)的容器調(diào)度能力提出了非常高的要求。
三、容器化PaaS
容器云可以看作是容器化PaaS的一個(gè)雛形,但并不能真正稱為PaaS。PaaS平臺(tái)類似于操作系統(tǒng)(云操作系統(tǒng)),提供應(yīng)用開(kāi)發(fā)、托管、運(yùn)維等能力。特別對(duì)傳統(tǒng)行業(yè)人員來(lái)說(shuō),需要具備友好的UI,使用戶能夠不需要額外學(xué)習(xí)就可以方便的使用PaaS平臺(tái)來(lái)完成應(yīng)用開(kāi)發(fā)、托管和運(yùn)維需求。
容器云或容器化PaaS平臺(tái)屬于基礎(chǔ)平臺(tái),理論上應(yīng)該由運(yùn)維團(tuán)隊(duì)來(lái)搭建。但采用容器云之后,PaaS運(yùn)維團(tuán)隊(duì)是有別于傳統(tǒng)的運(yùn)維團(tuán)隊(duì),而應(yīng)該是一種開(kāi)發(fā)型運(yùn)維團(tuán)隊(duì),重點(diǎn)是運(yùn)維平臺(tái)建設(shè)、運(yùn)維工具開(kāi)發(fā)以及穩(wěn)態(tài)業(yè)務(wù)應(yīng)用運(yùn)維。而運(yùn)維可以分2-3個(gè)層次:基礎(chǔ)設(shè)施資源運(yùn)維、平臺(tái)和工具運(yùn)維、業(yè)務(wù)應(yīng)用運(yùn)維。開(kāi)發(fā)團(tuán)隊(duì)則專注于業(yè)務(wù)應(yīng)用的開(kāi)發(fā)和迭代,業(yè)務(wù)團(tuán)隊(duì)則專注于業(yè)務(wù)的運(yùn)營(yíng)和創(chuàng)新。PaaS平臺(tái)則起到一個(gè)承上啟下的作用,向下使用基礎(chǔ)設(shè)施資源,向上則支撐業(yè)務(wù)應(yīng)用的開(kāi)發(fā)、運(yùn)維和運(yùn)營(yíng)等。這有點(diǎn)類似于Google SRE,這也是企業(yè)數(shù)字化轉(zhuǎn)型IT組織轉(zhuǎn)型的重要方面。
容器化PaaS平臺(tái)可以更好的利用容器的特點(diǎn)支撐微服務(wù)化業(yè)務(wù)應(yīng)用。所以我們?cè)诮ㄔO(shè)容器云平臺(tái)時(shí)就提出了“以應(yīng)用管理為核心”,支撐微服務(wù)化業(yè)務(wù)應(yīng)用,這就需要在容器云平臺(tái)具備服務(wù)治理能力。服務(wù)治理不是指SpringCloud,也不是dubbo,微服務(wù)開(kāi)發(fā)框架和微服務(wù)治理是兩個(gè)概念。在容器云平臺(tái)或容器化PaaS平臺(tái),可以不用SpringCloud,不用dubbo,同樣可以開(kāi)發(fā)微服務(wù),反而會(huì)簡(jiǎn)化微服務(wù)的管理和治理。比如說(shuō)服務(wù)注冊(cè),使用SpringCloud可以要使用Eureka,就需要額外的Eureka組件,而容器云平臺(tái)自身是提供服務(wù)注冊(cè)發(fā)現(xiàn)機(jī)制的,所以沒(méi)必要非要選擇SpringCloud等工具。但是這就對(duì)容器云平臺(tái)或容器化PaaS提出了比較高的要求,要能實(shí)現(xiàn)不同類型微服務(wù)的管理和治理。
理解了這一點(diǎn),在設(shè)計(jì)實(shí)現(xiàn)容器化PaaS平臺(tái)的時(shí)候,就不會(huì)只考慮SpringCloud或Dubbo,就可以設(shè)計(jì)出更通用的PaaS平臺(tái)。
我們把容器化PaaS定義為輕量化PaaS。所謂輕量化PaaS,就是讓它來(lái)支撐微服務(wù)架構(gòu)業(yè)務(wù)應(yīng)用,而不去部署如生產(chǎn)數(shù)據(jù)庫(kù)、Kafka、ES等重型數(shù)據(jù)庫(kù)或中間件系統(tǒng),因?yàn)樗鼰o(wú)論在穩(wěn)定性、可靠性、性能等方面都不如非容器化部署,運(yùn)維復(fù)雜度高。因此,使用容器云或容器化PaaS來(lái)支撐微服務(wù)架構(gòu)業(yè)務(wù)應(yīng)用,實(shí)現(xiàn)敏捷的業(yè)務(wù)應(yīng)用服務(wù)開(kāi)發(fā)和迭代,快速構(gòu)建一致性的開(kāi)發(fā)、測(cè)試環(huán)境,支持彈性伸縮應(yīng)對(duì)突發(fā)流量,擴(kuò)展服務(wù)治理增強(qiáng)安全管控,提供統(tǒng)一的日志、監(jiān)控、審計(jì)等企業(yè)級(jí)能力中心等,從而就可以基于容器化PaaS構(gòu)建企業(yè)的可復(fù)用中臺(tái)服務(wù),從而滿足企業(yè)業(yè)務(wù)應(yīng)用的敏捷變化需求和業(yè)務(wù)模式轉(zhuǎn)型,促進(jìn)企業(yè)數(shù)字化轉(zhuǎn)型。
也不少人在提敏態(tài)和穩(wěn)態(tài)雙態(tài)運(yùn)維,我們覺(jué)得核心不是新的運(yùn)維模式和傳統(tǒng)運(yùn)維模式并行,而是不同的業(yè)務(wù)場(chǎng)景需求。任何時(shí)候都存在敏態(tài)和穩(wěn)態(tài)的需求,如果把數(shù)據(jù)庫(kù)都容器化部署,這不是敏態(tài),而是自找麻煩。我們前面提到,PoC和測(cè)試環(huán)境可以這么干,但生產(chǎn)環(huán)境就是不一樣的場(chǎng)景需求。無(wú)論互聯(lián)網(wǎng)類業(yè)務(wù)或者傳統(tǒng)業(yè)務(wù),生產(chǎn)環(huán)境的穩(wěn)定性都是首要要求。
容器、容器云、容器化PaaS對(duì)使用者有不同的要求。容器云產(chǎn)品化需要向容器化PaaS平臺(tái)轉(zhuǎn)型,并需要考慮不同業(yè)務(wù)場(chǎng)景的需求,以更好的實(shí)現(xiàn)應(yīng)用開(kāi)發(fā)、托管和運(yùn)維能力需求。這也是實(shí)現(xiàn)PaaS平臺(tái)的一個(gè)相對(duì)便捷的途徑。