“云原生”是云計(jì)算中很重要的一個(gè)概念,不過對“云原生”的認(rèn)識(shí)和解讀各有側(cè)重。我們覺得云原生圍繞的是“云原生應(yīng)用”這個(gè)核心,微服務(wù)、容器、DevOps等是實(shí)現(xiàn)云原生的工具和方法論,它們并不等價(jià)。澄清概念、厘清認(rèn)知,是推動(dòng)“云原生應(yīng)用”落地實(shí)踐的基礎(chǔ)。
初次聽到“云原生(Could Native)”的時(shí)候也是一頭霧水,對云原生的十二要素也是不理解。隨著項(xiàng)目的推進(jìn),對云計(jì)算理解的越來越多,也有了一些自己的體會(huì),再次看云原生的概念的時(shí)候,有了新的認(rèn)知。也總是看到很多人討論云原生,有人說云原生是構(gòu)建和運(yùn)行應(yīng)用程序的方法;有人說云原生是一套技術(shù)體系和方法論;有人說云原生應(yīng)用;有人說云原生架構(gòu);也有人說云原生就是是持續(xù)交付、微服務(wù)、容器、DevOps等等不一而足。不能說是錯(cuò)的,也不能說對,不同的人所說的根本不在一個(gè)頻道上。我們一向強(qiáng)調(diào)從整體上、全面的看待問題,不要有選擇的只看一點(diǎn)。我們覺得很多人都或多或少的忽略了云原生的核心實(shí)質(zhì):Native。
一、云原生(Cloud Native)
云原生概念到底是什么?
我們覺得對于新技術(shù)首先最重要的就是弄清楚它的概念和適用場景。先看Native在英語中的意思:天然的、天生的、本國的、土著的。Cloud Native就是天生的云,就是天生就具備云的基因,適合云環(huán)境。就像美國人的native language是English一樣,不是說美國人改變了國籍加入了其他國家的國籍,其native language就變了,native是一輩子都不會(huì)變的。
其核心是云原生應(yīng)用,范圍包括云原生應(yīng)用生命周期過程的理論、工具和方法。云原生十二因素是判斷是否是云原生的基本原則,也是實(shí)現(xiàn)云原生應(yīng)用的基本理論指導(dǎo)(雖然這些因素并不完全準(zhǔn)確)。至于持續(xù)交付、容器、微服務(wù)、DevOps是實(shí)現(xiàn)云原生應(yīng)用或服務(wù)的方法、工具框架和環(huán)境支持。不是采用所謂的微服務(wù)、容器技術(shù)、DevOps就是云原生了,那只不過是一種實(shí)現(xiàn)方式而已。沒有它們,換其他工具方法同樣可以實(shí)現(xiàn)云原生。即便有了它們,用了它們也不一定就是云原生。
二、云原生所應(yīng)具備的特性
首先要明白云原生要具備云的天然基因,天生就是云的一部分。云原生不是為云而生,而是天生就是云,生而是云,所以它具有云的特性:通過網(wǎng)絡(luò)訪問、遠(yuǎn)端部署執(zhí)行、可擴(kuò)展彈性伸縮、共享、按需使用自助服務(wù)、高可用、可遠(yuǎn)程監(jiān)控計(jì)費(fèi)審計(jì)、標(biāo)準(zhǔn)化交付與位置無關(guān)等。
云原生十二因素中,基準(zhǔn)代碼是為共享;依賴、配置、后端服務(wù)、管理進(jìn)程是自治自主服務(wù)范疇;構(gòu)建、發(fā)布、運(yùn)行以及端口綁定是標(biāo)準(zhǔn)化交付與位置無關(guān)范疇;端口綁定也是遠(yuǎn)程訪問范疇;進(jìn)程、并發(fā)是擴(kuò)展彈性要求;易處理是高可用要求;日志是監(jiān)控計(jì)費(fèi)審計(jì)需求,作為事件流則是云應(yīng)用與位置無關(guān)要求。
云原生十二因素雖然提出了云原生應(yīng)用的大部分特性,但并沒有明確云原生到底是什么?討論云原生的時(shí)候到底該討論什么?
三、討論云原生該關(guān)注什么?
我們在討論云原生的時(shí)候到底該關(guān)注什么?是架構(gòu)?體系?或是方法?
我們覺得討論云原生最重要的是討論云原生應(yīng)用。這是所有討論云原生的核心。云原生架構(gòu)是云原生應(yīng)用的架構(gòu),云原生方法論是實(shí)現(xiàn)云原生應(yīng)用的方法論,云原生程序就是云原生應(yīng)用,云原生體系就是構(gòu)建、發(fā)布、運(yùn)行云原生應(yīng)用的理論、方法、工具、環(huán)境、流程、文化等等。最終目的是為了業(yè)務(wù)應(yīng)用。云原生要素中第一條就是“一份基準(zhǔn)代碼,多份部署”,也已明確了是云原生應(yīng)用。
應(yīng)用可以是天生具備云基因,適合部署于云環(huán)境,或者通過改造之后適合云計(jì)算環(huán)境,但改造的應(yīng)用不是云原生應(yīng)用,因?yàn)樗皇翘烊坏脑茟?yīng)用。云原生應(yīng)用也不是為了遷云,傳統(tǒng)應(yīng)用改造為云應(yīng)用才是為了遷云。這是我們在討論云原生的時(shí)候需要厘清楚的概念,不能混為一談。概念不清就會(huì)越談越亂,越談越糊涂。
四、云原生應(yīng)用
云原生應(yīng)用,就是天生具備云計(jì)算基因,以云計(jì)算的思想構(gòu)建并適用于云計(jì)算環(huán)境的應(yīng)用。它應(yīng)該具備我們提到的特性:可以通過網(wǎng)絡(luò)訪問、遠(yuǎn)端部署執(zhí)行、可擴(kuò)展彈性伸縮、共享、按需使用自主服務(wù)、高可用、可遠(yuǎn)程監(jiān)控計(jì)費(fèi)審計(jì)、標(biāo)準(zhǔn)化交付與位置無關(guān)等。有人說輕量、無狀態(tài)是不是云原生的特征?我們并不認(rèn)為是。輕量、無狀態(tài)是容器的特征,容器非常適合部署微服務(wù)應(yīng)用,但微服務(wù)應(yīng)用并不一定是云原生應(yīng)用。
應(yīng)用云原生思想,可以采用微服務(wù)架構(gòu)、容器、DevOps等技術(shù)構(gòu)建輕量、無狀態(tài)的云原生應(yīng)用,使應(yīng)用具備云端部署、可遠(yuǎn)程訪問、彈性、共享、按需自助服務(wù)、高可用、與位置無關(guān)等特征,使之天生就具備云的基因,適合云環(huán)境部署運(yùn)行。云原生十二因素更多的也是從構(gòu)建云原生應(yīng)用的角度討論的。
(一)彈性
彈性是云計(jì)算的重要特征,理論上不受資源限制,可以無限占用資源(當(dāng)然需要按使用量付費(fèi))。容器之所以和云原生扯上關(guān)系,因?yàn)閺椥砸彩侨萜鞯闹匾卣?,采用容器很重要的是其彈性能力。彈性包括彈性使用資源和服務(wù)實(shí)例彈性擴(kuò)展能力。在單實(shí)例擴(kuò)展資源達(dá)到瓶頸,則配合負(fù)載均衡機(jī)制實(shí)現(xiàn)容器實(shí)例的彈性擴(kuò)展。我們談?wù)撛圃鷳?yīng)用彈性,應(yīng)該包括應(yīng)用使用資源的彈性和應(yīng)用實(shí)例彈性擴(kuò)展的彈性。
(二)共享
云計(jì)算分三種類型:IaaS、PaaS、SaaS,這就涉及三個(gè)層級的共享:資源共享、平臺(tái)共享、應(yīng)用共享。云原生應(yīng)用是SaaS層服務(wù),部署于IaaS或PaaS層。應(yīng)用有一份基準(zhǔn)代碼,多份部署,也是共享,是從應(yīng)用開發(fā)角度考慮,但不是云應(yīng)用共享意義。
云應(yīng)用可以對所有人開放,大家共享云應(yīng)用提供的服務(wù)。云應(yīng)用需要部署在云計(jì)算平臺(tái)上,使用云計(jì)算資源,這就實(shí)現(xiàn)了平臺(tái)共享和資源共享。
(三)自治
云應(yīng)用部署與位置無關(guān),你不知道它會(huì)被部署到什么位置,底層對用戶透明。所以云原生應(yīng)用的依賴包、配置文件、后端服務(wù)等就需要和應(yīng)用一起同生共死,成為一個(gè)整體,實(shí)現(xiàn)自管理自治理。
微服務(wù)的設(shè)計(jì)也遵循自治原則,和云原生應(yīng)用非常相似。這可能也是把它們放一起討論的原因。因此我們在用微服務(wù)實(shí)現(xiàn)云原生應(yīng)用的時(shí)候,自治是一個(gè)重要的判斷標(biāo)準(zhǔn)。這是分布式中心的好處,自成一體。就像人,每個(gè)人都是一個(gè)分布式中心,具備自我管理的能力。
(四)交付標(biāo)準(zhǔn)化,與位置無關(guān)
云應(yīng)用構(gòu)建可以在本地或者云端,運(yùn)行一定在云端,那就要按照一定的標(biāo)準(zhǔn)交付,比如容器鏡像,使交付標(biāo)準(zhǔn)化。標(biāo)準(zhǔn)交付就可以在云端任何支持標(biāo)準(zhǔn)的位置部署,或者根本不需要知道被部署到了什么位置運(yùn)行,和環(huán)境無關(guān)。就像Java曾經(jīng)宣稱的那樣:Write Once,Run Anywhere,實(shí)現(xiàn)Build Once,Run Anywhere。
容器的一個(gè)好處是應(yīng)用運(yùn)行工具標(biāo)準(zhǔn)化,所有的應(yīng)用都以標(biāo)準(zhǔn)化鏡像的方式交付,在標(biāo)準(zhǔn)化的容器里運(yùn)行。容器可以運(yùn)行在任何地方,或者也無需知道它運(yùn)行在哪里,只需要提交鏡像發(fā)布運(yùn)行就可以了。
(五)高可用性
多實(shí)例部署、彈性、自治等特性是高可用的保證。采用容器有時(shí)候并不能保證應(yīng)用的穩(wěn)定性,但可以是敏捷啟停、多實(shí)例高可用的。如果需要穩(wěn)定的高可用機(jī)制,容器可能不是最好的選擇。
(六)可監(jiān)控審計(jì)
用戶對應(yīng)用的訪問調(diào)用,應(yīng)用的運(yùn)行情況狀態(tài),不管通過日志或者接口能實(shí)時(shí)獲取到這些信息,用于計(jì)量計(jì)費(fèi)、監(jiān)控和后期審計(jì)等。比如可以根據(jù)負(fù)載流量實(shí)現(xiàn)彈性伸縮。
(七)按需訪問自助服務(wù)
云應(yīng)用部署在云端,根據(jù)客戶自己的需求,通過網(wǎng)絡(luò)訪問,自助使用服務(wù),不需要聯(lián)系云應(yīng)用管理人員。通常會(huì)有個(gè)云應(yīng)用服務(wù)目錄,每個(gè)應(yīng)用服務(wù)都有使用說明,通過服務(wù)目錄可以找到適合自己滿足自身需求的應(yīng)用。
(八)可配置
云應(yīng)用往往依賴配置中心,實(shí)現(xiàn)不同環(huán)境應(yīng)用的部署運(yùn)行。比如開發(fā)、測試和生產(chǎn)環(huán)境,一些參數(shù)的配置可能是不一樣的。很多時(shí)候又不方便把所有的配置文件都和應(yīng)用打包在一起,所以可以通過配置中心來統(tǒng)一管理應(yīng)用配置文件,甚至可以實(shí)現(xiàn)運(yùn)行時(shí)參數(shù)更新。
配置中心更多的是從應(yīng)用運(yùn)維的角度來考慮的。從自治角度來說,它并不是必須的。但是也是很重要的載體,就像人有大腦存儲(chǔ),但依然需要借助紙筆記憶一樣。
(九)敏捷
敏捷不管從應(yīng)用開發(fā)部署角度或者運(yùn)維運(yùn)營角度,都是需要的。但我們覺得它不是云原生應(yīng)用的關(guān)鍵特性。敏捷通常和輕量、微服務(wù)組件化相關(guān),小了,輕了相對就敏捷多了。很多時(shí)候敏捷和架構(gòu)相關(guān),不只是技術(shù)架構(gòu),也和組織架構(gòu)相關(guān)。敏捷更多的是流程、管理或體驗(yàn)的需求。
五、微服務(wù)、容器和DevOps構(gòu)建云原生應(yīng)用
容器輕量、彈性;微服務(wù)小而專使開發(fā)、測試、更新效率提高,實(shí)現(xiàn)了敏捷;DevOps持續(xù)集成、持續(xù)部署、持續(xù)發(fā)布、持續(xù)監(jiān)控、持續(xù)反饋、持續(xù)改進(jìn)而形成應(yīng)用生命周期管理的閉環(huán)。容器的輕量特性非常適合運(yùn)行微服務(wù)化應(yīng)用。微服務(wù)架構(gòu)使應(yīng)用設(shè)計(jì)架構(gòu)思想發(fā)生了改變。采用小而專的微服務(wù)完成某一特定的業(yè)務(wù)單元工作;通過微服務(wù)的組合或編排而成一個(gè)業(yè)務(wù)應(yīng)用,完成特定的業(yè)務(wù)流程;業(yè)務(wù)流程可以按需編排,實(shí)時(shí)部署;鏡像使交付標(biāo)準(zhǔn)化,容器使運(yùn)維調(diào)度標(biāo)準(zhǔn)化,鏡像倉庫使分發(fā)部署標(biāo)準(zhǔn)化。標(biāo)準(zhǔn)化使持續(xù)集成、部署、發(fā)布流程簡化,服務(wù)編排使應(yīng)用研發(fā)實(shí)現(xiàn)敏捷化,DevOps持續(xù)監(jiān)控、反饋、改進(jìn)使響應(yīng)變化敏捷化??梢约皶r(shí)反映市場業(yè)務(wù)需求的變化和要求。
也因此容器、微服務(wù)和DevOps會(huì)被放在一起來共同構(gòu)建輕量、無狀態(tài)的云原生應(yīng)用。
六、應(yīng)用改造和遷移
應(yīng)用通過改造使其具備云原生的特性(重生),部署于云環(huán)境,可以簡單的把它看到云原生應(yīng)用。但是如果不做改造直接遷移到云環(huán)境,并不能成為云原生應(yīng)用,即便具備云的某些特性,比如ESB服務(wù),并不是云原生應(yīng)用。
在考慮應(yīng)用遷移時(shí),需要考慮應(yīng)用是否具備云原生應(yīng)用的特性,如果不具備通常需要考慮改造,以使其能夠具備云計(jì)算的優(yōu)勢。