云原生機(jī)制的三個核心思想及其未來之路
譯文擺脫臨時性自動化方案之定位,發(fā)揮優(yōu)勢以實(shí)現(xiàn)可預(yù)測功能。
您能否以每周為單位向客戶發(fā)布各類新功能?甚至進(jìn)一步達(dá)到以每天乃至每小時為單位?新晉開發(fā)人員能否在上班的第一天即進(jìn)行代碼部署,或者是在工作審查過程中完成功能交付?了解到新員工完成代碼部署后,應(yīng)用程序仍能完美運(yùn)行,大家肯定可以睡個好覺。事實(shí)上,這種快捷的發(fā)布周期需要配合一系列流程、工具甚至是管理文化,從而共同支撐起一套安全且可靠的云原生應(yīng)用程序運(yùn)作機(jī)制。而這也成為軟件驅(qū)動型企業(yè)的核心戰(zhàn)略因素之一,其目標(biāo)在于以更快速度發(fā)布軟件成果,且同時降低潛在風(fēng)險。在擁有了這種快速發(fā)布軟件的能力之后,我們將擁有更為緊湊的反饋循環(huán),從而高效響應(yīng)客戶的每一項(xiàng)基本需求。
持續(xù)交付能力正是軟件邁向云原生方向的主要動力:軟件發(fā)布速度的加快能夠有效降低反饋周期的持續(xù)時間。DevOps代表著我們?nèi)鎸?shí)現(xiàn)云原生戰(zhàn)略過程中需要遵循的文化與技術(shù)轉(zhuǎn)變。微服務(wù)則是一套軟件架構(gòu)模式,其已經(jīng)被成功且廣泛地應(yīng)用于開發(fā)及交付運(yùn)營工作的規(guī)模擴(kuò)展當(dāng)中,且能夠有效規(guī)避緩慢、高風(fēng)險及單一性部署策略。舉例來說,如果大家無法真正推廣“快速失敗”與“自動化優(yōu)先”的DevOps文化,那么微服務(wù)機(jī)制將很難獲得成功。
持續(xù)交付、DevOps以及微服務(wù)分別面向云原生機(jī)制的三項(xiàng)根本性重點(diǎn),即為什么、如何以及什么。這些競爭優(yōu)勢已經(jīng)迅速成為企業(yè)在軟件成果對抗當(dāng)中勝出的有力武器。作為最為先進(jìn)的概念性載體,它們往往相互交織在一起并呈現(xiàn)出不可分割的態(tài)勢——而這,正是云原生機(jī)制的實(shí)際表現(xiàn)形式。
云原生機(jī)制對我們意味著什么?
在軟件交付生命周期當(dāng)中引入云原生機(jī)制之后,大家將能夠提高運(yùn)營及規(guī)?;?,進(jìn)而實(shí)現(xiàn)所謂“敏捷性”:也就是快速為軟件添加新功能,同時又不影響其在生產(chǎn)環(huán)境下的穩(wěn)定性與安全性水平的能力。眾所周知,我們的應(yīng)用程序在運(yùn)行過程中需要基礎(chǔ)設(shè)施、開發(fā)者中間件以及支持服務(wù)的多方配合,而云原生方案則通過對這些因素的自動化改造實(shí)現(xiàn)上述目標(biāo)。
這類方案絕不僅僅是在傳統(tǒng)面向虛擬化的編排體系基礎(chǔ)之上建立而成的臨時性自動化解決辦法。一套全面的云原生架構(gòu)當(dāng)中包含自動化與編排兩類機(jī)制,能夠幫助用戶直接獲得相關(guān)效果,而無需再將自動化流程作為可定制設(shè)計進(jìn)行編寫。其內(nèi)置自動化管理方案可作為契約起效,從而執(zhí)行政策并保障效果承諾。換句話來說,這類自動化方案使我們得以更為輕松地構(gòu)建出可以自動化方式管理的應(yīng)用程序。
當(dāng)然,新型基礎(chǔ)設(shè)施方案的出現(xiàn)同時也會對軟件的開發(fā)方式提出新的要求。開發(fā)人員必須利用一整套新的架構(gòu)實(shí)踐組合——例如微服務(wù)與容器技術(shù)——從而確保應(yīng)用程序能夠在云平臺之上得到妥善管理,這也是我們在軟件開發(fā)提速之外需要認(rèn)真考量的保障前提。新方案在運(yùn)營層面亦帶來多項(xiàng)助益,具體包括應(yīng)用程序?qū)嵗蛇w移、統(tǒng)一化登錄以及通過監(jiān)控手段保障應(yīng)用程序及數(shù)據(jù)流正常運(yùn)作等等。
要發(fā)揮云原生方案的固有優(yōu)勢,較為理想的途徑之一就是將其作為運(yùn)行時契約加以審視。所謂運(yùn)行時契約,本質(zhì)上是一套運(yùn)行軟件所需遵循的指南組合。云原生框架能夠幫助開發(fā)人員編寫出符合云平臺之上運(yùn)行時契約要求的應(yīng)用程序。
云原生框架
云原生應(yīng)用程序的一大關(guān)鍵性特質(zhì)在于,其需要遵循一套設(shè)計契約以最大程度實(shí)現(xiàn)行為的可預(yù)測性。云平臺當(dāng)中所使用的高自動化、容器驅(qū)動型基礎(chǔ)設(shè)施也對軟件的編寫方式提出了要求。開發(fā)人員必須改變自己的編程習(xí)慣,在開發(fā)人員與基礎(chǔ)設(shè)施之間創(chuàng)建出一套用于指導(dǎo)應(yīng)用程序運(yùn)行的新型“契約”。下面我們就通過“應(yīng)用十二要素”中所提出的十二項(xiàng)基本原則來了解如何打造出一套理想的“契約”機(jī)制。
這十二項(xiàng)因素之間存在一定交集,同時亦相互支撐。大家在具體實(shí)施過程中,應(yīng)當(dāng)盡可能保持其直接關(guān)聯(lián)與可行性:
1.立足于單一代碼庫向多種環(huán)境部署 – 包括生產(chǎn)性組件在內(nèi)的單一代碼庫能夠確保代碼的單一來源,從而降低配置錯誤數(shù)量并提高彈性水平。
2.以聲明方式管理依賴性 – 云平臺需要引入必要的關(guān)聯(lián)性聲明并加以妥善管理,從而確保相關(guān)云應(yīng)用程序始終具備必要的庫及服務(wù)支持。
3.使用保存在環(huán)境當(dāng)中的配置信息 – 環(huán)境變量能夠提供一套簡潔、易于理解且符合標(biāo)準(zhǔn)要求的使用方式,從而為以多種編程語言編寫而成的無狀態(tài)應(yīng)用程序提供良好的配置機(jī)制。
4.將后端服務(wù)作為附加資源處理 – 將每種資源都作為遠(yuǎn)程資源處理的思路成就了彈性這一概念,這不僅從編程層面考慮到了資源不可用情況,同時也最大程度發(fā)揮了微服務(wù)方案當(dāng)中的固有優(yōu)勢。
5.將構(gòu)建、發(fā)布以及運(yùn)行階段區(qū)分開來 – 云原生應(yīng)用程序的構(gòu)建流程將大部分發(fā)布配置工作轉(zhuǎn)移到了“開發(fā)”階段,這意味著發(fā)布包當(dāng)中將包含有代碼本身以及運(yùn)行應(yīng)用程序所必需的生產(chǎn)配置方案。
6.以無狀態(tài)方式運(yùn)行 – 云原生基礎(chǔ)設(shè)施的速度表現(xiàn)與成本效益要得到切實(shí)體現(xiàn),要求應(yīng)用程序堆棧中的第一層擁有盡可能高的輕量化水平。
7.將服務(wù)與端口綁定 – 云原生應(yīng)用程序當(dāng)中的服務(wù)接口一般傾向于利用基于HTTP的API作為通用集成框架。
8.通過添加無狀態(tài)進(jìn)程實(shí)現(xiàn)橫向擴(kuò)展 – 對于無狀態(tài)非共享式設(shè)計思路的強(qiáng)調(diào),意味著擴(kuò)展工作能夠依賴于底層平臺——而非智能化多進(jìn)程代碼——來完成。
9.啟動速度快,允許正常關(guān)閉 – 假定任意給定進(jìn)程都能夠隨時進(jìn)行啟動與關(guān)閉。
10.在開發(fā)、分段與生產(chǎn)環(huán)境下?lián)碛薪y(tǒng)一運(yùn)行效果 – 由于高度強(qiáng)調(diào)自動化機(jī)制并在各生命周期階段使用同樣的云平臺,因此只要大家使用的是同一套“平臺”、那么我這邊能用的在你那邊也同樣能用。
11.對匯總及事件響應(yīng)的標(biāo)準(zhǔn)輸出結(jié)果進(jìn)行記錄 – 當(dāng)日志記錄由云平臺而非應(yīng)用程序內(nèi)的庫負(fù)責(zé)處理時,將記錄機(jī)制作為功能實(shí)體則變得非常關(guān)鍵。
12.允許臨時性任務(wù)以短期進(jìn)程方式運(yùn)行 – 在云原生方案當(dāng)中,管理任務(wù)可以單純轉(zhuǎn)化為另一種進(jìn)程、而非特定工具,而且必須保證其行為方式要與使用“機(jī)密”API以及內(nèi)部機(jī)制有所區(qū)別。
遵循以上指導(dǎo)性原則,我們完全可以在應(yīng)用程序當(dāng)中利用統(tǒng)一的架構(gòu)接口構(gòu)建起一套無狀態(tài)且面向過程的設(shè)計模式,從而打造出適合運(yùn)行在云環(huán)境之下的分布式應(yīng)用程序。Ruby on Rails憑借著所堅持的、基于配置的公約方式在Web開發(fā)領(lǐng)域給應(yīng)用程序框架帶來了一次革命。自Rails首次發(fā)布至今的九年半時間里,充分利用框架潛能的意識已經(jīng)深入到了整個技術(shù)行業(yè)當(dāng)中,而云原生機(jī)制的出現(xiàn)也將繼續(xù)延續(xù)這一發(fā)展趨勢。
以Spring Boot/Cloud以及Dropwizard for Java、Seneca for Node.js甚至是Ruby on Rails為代表的各類框架已經(jīng)為云契約構(gòu)建起了很好的立足根基。它們的存在不僅能幫助我們節(jié)約大量時間,同時也讓開發(fā)者能夠?qū)⒕性诰帉懽鳛閼?yīng)用核心的關(guān)鍵性業(yè)務(wù)邏輯身上,而非勞心勞力將代碼粘接在一起以實(shí)現(xiàn)正常運(yùn)行。
當(dāng)我們的應(yīng)用程序符合運(yùn)行時契約要求時,這意味著大家可以對其進(jìn)行編排、管理并通過彈性云原生運(yùn)行時環(huán)境對其進(jìn)行規(guī)模伸縮。
#p#
云原生運(yùn)行時
容器技術(shù)已經(jīng)興起并發(fā)展成為云運(yùn)行時環(huán)境當(dāng)中的關(guān)鍵性組成部分。它們的輕量級特性以及緊湊的資源管理機(jī)制能夠極好地同云應(yīng)用程序方案加以配合,從而在提高速度的同時改進(jìn)資源利用效率。容器技術(shù)相當(dāng)于將一款能夠運(yùn)行于云平臺之上的應(yīng)用程序打包成一套獨(dú)立的可執(zhí)行組件,且確保其與云平臺的契約要求相兼容。
與其它任意進(jìn)程一樣,大家也可以在每一臺主機(jī)設(shè)備上運(yùn)行多套容器系統(tǒng)(無論是裸機(jī)還是虛擬機(jī))。在開發(fā)階段中,利用容器方案構(gòu)建應(yīng)用程序能幫助開發(fā)人員降低耗費(fèi)在編程方面的時間周期,同時在筆記本設(shè)備上創(chuàng)建出一套完整的、甚至能夠面向開發(fā)者運(yùn)行的云環(huán)境,從而模擬出整個生產(chǎn)流程。在生產(chǎn)環(huán)境下,容器提供的密鑰機(jī)制能夠更好地保障不同進(jìn)程之間的安全性,幫助各進(jìn)程擁有更出色的穩(wěn)定性與可預(yù)測的資源消耗水平。而著眼于下一個層級,我們還能夠借此預(yù)測基礎(chǔ)設(shè)施在響應(yīng)需求過程中的成長增長進(jìn)度。
要有效運(yùn)用容器技術(shù),我們必須對其精心編排。編排是一種手段,目的是在無需人為介入或者制定規(guī)劃的前提下以消耗性資源池為基礎(chǔ),實(shí)現(xiàn)容器的啟動、中止以及資源分發(fā)——這實(shí)際上是一套彈性運(yùn)行時。編排方案當(dāng)中需要包含部署請求、自動伸縮流量分析以及基礎(chǔ)設(shè)施發(fā)生故障時的響應(yīng)措施等要素。完整的容器編排方案還能夠?qū)崿F(xiàn)診斷及變更回滾,同時對處于生產(chǎn)環(huán)境下的不同實(shí)驗(yàn)性應(yīng)用程序版本進(jìn)行管理及A/B測試乃至試探性部署。相比之下,簡單的打包容器則僅僅屬于云原生架構(gòu)需求當(dāng)中的一部分,負(fù)責(zé)編排并管理相關(guān)容器的部署方式——在這種情況下,容器在生產(chǎn)環(huán)境下的具體效果甚至要比容器自身的打包方式更加重要。
隨著云原生框架方案的持續(xù)興起,容器編排的出色屬性已經(jīng)受到業(yè)界的廣泛關(guān)注。下面我們來總結(jié)享受容器運(yùn)行時優(yōu)勢時需要保證的幾項(xiàng)前提:
1.對生命周期的創(chuàng)建、運(yùn)行以及中止加以管理 – 對運(yùn)行在生產(chǎn)環(huán)境中的各容器的生命周期進(jìn)行嚴(yán)格管理能夠幫助大家根據(jù)實(shí)際需求對應(yīng)用程序規(guī)模加以自動伸縮。
2.通過約束性手段以可預(yù)測方式運(yùn)用資源 – 容器機(jī)制允許我們對每項(xiàng)實(shí)例所使用的資源進(jìn)行細(xì)化控制。
3.進(jìn)程隔離 – 同樣的,容器機(jī)制能夠利用內(nèi)核層級的命名空間與本地文件系統(tǒng)保證各個進(jìn)程之間彼此隔離。
4.通過編排機(jī)制優(yōu)化資源利用方式 – 考慮到資源池通常由一系列虛擬機(jī)系統(tǒng)共同構(gòu)成,容器會以分布式管理方式將工作負(fù)載分發(fā)至整個資源池當(dāng)中。
5.故障診斷及生產(chǎn)恢復(fù)方式 – 生產(chǎn)環(huán)境下總會有組件發(fā)生故障,而這套編排平臺應(yīng)當(dāng)以自動化方式對關(guān)鍵性故障作出響應(yīng),包括移除異常實(shí)例及基礎(chǔ)設(shè)施并重新均衡負(fù)載以避免宕機(jī)等。
云原生運(yùn)行時能夠運(yùn)行在類別廣泛的不同基礎(chǔ)設(shè)施之上,且通過API消除對具體基礎(chǔ)設(shè)施類型的依賴性。當(dāng)然,擁有妥善管理的自動你可以基礎(chǔ)設(shè)施能夠讓我們的云原生架構(gòu)在彈性方面更上一層樓。
云原生基礎(chǔ)設(shè)施自動化
以合理實(shí)施作為出發(fā)點(diǎn),基礎(chǔ)設(shè)施自動化將使整套生產(chǎn)架構(gòu)以全面托管方式運(yùn)作,且?guī)缀鯚o需人為因素的介入。
強(qiáng)大的自動化機(jī)制能夠處理幾乎任何原本需要由傳統(tǒng)IT人員完成的任務(wù):新型路由器及負(fù)載均衡機(jī)制能夠完成應(yīng)用實(shí)例的啟動與中止、配置以及網(wǎng)絡(luò)服務(wù)等應(yīng)用程序部署過程中必需的環(huán)節(jié),同時實(shí)現(xiàn)新基礎(chǔ)設(shè)施資源分配、設(shè)置監(jiān)控方案與災(zāi)難恢復(fù)場景、日志匯總甚至是在基礎(chǔ)設(shè)施出現(xiàn)故障時對工作負(fù)載進(jìn)行重新分配。
這類先進(jìn)的自動化實(shí)踐能夠幫助我們免受零日安全漏洞的侵?jǐn)_:自動化方案會在每個節(jié)點(diǎn)之上進(jìn)行部署操作,從而在不產(chǎn)生任何停機(jī)時間的前提下應(yīng)用安全補(bǔ)丁。
要實(shí)現(xiàn)這種級別的自動化效果,我們需要使用所謂結(jié)構(gòu)化平臺。從宏觀角度看,這類結(jié)構(gòu)化平臺必須擁有以下能力:
1.路由與負(fù)載均衡 – 通過容器編排對應(yīng)用程序進(jìn)行橫向擴(kuò)展必然要求網(wǎng)絡(luò)路由加以配合,而后者則能夠以動態(tài)方式對面向整套資源池的輸入請求進(jìn)行均衡。
2.支持服務(wù)代理 – 大部分應(yīng)用程序在運(yùn)行過程中都需要外部支持服務(wù)作為配合,例如數(shù)據(jù)庫、緩存解決方案以及消息隊列機(jī)制等等,而這一切都應(yīng)當(dāng)由該平臺作為貫穿整個環(huán)境的高可用性服務(wù)加以交付,且符合前面提到的十二項(xiàng)配置基本原則。
3.基礎(chǔ)設(shè)施編排 – 平臺應(yīng)當(dāng)自動管理整套基礎(chǔ)設(shè)施,從而對計算資源進(jìn)行彈性規(guī)模伸縮。
4.運(yùn)行狀況管理、監(jiān)控與恢復(fù) – 當(dāng)事件發(fā)生時,將平臺之上所運(yùn)行應(yīng)用程序之虛擬化、實(shí)例以及通知與審計全部納入日志記錄。
5.可重復(fù)使用的運(yùn)行時環(huán)境庫 – 容器鏡像在創(chuàng)建過程中需要考慮到不同應(yīng)用程序?qū)嵗龁⒂脮r的發(fā)布及可重復(fù)使用能力,從而確保整套架構(gòu)中的全部實(shí)例皆擁有完全一致的運(yùn)行前提。
6.日志匯總 – 高可用性橫向擴(kuò)展應(yīng)用需要對來自全部實(shí)例的日志信息加以匯總,從而進(jìn)行分析并針對突發(fā)情況作出快速響應(yīng)。
云原生基礎(chǔ)設(shè)施編排機(jī)制提供一套貫徹基礎(chǔ)設(shè)施始終的結(jié)構(gòu)化平臺,它既是整合了底層API的完整層級,同時也作為云原生架構(gòu)中的基礎(chǔ)性組成部分存在,從而保證運(yùn)行時編排體系得以安裝、擴(kuò)展、管理以及更新。
這正是保障云原生應(yīng)用程序交付成功的宏觀層面考量方向,同時也是在運(yùn)營過程中降低修復(fù)時間與壓力成本并加快軟件交付速度的有效途徑。如果部署與運(yùn)營成本過于高昂,那么持續(xù)交付與微服務(wù)架構(gòu)將無從談起。我們當(dāng)然需要著眼于此類工具的主要功能,但同時也必須重視高可信度文化及流程的建立。(在某些情況下,文化與流程甚至?xí)蔀樽笥覍?shí)際結(jié)果的關(guān)鍵性因素,但這就不在今天的討論范圍之內(nèi)了。)
邁向云原生之路
對于希望最大程度享受持續(xù)交付機(jī)制所帶來的速度與效益的用戶來說,擁有一套能夠支持云原生應(yīng)用程序的架構(gòu)顯然極為重要,只有這樣面向整體軟件交付生命周期的技術(shù)方案才能落實(shí)到位。以符合云原生容器運(yùn)行時特性的云原生框架為前提構(gòu)建應(yīng)用程序,同時實(shí)現(xiàn)云原生基礎(chǔ)設(shè)施自動化,這樣企業(yè)業(yè)務(wù)能力才能在軟件交付過程中得到保證。此類平臺還包含大量用于實(shí)現(xiàn)持續(xù)交付、敏捷開發(fā)以及DevOps活動的具體實(shí)踐及流程,同時帶來云基礎(chǔ)設(shè)施所固有的可用性及可靠性優(yōu)勢。
總而言之,享受云原生的穩(wěn)定性與敏捷性優(yōu)勢不應(yīng)以犧牲固有效益為代價。在云原生架構(gòu)當(dāng)中,我們可以擁有同樣的資源儲備、靈活性水平、速度表現(xiàn)乃至安全成效——Netflix等云原生企業(yè)已經(jīng)給出了實(shí)證。保持信心,同時謹(jǐn)慎對待,這正是在云原生之路上高歌猛進(jìn)的重要原則。
原文標(biāo)題:The cloud-native future