技術(shù)
導(dǎo)讀:云計(jì)算的出現(xiàn)和發(fā)展相當(dāng)于一次數(shù)字世界的“全球化”大發(fā)現(xiàn),而云原生就相當(dāng)于一次“集裝箱式”的創(chuàng)新變革。
在著名的《集裝箱改變世界》當(dāng)中,我們能看到集裝箱的發(fā)明對(duì)于二十世紀(jì)全球化的巨大推動(dòng)作用。集裝箱,這一看起來(lái)并無(wú)多少技術(shù)含量的發(fā)明,卻因?yàn)檫M(jìn)行標(biāo)準(zhǔn)化和系統(tǒng)化運(yùn)輸?shù)膭?chuàng)新徹底改變了全球的貨物貿(mào)易體系。
如今在IT領(lǐng)域,云計(jì)算的出現(xiàn)和發(fā)展相當(dāng)于一次數(shù)字世界的“全球化”大發(fā)現(xiàn),而云原生就相當(dāng)于一次“集裝箱式”的創(chuàng)新變革。
如果把互聯(lián)網(wǎng)看作是數(shù)字世界里的貿(mào)易航線,那么應(yīng)用軟件和其中的數(shù)據(jù)就是穿行在航線上的船只和貨物。在傳統(tǒng)的IT架構(gòu)當(dāng)中,最小的貨運(yùn)單位就是船只(單體應(yīng)用),不同的企業(yè)都有自家的船只,因此每個(gè)船只上都要配備全套的IT基礎(chǔ)設(shè)施(計(jì)算、存儲(chǔ)、網(wǎng)絡(luò)等),船只要根據(jù)業(yè)務(wù)軟件的規(guī)模提前規(guī)劃,如果遇到業(yè)務(wù)增長(zhǎng),就只能在船上增補(bǔ)硬件設(shè)備,但業(yè)務(wù)下降,這些設(shè)備也只能閑置吃灰。
而云計(jì)算的出現(xiàn),相當(dāng)于是成立了幾家大型貨運(yùn)公司,推出了一些超大型的標(biāo)準(zhǔn)化船只,其他企業(yè)可以選擇把一部分貨物交給這些貨運(yùn)公司去托運(yùn),甚至直接租用貨運(yùn)公司的船只去運(yùn)貨,這就涉及到云計(jì)算幾種不同的服務(wù)提供方式。
伴隨著云計(jì)算這種“集中式貨運(yùn)”的出現(xiàn),一種適應(yīng)云計(jì)算架構(gòu)特點(diǎn)的應(yīng)用開(kāi)發(fā)技術(shù)和運(yùn)維管理方式也出現(xiàn)了,那就是云原生。云原生的一個(gè)核心技術(shù)就是容器(Container),而容器的創(chuàng)新之處就非常類(lèi)似于集裝箱的創(chuàng)新。正如物理世界貨運(yùn)的最小單元從船只變成了集裝箱,在云計(jì)算中,軟件的最小單元不再是主機(jī)箱或者虛擬機(jī),而是一個(gè)個(gè)容器。
正是隨著云計(jì)算服務(wù)和容器化技術(shù)的發(fā)展下,越來(lái)越多的軟件開(kāi)發(fā)者和IT運(yùn)維管理人員開(kāi)始改變過(guò)去獨(dú)立開(kāi)發(fā)運(yùn)行的傳統(tǒng)模式,從而提出一套基于云計(jì)算特點(diǎn)的新的軟件應(yīng)用開(kāi)發(fā)架構(gòu)和模式,從而誕生了云原生的概念。
云有“原生”初長(zhǎng)成
提及云原生,就必然要提到云計(jì)算。眾所周知,按照云計(jì)算的服務(wù)提供方式,可以分為基礎(chǔ)設(shè)施即服務(wù)(IaaS)、平臺(tái)即服務(wù)(PaaS)、軟件即服務(wù)(SaaS)三層。從IaaS到PaaS,再到SaaS,意味著云平臺(tái)提供的工具和服務(wù)越來(lái)越多,購(gòu)買(mǎi)云服務(wù)的企業(yè)所要做的開(kāi)發(fā)相關(guān)的任務(wù)就越來(lái)越少,這一趨勢(shì)為云原生的出現(xiàn)提供了技術(shù)基礎(chǔ)和方向指引。
(來(lái)源:CNCF基金會(huì))
企業(yè)業(yè)務(wù)要想真正的云化,不僅要在基礎(chǔ)設(shè)施和平臺(tái)層面實(shí)現(xiàn),而且應(yīng)用本身也應(yīng)該基于云的特點(diǎn)進(jìn)行開(kāi)發(fā),從架構(gòu)設(shè)計(jì)、開(kāi)發(fā)方式、部署維護(hù)等各個(gè)階段和方面重新設(shè)計(jì),構(gòu)建真正應(yīng)“云”而生的“云原生應(yīng)用”。
根據(jù)行業(yè)內(nèi)的說(shuō)法,云原生(Cloud-Native)概念的提出有幾個(gè)版本,公認(rèn)的是由Pivotal公司CTOMattStine在2013年首次提出。當(dāng)然,這一概念被提出來(lái)是沒(méi)有定義的,只是一系列技術(shù)的集合。
比如在2010年,WSO2公司CTOPaulFremantle在博客里也提到“CloudNative”的概念,不過(guò)他給出的相關(guān)解釋包含了分布式、多租戶、按需收費(fèi)、彈性可伸縮這些特點(diǎn),但這些主要是云計(jì)算服務(wù)的普遍特性,還不夠細(xì)化。
對(duì)于云原生概念,MattStine在2015年發(fā)表的《遷移到云原生應(yīng)用架構(gòu)》的一書(shū)中列舉出以下技術(shù)和特點(diǎn):十二因素,微服務(wù),子服務(wù)敏捷基礎(chǔ)設(shè)施,基于API的協(xié)作,反脆弱性。
后面,這家公司的另外一位技術(shù)大牛KevinHoffman在《Beyondthe12factorApp》一書(shū),基于原十二要素新增了三個(gè)新要素,即云原生十五要素。
對(duì)于應(yīng)用開(kāi)發(fā)領(lǐng)域的從業(yè)者,這些要素想必都非常熟悉,相當(dāng)于是一份SaaS應(yīng)用的最佳實(shí)踐標(biāo)準(zhǔn),可以適用于任何語(yǔ)言開(kāi)發(fā)的后端應(yīng)用服務(wù),將開(kāi)發(fā)流程自動(dòng)化和標(biāo)準(zhǔn)化,降低開(kāi)發(fā)者的學(xué)習(xí)成本。
到2017年,MattStine再次將云原生架構(gòu)歸納為模塊化、可觀察、可部署、可測(cè)試、可替換、可處理6特質(zhì);而Pivotal官網(wǎng)則給出了云原生的最新定義,概括為4個(gè)要點(diǎn):容器、微服務(wù)、DevOps、持續(xù)交付。
另外一個(gè)比較正式的云原生定義是由云原生計(jì)算基金會(huì)(CNCF)提出的。在2015年,CNCF成立之初,這一組織將云原生定義為包括:容器化封裝、自動(dòng)化管理、面向微服務(wù);到2018年,CNCF又把服務(wù)網(wǎng)格(ServiceMesh)和聲明式API給加到云原生的定義中來(lái)。
從云原生的多個(gè)定義來(lái)看,這一概念在不斷完善和更新,不同組織和企業(yè)對(duì)于云原生的側(cè)重點(diǎn)也有所不同。根據(jù)行業(yè)專(zhuān)家的總結(jié),現(xiàn)在我們已經(jīng)能夠看到云原生的一個(gè)全貌特征:
(圖源:王銀利《云原生體系下的技海浮沉與理論探索》)
因此,整體來(lái)說(shuō),云原生是一套在云端構(gòu)建和運(yùn)行軟件應(yīng)用的方法,可以歸結(jié)為一套技術(shù)方法論?!霸圃钡摹癈loud”,代表了軟件應(yīng)用是放在云端而非傳統(tǒng)的IT設(shè)備中,而“Native”則代表軟件應(yīng)用從一開(kāi)始設(shè)計(jì),就是根據(jù)云的環(huán)境,采用云端的技術(shù),充分利用云平臺(tái)的彈性伸縮和分布式特點(diǎn),最終在云端高效、穩(wěn)定、安全運(yùn)行。
從本質(zhì)上來(lái)說(shuō),云原生是架構(gòu)根植于云,基于云上開(kāi)發(fā)、部署、維護(hù)的一套技術(shù)方法體系。
點(diǎn)開(kāi)云原生的“技能樹(shù)”
根據(jù)以上云原生概念的共性,我們主要拆解下容器化、微服務(wù)、持續(xù)交付,DevOps這些涉及云技術(shù)和運(yùn)維管理方法的主要特征。
首先來(lái)介紹代表性的容器技術(shù)。最初,一個(gè)軟件應(yīng)用都是放在物理主機(jī)上的,管理起來(lái)非常不方便,后面出現(xiàn)了虛擬化技術(shù),可以通過(guò)服務(wù)器資源共享的方式,按需構(gòu)建應(yīng)用實(shí)例,但是虛擬化構(gòu)建出的虛擬機(jī)仍然是一個(gè)完整操作系統(tǒng),雖然比物理機(jī)更靈活,但仍然資源浪費(fèi)的情況。那么,容器技術(shù),就如同IT開(kāi)發(fā)當(dāng)中的集裝箱,采用更小單元徹底將一個(gè)應(yīng)用的資源打包在不同的容器里,從而可以適應(yīng)各種應(yīng)用的運(yùn)行環(huán)境。
從2004年開(kāi)始,谷歌就在內(nèi)部大規(guī)模使用Cgroups等的OS虛擬化技術(shù),2008年,谷歌推出的LXC(LinuxContainer)項(xiàng)目具備了Linux容器的雛型。2013年,Docker橫空出世,讓Linux容器技術(shù)快速席卷開(kāi)發(fā)界。Docker的成功,也讓構(gòu)建應(yīng)用的最小單元變成了容器,而容器是微服務(wù)的最佳載體。
微服務(wù)就是一種跟單體應(yīng)用相對(duì)應(yīng)的新的應(yīng)用架構(gòu),是應(yīng)用服務(wù)單元的小型化和微型化。有個(gè)比喻非常貼切,單體應(yīng)用就是一個(gè)大茶壺里煮很多餃子,現(xiàn)在變成一個(gè)小茶壺里煮一個(gè)餃子,但是擁有很多個(gè)茶壺。微服務(wù)就是要將應(yīng)用的顆粒度做到最小,使之獨(dú)立承擔(dān)對(duì)外服務(wù)的職責(zé)。微服務(wù)的理念是隨著軟件系統(tǒng)的復(fù)雜度上升,需要投入的人力和時(shí)間資源越來(lái)越多,但卻需要及時(shí)交付而出現(xiàn)的。
DevOps,是Development+Operations的組合詞,也就是開(kāi)發(fā)和運(yùn)維的合體,當(dāng)然也包含測(cè)試。DevOps是一種敏捷開(kāi)發(fā)思維和IT組織的溝通方法,可以促進(jìn)開(kāi)發(fā)、技術(shù)運(yùn)營(yíng)和質(zhì)量保障部門(mén)之間的溝通、協(xié)作和整合,從而提高軟件和服務(wù)的交付效率。反映在云原生上面,就是提高持續(xù)交付的能力。
云原生的持續(xù)交付,要做到不誤時(shí)開(kāi)發(fā),不停機(jī)更新,小步快跑,要求開(kāi)發(fā)版本和穩(wěn)定版本并存,其實(shí)需要很多流程和工具支撐。對(duì)于廣大用戶來(lái)說(shuō),現(xiàn)在一個(gè)最直觀的感受就是很多巨型應(yīng)用可以做到幾乎在悄無(wú)聲息見(jiàn)就完成更新,根本不用再一次次進(jìn)行應(yīng)用的下載和安裝,而這就要?dú)w功于云原生的這些能力。
在軟件開(kāi)發(fā)領(lǐng)域,曾經(jīng)有一個(gè)“不可能三角”的說(shuō)法,也就是功能復(fù)雜程度、交付周期和可靠性這三者無(wú)法同時(shí)實(shí)現(xiàn),但基于以上云原生的技術(shù)和管理方法,相當(dāng)于解決了這一的一個(gè)開(kāi)發(fā)難題,從而幫助企業(yè)提升應(yīng)用開(kāi)發(fā)效率,實(shí)現(xiàn)業(yè)務(wù)創(chuàng)新。
云原生的能力將造成這樣一個(gè)結(jié)果,那就是讓一個(gè)應(yīng)用的底座變得越來(lái)越復(fù)雜,數(shù)據(jù)處理也越來(lái)越自動(dòng)化,而應(yīng)用的業(yè)務(wù)層面則越來(lái)越輕,越來(lái)越簡(jiǎn)單化。對(duì)于大眾用戶來(lái)說(shuō),就是應(yīng)用的更新、功能的使用越來(lái)越便捷和“聰明”。
云原生“江湖”
云原生是順應(yīng)云計(jì)算時(shí)代的應(yīng)用開(kāi)發(fā)特點(diǎn)而產(chǎn)生的一種技術(shù)理念,因此在云原生概念一直沒(méi)有明確的定義,而只有不同組織的不同的解釋。相伴而生的就是云原生技術(shù)的演化和廠商的紛爭(zhēng)。
現(xiàn)在一提到云原生,基本就會(huì)提及Docker和Kubernetes(簡(jiǎn)稱(chēng)K8s)。那么,這兩者到底是怎樣的關(guān)系呢?
簡(jiǎn)單來(lái)說(shuō),Docker是目前最成功的容器工具,K8s是目前最流行的容器編排工具。所謂“編排”,源自音樂(lè)指揮家對(duì)不同樂(lè)器演奏的協(xié)調(diào),那么用在云原生這里,就是對(duì)包含應(yīng)用程序的容器的協(xié)同關(guān)系管理。
最初,Google已經(jīng)在容器技術(shù)上有了十多年的積累,只不過(guò),Google的做法是秘而不宣,把基礎(chǔ)設(shè)施的復(fù)雜性都留在內(nèi)部,只給開(kāi)發(fā)者和用戶提供最簡(jiǎn)單的操作工具就行。但是2013年開(kāi)源容器工具Docker一經(jīng)推出就大受歡迎,很快就成為事實(shí)上的容器標(biāo)準(zhǔn),這嚴(yán)重刺激了Google。因此,Google采用了“敵人的敵人就是朋友”的戰(zhàn)略,開(kāi)始支持與Docker分道揚(yáng)鑣的CoreOS,推出了K8s項(xiàng)目,并支持CoreOS提出的另一個(gè)開(kāi)源容器引擎Rocket。
2014年,當(dāng)Google發(fā)現(xiàn)CoreOS在容器生態(tài)領(lǐng)域?qū)嵲诓皇荄ocker的對(duì)手之后,決定換道超車(chē),于當(dāng)年宣布推出K8s容器集群編排工具,并在2014年6月7日將初始版本代碼提交到Github上完全開(kāi)源。而此時(shí)的Docker公司也雄心勃勃,于年底在DockerCon上發(fā)布了自己研發(fā)的“Docker原生”容器集群管理項(xiàng)目DockerSwarm,并想與K8s一較高下。一場(chǎng)“容器編排”的戰(zhàn)爭(zhēng)打響。(Kubernetes來(lái)自于希臘語(yǔ),含義是舵手或領(lǐng)航員)
但Kubernetes憑借Google在容器集群管理系統(tǒng)Borg+Omega上的多年技術(shù)積累,很快橫掃DockerSwarm和其他容器編排工具。到2017年6月,據(jù)CNCF統(tǒng)計(jì):K8S占據(jù)著77%的市場(chǎng)份額,到10月,Docker宣布支持K8s,這標(biāo)志著容器編排的戰(zhàn)爭(zhēng)基本結(jié)束,最終以K8s的大獲全勝告終。
Docker被K8s成功收編,那最大的贏家就是2015年成立的云原生計(jì)算基金會(huì)(CNCF),當(dāng)然還有全球的開(kāi)發(fā)者。
CNCF是由Google牽頭成立,隸屬于Linux基金會(huì),初衷是圍繞云原生服務(wù)云計(jì)算,致力于培育和維護(hù)一個(gè)廠商中立的開(kāi)源生態(tài)系統(tǒng),維護(hù)和集成開(kāi)源技術(shù),支持編排容器化微服務(wù)架構(gòu)應(yīng)用,通過(guò)將最前沿的模式民主化,讓這些創(chuàng)新為大眾所用。
截至2020年4月,CNCF基金會(huì)共托管49個(gè)云原生項(xiàng)目,其中,Kubernetes是CNCF托管的第一個(gè)云原生開(kāi)源項(xiàng)目。現(xiàn)在全球主流的科技企業(yè)和云計(jì)算廠商絕大部分都是CNCF會(huì)員,云廠商們把加入CNCF作為企業(yè)技術(shù)競(jìng)爭(zhēng)力的宣傳點(diǎn)。
(CNCF全景圖)
可以說(shuō),云原生在今天的發(fā)展壯大,確實(shí)離不開(kāi)CNCF這樣的中立組織所發(fā)揮的作用。假如說(shuō)Docker一家獨(dú)大,就很容易提高容器技術(shù)的使用成本,如果K8s不在CNCF開(kāi)源共享,開(kāi)發(fā)者又可能要面臨“二選一”的麻煩。
值得注意的是,在2020年12月,K8s宣布棄用Docker,并非是簡(jiǎn)單地對(duì)Docker的“卸磨殺驢”,而是對(duì)于容器編排的進(jìn)一步優(yōu)化。因此,我們可以看到云原生的具體的技術(shù)工具還演變進(jìn)化當(dāng)中。
到這里,我們應(yīng)該對(duì)云原生的前世今生有一個(gè)基本的印象。
總的來(lái)說(shuō),云原生沒(méi)有一個(gè)固定的概念定義,但卻有一個(gè)清晰的邏輯,那就是軟件應(yīng)用正在按照云原生的方式進(jìn)行深度的云化,充分貼合云計(jì)算的彈性可擴(kuò)展、敏捷、分布式、自動(dòng)化的特點(diǎn),因云而生,又應(yīng)云而行。
同時(shí),云原生體系的技術(shù)也處在不斷的演化發(fā)展當(dāng)中,目前正形成以容器及容器編排、微服務(wù)、敏捷基礎(chǔ)設(shè)施、DevOps、聲明式API等為特點(diǎn)的云原生應(yīng)用的技術(shù)方法論。在這些云原生技術(shù)的演進(jìn)過(guò)程中,CNCF及其提供的開(kāi)源項(xiàng)目和開(kāi)發(fā)生態(tài)將發(fā)揮更加顯著的作用。
當(dāng)然,盡管我們看到云原生有這樣那樣的好處,但是云原生從誕生到如今的破圈而紅并非是一蹴而就的,云原生本身的演化也經(jīng)歷一個(gè)從青澀到成熟的過(guò)程。但云原生的計(jì)算價(jià)值已經(jīng)落地生根,某種程度上成為了企業(yè)IT的大勢(shì)所趨,甚至必然選擇。