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