云原生這個(gè)概念已經(jīng)被Gartner評(píng)為2022最受關(guān)注的技術(shù)術(shù)語(yǔ),因此現(xiàn)在的問(wèn)題已經(jīng)不是你要不要學(xué)云原生的問(wèn)題,而是When的問(wèn)題。云原生本質(zhì)上是我們構(gòu)建分布式應(yīng)用程序的一種設(shè)計(jì)和架構(gòu)思路(筆者認(rèn)為架構(gòu)本身就是一種設(shè)計(jì),而架構(gòu)的核心就是為了解決復(fù)雜度,簡(jiǎn)單容易理解的東西根本不需要架構(gòu)設(shè)計(jì)),并且云原生更多描述的是結(jié)果,也就是你構(gòu)建的應(yīng)用程序應(yīng)該具備什么樣的”特征“,才能算得上云原生應(yīng)用程序。
當(dāng)然理解了這些云原生的特征(比如應(yīng)用的無(wú)狀態(tài),可觀測(cè)性,配置和業(yè)務(wù)邏輯代碼分離,基礎(chǔ)設(shè)施代碼化等),我們還是無(wú)從下手,因此業(yè)界的各位先驅(qū)們把自己一線的實(shí)踐總結(jié)成了云原生的多種模式,來(lái)解決助架構(gòu)師或者系統(tǒng)設(shè)計(jì)人員在構(gòu)建系統(tǒng)時(shí)How的問(wèn)題。具體來(lái)說(shuō),業(yè)務(wù)目前一共有6種核心的模式,每種模式具體解決了整個(gè)分布式應(yīng)用的不同關(guān)注點(diǎn),他們是:(多個(gè)服務(wù)之間的信息交換模式)communication, 服務(wù)的治理和組合模式(connectivity and composition),數(shù)據(jù)管理模式(data management), 事件驅(qū)動(dòng)架構(gòu)模式(event-driven architecture),流處理模式(stream processing),以及API統(tǒng)一管理模式(API management and consumption)。
這些模式的落地實(shí)施基本都和微服務(wù)相關(guān),雖然說(shuō)我們微服務(wù)架構(gòu)本質(zhì)上就是模塊化應(yīng)用的設(shè)計(jì),傳統(tǒng)的SOA架構(gòu)其實(shí)也算是模塊化設(shè)計(jì),但是微服務(wù)架構(gòu)對(duì)涉及到服務(wù)組合和聚合部分拆分的更加徹底,去掉了SOA架構(gòu)依賴的ESB這一層,因此靈活性和可擴(kuò)展性就變得更高。但是這也造成了很多理解上的混亂,很多人都聽(tīng)說(shuō)過(guò)原子服務(wù)和組合服務(wù),聚合服務(wù)的概念,甚至還有領(lǐng)域服務(wù)這樣的概念,這么概念讓很多剛剛?cè)胄械募軜?gòu)師束手無(wú)策,因?yàn)檫@個(gè)服務(wù)劃分和粒度是沒(méi)有標(biāo)準(zhǔn)的,那句拆分出粒度合適的服務(wù)基本等于沒(méi)說(shuō)。不過(guò)筆者在這篇文章中不想展開(kāi)討論微服務(wù)的拆分,而是希望大家能夠從業(yè)務(wù)的維度,服務(wù)的并發(fā)量未付,服務(wù)的變化頻率等維度來(lái)考慮。一個(gè)基本的原則是從大到小要由于一開(kāi)始分的太細(xì)而進(jìn)行服務(wù)合并。
微服務(wù)架構(gòu)下應(yīng)用的部署有很多種模式,不過(guò)如果讀者完全不知道微服務(wù)應(yīng)該如何部署,那只需要了解容器化部署方式就行了,這應(yīng)該是未來(lái)幾年整個(gè)企業(yè)級(jí)應(yīng)用部署市場(chǎng)的事實(shí)標(biāo)準(zhǔn)。容器化部署當(dāng)然售前要理解什么是容器了,這也是筆者寫(xiě)這篇文章的目的,饒了一大圈終于說(shuō)到重點(diǎn)了。容器這個(gè)概念絕對(duì)是未來(lái)幾年行業(yè)的熱門(mén)術(shù)語(yǔ),它和云原生是企業(yè)級(jí)應(yīng)用程序的兩個(gè)面,容器這面代表是應(yīng)用程序物理特征,而云原生代表的是應(yīng)用特征。
應(yīng)用程序是當(dāng)前大部分企業(yè)主營(yíng)業(yè)務(wù)的血管,數(shù)據(jù)就如同血液一樣在應(yīng)用程序中流淌,從一個(gè)部門(mén)流到另外一個(gè)部門(mén),從而為企業(yè)產(chǎn)生價(jià)值。如果應(yīng)用程序宕機(jī),企業(yè)的業(yè)務(wù)會(huì)受損,甚至有的時(shí)候會(huì)造成生命安全損失,因此隨著數(shù)字化的深入,應(yīng)用程序的穩(wěn)定性和可靠性會(huì)變得越來(lái)越重要。
過(guò)去我們通常將應(yīng)用程序直接運(yùn)行在物理機(jī)器上,并且大部分情況下一臺(tái)機(jī)器只會(huì)運(yùn)行一個(gè)應(yīng)用程序,而造成這種看似資源浪費(fèi)的部署方式主要由同一臺(tái)機(jī)器的操作系統(tǒng)提供的隔離程度并不完整,我們沒(méi)法在同一個(gè)操作系統(tǒng)上安全的運(yùn)行多個(gè)應(yīng)用程序(如果你聽(tīng)過(guò)dll hell,那么就非常清楚我再說(shuō)什么!)。
由于這種局限性的存在,每次我們要開(kāi)發(fā)一個(gè)新的業(yè)務(wù)系統(tǒng)的時(shí)候,總是伴隨著購(gòu)買新的服務(wù)器,而最大的問(wèn)題是我們并不知道要買多大規(guī)格的服務(wù)器來(lái)支撐新的業(yè)務(wù)(我們不希望,也不想由于服務(wù)能力不足導(dǎo)致用戶的請(qǐng)求沒(méi)有辦法被滿足,特別是電商類的應(yīng)用),而這種不確定性和壓力導(dǎo)致IT部門(mén)總是按最大的預(yù)估量以及增加額外的冗余來(lái)購(gòu)買硬件資源,結(jié)果是大量的硬件資源被限制,拒某機(jī)構(gòu)統(tǒng)計(jì),這種模式下平均只有5-10%的硬件資源被真正使用到。特別是當(dāng)前大環(huán)境下大家都在談碳中和,如何降低IT資源浪費(fèi)顯得尤為重要。
不過(guò)在容器化出現(xiàn)之前,VMWare就給行業(yè)獻(xiàn)上了大禮:(今天的新聞是VMWare從Dell拆分出來(lái)了,這是好事情,看好VMware在企業(yè)級(jí)部署市場(chǎng)繼續(xù)amazing)虛擬機(jī)(也叫Virtual Machine)。虛擬機(jī)推出之后,一夜間讓全世界的企業(yè)都趨之若鶩,我們終于有一種成熟的技術(shù)來(lái)在一臺(tái)機(jī)器上安全的運(yùn)行多個(gè)應(yīng)用程序。
坦白講,虛擬機(jī)技術(shù)是真的Game Changer(游戲規(guī)則改變者),IT部門(mén)終于不需要每次為新的應(yīng)用程序購(gòu)置服務(wù)器,因?yàn)樘摂M機(jī)的存在,我們可以從現(xiàn)有機(jī)器中選擇有資源空間的機(jī)器來(lái)創(chuàng)建對(duì)應(yīng)的虛擬機(jī)來(lái)運(yùn)行新的應(yīng)用程序。這種通過(guò)VM部署應(yīng)用程序的方式讓企業(yè)的資源使用率得到的提升,反過(guò)來(lái)看就是省錢(qián),何樂(lè)而不為呢!
看美劇多的同學(xué)應(yīng)該都聽(tīng)過(guò)一句話,任何事情都有but。對(duì)于虛擬機(jī)這種部署模式來(lái)說(shuō),雖然說(shuō)很優(yōu)秀,但是(but)還遠(yuǎn)不能稱之為完美。關(guān)注虛擬化技術(shù)的同學(xué)應(yīng)該知道虛擬機(jī)本質(zhì)上就是在宿主機(jī)上運(yùn)行一個(gè)完整的guest操作系統(tǒng),而這也是虛擬機(jī)這種部署方式最大的缺點(diǎn)(筆者試圖客觀的來(lái)看這個(gè)問(wèn)題,因?yàn)榧夹g(shù)發(fā)展了,我們才有機(jī)會(huì)說(shuō)這是虛擬機(jī)部署的缺點(diǎn))。
由于Guest操作系統(tǒng)需要消耗CPU,內(nèi)存等資源,因此在一臺(tái)物理機(jī)上運(yùn)行多臺(tái)虛擬機(jī)的結(jié)果是,留給應(yīng)用程序本身的資源就不多了。另外操作系統(tǒng)需要授權(quán)費(fèi)用,并且操作系統(tǒng)都需要維護(hù),因此運(yùn)行大量的虛擬機(jī)推高了系統(tǒng)運(yùn)維的成本,這包括時(shí)間上和金錢(qián)上兩個(gè)維度。虛擬機(jī)這種部署方式除了資源消耗的問(wèn)題外,還包括啟動(dòng)慢,遷移困難等問(wèn)題,比如我們?cè)诙鄠€(gè)平臺(tái)之間或者云下和云上之間遷移應(yīng)用程序會(huì)非常繁瑣,你可以考慮一下拷貝幾個(gè)G的VM虛擬機(jī)是個(gè)什么感覺(jué),更為糟糕的是,會(huì)有多個(gè)G級(jí)別的虛擬機(jī)文件需要拷貝。
虛擬機(jī)部署的問(wèn)題不光讓中小企業(yè)的倍感煎熬,同時(shí)也讓像谷歌這樣的大廠奮發(fā)圖強(qiáng),積極的探索新的技術(shù)來(lái)解決虛擬機(jī)的短板。而容器技術(shù)在Docker出現(xiàn)之前,就已經(jīng)在谷歌內(nèi)部實(shí)踐十多年了。容器經(jīng)常被用來(lái)類比為輕量級(jí)的虛擬機(jī),雖然我們都知道(看過(guò)筆者容器本質(zhì)系列文章的同學(xué))這種類比非常不準(zhǔn)確,因?yàn)槿萜骷夹g(shù)是不需要獨(dú)享的操作系統(tǒng)內(nèi)核,并且實(shí)時(shí)上,運(yùn)行在同一臺(tái)物理機(jī)上多個(gè)容器和操作系統(tǒng)共享操作系統(tǒng)內(nèi)核。而這種機(jī)制的好處顯而易見(jiàn),釋放了大量的CPU,內(nèi)存等資源給應(yīng)用程序使用。同時(shí)由于不需要額外的操作系統(tǒng),因此授權(quán)費(fèi)用和運(yùn)維的費(fèi)用也得到的縮減,整體上來(lái)看,企業(yè)省錢(qián)了。
除了節(jié)省資源省錢(qián)之外,容器技術(shù)由于不需要獨(dú)享的操作系統(tǒng),我們?cè)趯?duì)應(yīng)用進(jìn)行擴(kuò)容的時(shí)候,啟動(dòng)時(shí)間就基本和在操作系統(tǒng)上啟動(dòng)進(jìn)程相同,速度非???;容器的跨平臺(tái)特性要優(yōu)秀很多,無(wú)論是自己的筆記本,還是云平臺(tái),都可以無(wú)縫的銜接,開(kāi)發(fā)人員終于不用為“在我電腦上運(yùn)行的好好的”這樣的問(wèn)題絞盡腦汁了。
容器技術(shù)當(dāng)然不是突然出現(xiàn),任何新事物都會(huì)經(jīng)歷演進(jìn)的過(guò)程,而容器技術(shù)不例外,是很多杰出的企業(yè)和計(jì)算機(jī)專家長(zhǎng)期共同努力的結(jié)果。這里舉個(gè)小小的例子,谷歌為L(zhǎng)inux操作系統(tǒng)內(nèi)核貢獻(xiàn)了很多容器相關(guān)的技術(shù),也是容器三個(gè)支柱:Namespace,Cgroup和Chroot發(fā)展的重要來(lái)源,可以毫無(wú)夸張的說(shuō),如果沒(méi)有谷歌等公司和個(gè)人的杰出工作和無(wú)私的奉獻(xiàn),就沒(méi)有我們今天的容器化平臺(tái)Docker,容器編排平臺(tái)Kubernetes等。
除了剛才提到的容器技術(shù)三個(gè)支柱之外,促成容器化部署大發(fā)展還包括了聯(lián)合文件系統(tǒng)(union filesystems),Docker技術(shù)等。雖然Docker公司最近幾年從事業(yè)的巔峰下滑的有點(diǎn)快,但是我們不能否認(rèn)這只小鯨魚(yú)為企業(yè)級(jí)部署市場(chǎng)做出的貢獻(xiàn)。原因很簡(jiǎn)單,雖然說(shuō)容器技術(shù)的支柱在Linux操作系統(tǒng)中已經(jīng)存在很多年了,正是由于Docker公司的遠(yuǎn)見(jiàn)和聰明才智,讓容器技術(shù)走進(jìn)了尋常企業(yè)“家”,可以毫不夸張的說(shuō),如果沒(méi)有Docker公司,我們離全民容器化部署要晚上好多年。
注:在Docker出現(xiàn)之前,虛擬化技術(shù)已經(jīng)有了長(zhǎng)足的發(fā)展,有些甚至可以追溯到IBM的System/360操作系統(tǒng)。BSD jails以及Solaris Zone都是在Unix操作系統(tǒng)上赫赫有名的容器化技術(shù),不過(guò)筆者不打算討論這些古老的技術(shù),原因很簡(jiǎn)單,我們應(yīng)該不會(huì)再使用這些技術(shù)了。
Docker對(duì)容器技術(shù)的貢獻(xiàn)很那用幾句話說(shuō)清楚,不過(guò)大家只要記住關(guān)鍵一句就行:Docker讓容器技術(shù)使用邊的簡(jiǎn)單,筆者更喜歡用自己編的這句話:Docker,釋放你服務(wù)器的潛力(Docker,free your server‘s possibility)。咱們會(huì)在后邊的文章中詳細(xì)介紹Docker的運(yùn)行機(jī)制,今天先來(lái)解答一下最近經(jīng)常在項(xiàng)目上遇到的關(guān)于容器化的問(wèn)題。
筆者最近在幫出版行業(yè)的客戶構(gòu)建數(shù)字化平臺(tái),然而不幸的是,我發(fā)現(xiàn)這個(gè)行業(yè)完全沒(méi)有被互聯(lián)網(wǎng)大潮所裹挾,技術(shù)還處于10-20年前的技術(shù)和架構(gòu)。舉個(gè)例子,圖書(shū)行業(yè)進(jìn)銷存基本上需要ERP系統(tǒng)的而支持,而市場(chǎng)上做這個(gè)細(xì)分領(lǐng)域的供應(yīng)商要么還用的是Delphi+數(shù)據(jù)庫(kù)的CS模式,要么就是在Windows機(jī)器上做的windows服務(wù)+客戶端可執(zhí)行文件exe的架構(gòu)。當(dāng)筆者在評(píng)估這些系統(tǒng)如何和云原生,阿里云結(jié)合在一起的時(shí)候,很多人也在問(wèn)我,Windows操作系統(tǒng)是否可以虛擬化,或者說(shuō)容器化部署?
云原生基金會(huì)CNCF是促進(jìn)Kubernetes,容器化部署的社區(qū)組織,了解這個(gè)組織結(jié)構(gòu)的同學(xué)應(yīng)該知道張磊的大名,阿里云的張磊是唯一一位來(lái)自中國(guó)的現(xiàn)任TOC技術(shù)委員會(huì)委員,他是阿里巴巴負(fù)責(zé)云原生和容器化的領(lǐng)軍人物。在加入阿里之前,張磊在微軟做過(guò)多年容器化的工作,因此也可以看出微軟其實(shí)一直在努力的將Docker引入Windows平臺(tái)。在筆者寫(xiě)這些文字的時(shí)間點(diǎn)上,Windows容器在多個(gè)版本的Windows操作系統(tǒng)上已經(jīng)被支持,這也是微軟和社區(qū)以及Docker公司多年努力工作的成果。
Windows容器(Windows Containers)這個(gè)概念可以看成是一種特殊的用來(lái)支持容器化的Windows內(nèi)核技術(shù),我們可以用Docker來(lái)運(yùn)行Windows容器,就類似于在Docker上運(yùn)行Linux容器一樣。Windows容器的發(fā)展終于拉齊了兩大服務(wù)器端操作系統(tǒng)陣營(yíng)在Docker平臺(tái)上的界面,開(kāi)發(fā)人員終于可以使用類似的工具來(lái)同時(shí)運(yùn)維Linux和Windows容器。
從原理上來(lái)講,Windows容器運(yùn)行起來(lái)之后,需要和宿主機(jī)共享操作系統(tǒng)內(nèi)核,因此容器化的Windows應(yīng)用是沒(méi)有辦法運(yùn)行在Linux操作上的,反之亦然(Linux容器無(wú)法運(yùn)行在Windows宿主機(jī)上)。為了運(yùn)行容器化的Windows應(yīng)用程序,我們就必須準(zhǔn)備安裝了支持容器化版本操作系統(tǒng)的機(jī)器,但是由于虛擬化技術(shù)的飛速發(fā)展,在Windows機(jī)器上運(yùn)行Linux容器實(shí)例也不是不可能。
運(yùn)行在Windows操作系統(tǒng)上的Docker Desktop有兩種模式:Windows容器和Linux容器。在特定版本下,我們可以在Windows操作系統(tǒng)上通過(guò)輕量級(jí)的Hyper-v虛擬機(jī),或者Windows Subsystem for Linux(WSL)來(lái)運(yùn)行Linux容器實(shí)例。特別是WSL,這是Windows上非常新的內(nèi)核技術(shù),也是微軟的戰(zhàn)略性技術(shù)選項(xiàng),相比Hyper-v技術(shù),WSL的性能和兼容性要好很多,感興趣的讀者可以關(guān)注一下。那么我們是不是就可以在生產(chǎn)環(huán)境中使用Windows容器呢?筆者的建議是如無(wú)必要,請(qǐng)勿這么干。
對(duì)于Mac用戶來(lái)說(shuō),特別是在Mac操作系統(tǒng)上安裝了Docker Desktop的用戶,我們?cè)跈C(jī)器上運(yùn)行Linux容器本質(zhì)上是安裝的時(shí)候在Mac上創(chuàng)建了一臺(tái)VM虛擬機(jī),這讓大量的Mac用戶可以很容易在本地開(kāi)發(fā)和測(cè)試容器化應(yīng)用程序。
說(shuō)到Docker和容器就不能不提Kubernetes,由于容器技術(shù)的飛速發(fā)展,以及很多企業(yè)對(duì)容器化應(yīng)用PASS平臺(tái)的渴求,谷歌聯(lián)合一幫科技行業(yè)的小伙伴推出了Kubernetes,這個(gè)平臺(tái)已經(jīng)演變成企業(yè)級(jí)容器編排平臺(tái)的事實(shí)標(biāo)準(zhǔn)。有一句不太技術(shù)的話來(lái)總結(jié)Kubernetes就是:Kuberntes平臺(tái)是一個(gè)簡(jiǎn)單易用(相對(duì)的)的部署和管理容器化應(yīng)用程序的應(yīng)用程序。
最后我們通過(guò)解釋什么是容器化應(yīng)用收尾。容器化應(yīng)用的字面意思就是運(yùn)行在容器中的應(yīng)用程序,在Kubernetes平臺(tái)上部署應(yīng)用程序,我們需要使用像Docker這樣的容器化運(yùn)行時(shí)來(lái)實(shí)現(xiàn):拉取鏡像,啟動(dòng)容器,停止容器等工作。由于Kubernetes社區(qū)的杰出工作,關(guān)于容器運(yùn)行時(shí)這部分已經(jīng)被徹底標(biāo)準(zhǔn)化了,具體的什么意思呢?Kuberntes定義了CRI(容器運(yùn)行時(shí)接口),所有實(shí)現(xiàn)了這個(gè)接口的容器運(yùn)行時(shí)都可以被Kubernetes調(diào)度。
CRI標(biāo)準(zhǔn)化可以說(shuō)對(duì)Docker非常不利,因?yàn)閺淖钚掳姹綤ubernetes中,Docker已經(jīng)不會(huì)默認(rèn)的容器運(yùn)行時(shí),最新Kubernetes已經(jīng)使用containerd為默認(rèn)的容器運(yùn)行時(shí),筆者會(huì)在后續(xù)的文章中詳細(xì)介紹containerd,讀者現(xiàn)在可以簡(jiǎn)單的把containerd理解為負(fù)責(zé)啟動(dòng)和停止容器實(shí)例的組件。Kubernetes相對(duì)來(lái)說(shuō)很復(fù)雜,不過(guò)K8S要解決的問(wèn)題其實(shí)很簡(jiǎn)單,在容器之上來(lái)解決容器的編排,調(diào)度,運(yùn)維和管理的問(wèn)題。當(dāng)然Kubernetes本身的復(fù)雜度已經(jīng)超過(guò)了很多非科技類型企業(yè)的運(yùn)維能力,因此大部分企業(yè)都如果希望落地K8S,還是需要使用阿里巴巴的EDAS+ACK的組合,特別是EDAS在K8S之上構(gòu)建了一套易用的,白屏操作的管理系統(tǒng),讓企業(yè)落地K8S如絲般順滑。
好了,今天這篇科普性質(zhì)的文章就這么多了,下篇文章咱們來(lái)詳細(xì)介紹推動(dòng)容器化技術(shù)普及的技術(shù):Docker,敬請(qǐng)期待!