導(dǎo)讀:本文我們將一起探討什么是云原生,它的關(guān)鍵技術(shù)包括哪些。
作者:郝樹偉
來源:大數(shù)據(jù)DT(ID:hzdashuju)
云原生計算加速了應(yīng)用與基礎(chǔ)設(shè)施資源之間的解耦,通過定義開放標(biāo)準(zhǔn),向下封裝資源,將復(fù)雜性下沉到基礎(chǔ)設(shè)施層;向上支撐應(yīng)用,讓開發(fā)者更關(guān)注業(yè)務(wù)價值。此外,云原生計算提供統(tǒng)一的技術(shù)棧,動態(tài)、混合、分布式的云原生環(huán)境將成為新常態(tài)。云原生(Cloud Native)是一個組合詞,“云”表示應(yīng)用程序運(yùn)行于分布式云環(huán)境中,“原生”表示應(yīng)用程序在設(shè)計之初就充分考慮到了云平臺的彈性和分布式特性,就是為云設(shè)計的。可見,云原生并不是簡單地使用云平臺運(yùn)行現(xiàn)有的應(yīng)用程序,它是一種能充分利用云計算優(yōu)勢對應(yīng)用程序進(jìn)行設(shè)計、實現(xiàn)、部署、交付和操作的應(yīng)用架構(gòu)方法。云原生技術(shù)一直在不斷地變化和發(fā)展,關(guān)于云原生的定義也在不斷地迭代和更新,不同的社區(qū)組織或公司對云原生也有自己的理解和定義。Pivotal公司是云原生應(yīng)用架構(gòu)的先驅(qū)者和探路者,云原生的定義最早也是由Pivotal公司的Matt Stine于2013年提出的。Matt Stine在2015年出版的Migrating to Cloud-Native Application Architectures一書中提出,云原生應(yīng)用架構(gòu)應(yīng)該具備以下幾個主要特征。符合12因素,見下方所示。
面向微服務(wù)架構(gòu)。
自服務(wù)敏捷架構(gòu)。
基于API的協(xié)作。
具有抗脆弱性。
- 基準(zhǔn)代碼:一份基準(zhǔn)代碼,多份部署
- 配置:應(yīng)用配置存儲在環(huán)境中,與代碼分離
- 后端服務(wù):將通過網(wǎng)絡(luò)調(diào)用的其他后端服務(wù)當(dāng)作應(yīng)用的附加資源
- 構(gòu)建、發(fā)布、運(yùn)行:嚴(yán)格分離構(gòu)建、發(fā)布和運(yùn)行
- 進(jìn)程:以一個或多個無狀態(tài)進(jìn)程運(yùn)行應(yīng)用
- 并發(fā):通過進(jìn)程模型進(jìn)行擴(kuò)展
- 易處理:快速啟動和優(yōu)雅終止的進(jìn)程可以最大化應(yīng)用的健壯性
- 開發(fā)環(huán)境和線上環(huán)境一致性:盡可能保證開發(fā)環(huán)境、預(yù)發(fā)環(huán)境和線上環(huán)境的一致性
- 管理進(jìn)程:把后臺管理任務(wù)當(dāng)作一次性進(jìn)程運(yùn)行
2017年Matt Stine對云原生的定義做了一些修改,認(rèn)為云原生應(yīng)用架構(gòu)應(yīng)該具備6個主要特征:模塊化、可觀測性、可部署性、可測試性、可處理性和可替換性。截至本文結(jié)稿,Pivotal公司對云原生的最新定義為4個要點(diǎn):DevOps、持續(xù)交付、微服務(wù)、容器。除了對云原生技術(shù)發(fā)展做出巨大貢獻(xiàn)的Pivotal公司,另一個不得不提的云原生技術(shù)推廣者就是云原生計算基金會(Cloud Native Computing Foundation,CNCF)。CNCF是由開源基礎(chǔ)設(shè)施界的翹楚Google等多家公司共同發(fā)起的基金會組織,致力于維護(hù)一個廠商中立的云原生生態(tài)系統(tǒng),目前已經(jīng)是云原生技術(shù)最大的推動者。云原生計算基金會對云原生的定義:云原生技術(shù)有利于各組織在公有云、私有云和混合云等新型動態(tài)環(huán)境中構(gòu)建和運(yùn)行可彈性擴(kuò)展的應(yīng)用。云原生的代表技術(shù)包括容器、服務(wù)網(wǎng)格、微服務(wù)、不可變基礎(chǔ)設(shè)施和聲明式API。這些技術(shù)能夠構(gòu)建容錯性好、易于管理和便于觀察的松耦合系統(tǒng)。結(jié)合可靠的自動化手段,云原生技術(shù)使工程師能夠輕松地對系統(tǒng)做出頻繁和可預(yù)測的重大變更。容器技術(shù)是一種相對于虛擬機(jī)來說更加輕量的虛擬化技術(shù),能為我們提供一種可移植、可重用的方式來打包、分發(fā)和運(yùn)行應(yīng)用程序。容器提供的方式是標(biāo)準(zhǔn)化的,可以將不同應(yīng)用程序的不同組件組裝在一起,又可以將它們彼此隔離。容器的基本思想就是將需要執(zhí)行的所有軟件打包到一個可執(zhí)行程序包中,比如將一個Java虛擬機(jī)、Tomcat服務(wù)器以及應(yīng)用程序本身打包進(jìn)一個容器鏡像。用戶可以在基礎(chǔ)設(shè)施環(huán)境中使用這個容器鏡像啟動容器并運(yùn)行應(yīng)用程序,還可以將容器化運(yùn)行的應(yīng)用程序與基礎(chǔ)設(shè)施環(huán)境隔離。容器具有高度的可移植性,用戶可以輕松地在開發(fā)測試、預(yù)發(fā)布或生產(chǎn)環(huán)境中運(yùn)行相同的容器。如果應(yīng)用程序被設(shè)計為支持水平擴(kuò)縮容,就可以根據(jù)當(dāng)前業(yè)務(wù)的負(fù)載情況啟動或停止容器的多個實例。Docker項目是當(dāng)前最受歡迎的容器實現(xiàn),以至于很多人通常都將Docker和容器互換使用,但請記住,Docker項目只是容器技術(shù)的一種實現(xiàn),將來有可能會被替換。因為具備輕量級的隔離屬性,容器技術(shù)已然成為云原生時代應(yīng)用程序開發(fā)、部署和運(yùn)維的標(biāo)準(zhǔn)基礎(chǔ)設(shè)置。使用容器技術(shù)開發(fā)和部署應(yīng)用程序的好處如下。- 應(yīng)用程序的創(chuàng)建和部署過程更加敏捷:與虛擬機(jī)鏡像相比,使用應(yīng)用程序的容器鏡像更簡便和高效。
- 可持續(xù)開發(fā)、集成和部署:借助容器鏡像的不可變性,可以快速更新或回滾容器鏡像版本,進(jìn)行可靠且頻繁的容器鏡像構(gòu)建和部署。
- 提供環(huán)境一致性:標(biāo)準(zhǔn)化的容器鏡像可以保證跨開發(fā)、測試和生產(chǎn)環(huán)境的一致性,不必為不同環(huán)境的細(xì)微差別而苦惱。
- 提供應(yīng)用程序的可移植性:標(biāo)準(zhǔn)化的容器鏡像可以保證應(yīng)用程序運(yùn)行于Ubuntu、CentOS等各種操作系統(tǒng)或云環(huán)境下。
- 為應(yīng)用程序的松耦合架構(gòu)提供基礎(chǔ)設(shè)置:應(yīng)用程序可以被分解成更小的獨(dú)立組件,可以很方便地進(jìn)行組合和分發(fā)。
- 實現(xiàn)了資源隔離:容器應(yīng)用程序和主機(jī)之間的隔離、容器應(yīng)用程序之間的隔離可以為運(yùn)行應(yīng)用程序提供一定的安全保證。
容器技術(shù)大大簡化了云原生應(yīng)用程序的分發(fā)和部署,可以說容器技術(shù)是云原生應(yīng)用發(fā)展的基石。微服務(wù)是一種軟件架構(gòu)方式,我們使用微服務(wù)架構(gòu)可以將一個大型應(yīng)用程序按照功能模塊拆分成多個獨(dú)立自治的微服務(wù),每個微服務(wù)僅實現(xiàn)一種功能,具有明確的邊界。為了讓應(yīng)用程序的各個微服務(wù)之間協(xié)同工作,通常需要互相調(diào)用REST等形式的標(biāo)準(zhǔn)接口進(jìn)行通信和數(shù)據(jù)交換,這是一種松耦合的交互形式。微服務(wù)基于分布式計算架構(gòu),其主要特點(diǎn)可以概括為如下兩點(diǎn)。- 單一職責(zé):微服務(wù)架構(gòu)中的每一個服務(wù),都應(yīng)是符合高內(nèi)聚、低耦合以及單一職責(zé)原則的業(yè)務(wù)邏輯單元,不同的微服務(wù)通過REST等形式的標(biāo)準(zhǔn)接口互相調(diào)用,進(jìn)行靈活的通信和組合,從而構(gòu)建出龐大的系統(tǒng)。
- 獨(dú)立自治性:每個微服務(wù)都應(yīng)該是一個獨(dú)立的組件,它可以被獨(dú)立部署、測試、升級和發(fā)布,應(yīng)用程序中的某個或某幾個微服務(wù)被替換時,其他的微服務(wù)都不應(yīng)該被影響。
基于分布式計算、可彈性擴(kuò)展和組件自治的微服務(wù),與云原生技術(shù)相輔相成,為應(yīng)用程序的設(shè)計、開發(fā)和部署提供了極大便利。- 簡化復(fù)雜應(yīng)用:微服務(wù)的單一職責(zé)原則要求一個微服務(wù)只負(fù)責(zé)一項明確的業(yè)務(wù),相對于構(gòu)建一個可以完成所有任務(wù)的大型應(yīng)用程序,實現(xiàn)和理解只提供一個功能的小型應(yīng)用程序要容易得多。每個微服務(wù)單獨(dú)開發(fā),可以加快開發(fā)速度,使服務(wù)更容易適應(yīng)變化和新的需求。
- 簡化應(yīng)用部署:在單體的大型應(yīng)用程序中,即使只修改某個模塊的一行代碼,也需要對整個系統(tǒng)進(jìn)行重新構(gòu)建、部署、測試和交付。而微服務(wù)則可以單獨(dú)對某一個指定的組件進(jìn)行構(gòu)建、部署、測試和交付。
- 靈活組合:在微服務(wù)架構(gòu)中,可以重用一些已有的微服務(wù)組合新的應(yīng)用程序,降低應(yīng)用開發(fā)成本。
- 可擴(kuò)展性:根據(jù)應(yīng)用程序中不同的微服務(wù)負(fù)載情況,可以為負(fù)載高的微服務(wù)橫向擴(kuò)展多個副本。
- 技術(shù)異構(gòu)性:通常在一個大型應(yīng)用程序中,不同的模塊具有不同的功能特點(diǎn),可能需要不同的團(tuán)隊使用不同的技術(shù)棧進(jìn)行開發(fā)。我們可以使用任意新技術(shù)對某個微服務(wù)進(jìn)行技術(shù)架構(gòu)升級,只要對外提供的接口保持不變,其他微服務(wù)就不會受到影響。
- 高可靠性、高容錯性:微服務(wù)獨(dú)立部署和自治,當(dāng)某個微服務(wù)出現(xiàn)故障時,其他微服務(wù)不受影響。
微服務(wù)具備靈活部署、可擴(kuò)展、技術(shù)異構(gòu)等優(yōu)點(diǎn),但需要一定的技術(shù)成本,而且數(shù)量眾多的微服務(wù)也增加了運(yùn)維的復(fù)雜度,是否采用微服務(wù)架構(gòu)需要根據(jù)應(yīng)用程序的特點(diǎn)、企業(yè)的組織架構(gòu)和團(tuán)隊能力等多個方面來綜合評估。隨著微服務(wù)逐漸增多,應(yīng)用程序最終可能會變?yōu)槌砂偕锨€互相調(diào)用的服務(wù)組成的大型應(yīng)用程序,服務(wù)與服務(wù)之間通過內(nèi)部或者外部網(wǎng)絡(luò)進(jìn)行通信。如何管理這些服務(wù)的連接關(guān)系以及保持通信通道無故障、安全、高可用和健壯,就成了一個非常大的挑戰(zhàn)。服務(wù)網(wǎng)格(Service Mesh)可以作為服務(wù)間通信的基礎(chǔ)設(shè)施層,解決上述問題。服務(wù)網(wǎng)格是輕量級的網(wǎng)絡(luò)代理,能解耦應(yīng)用程序的重試/超時、監(jiān)控、追蹤和服務(wù)發(fā)現(xiàn),并且能做到應(yīng)用程序無感知。服務(wù)網(wǎng)格可以使服務(wù)與服務(wù)之間的通信更加流暢、可靠、安全,它的實現(xiàn)通常是提供一個代理實例,和對應(yīng)的服務(wù)一起部署在環(huán)境中,這種模式我們稱為Sidecar模式,Sidecar模式可處理服務(wù)之間通信的任何功能,比如負(fù)載均衡、服務(wù)發(fā)現(xiàn)等。服務(wù)網(wǎng)格的基礎(chǔ)設(shè)施層主要分為兩個部分,控制平面與數(shù)據(jù)平面,如圖1-1所示??刂破矫嬷饕?fù)責(zé)協(xié)調(diào)Sidecar的行為,提供API便于運(yùn)維人員操控和測量整個網(wǎng)絡(luò)。數(shù)據(jù)平面主要負(fù)責(zé)截獲不同服務(wù)之間的調(diào)用請求并對其進(jìn)行處理。▲圖1-1 服務(wù)網(wǎng)格典型架構(gòu)與微服務(wù)架構(gòu)相比,服務(wù)網(wǎng)格具有3個方面的優(yōu)勢。- 可觀測性:所有服務(wù)間通信都需要經(jīng)過服務(wù)網(wǎng)格,所以在此處可以捕獲所有調(diào)用相關(guān)的指標(biāo)數(shù)據(jù),如來源、目的地、協(xié)議、URL、狀態(tài)碼等,并通過API供運(yùn)維人員觀測。
- 流量控制:服務(wù)網(wǎng)格可以為服務(wù)提供智能路由、超時重試、熔斷、故障注入和流量鏡像等控制能力。
- 安全性:服務(wù)網(wǎng)格提供認(rèn)證服務(wù)、加密服務(wù)間通信以及強(qiáng)制執(zhí)行安全策略的能力。
DevOps(Development & Operations,開發(fā)和運(yùn)維)是軟件開發(fā)人員和IT人員之間的合作過程,是一種工作環(huán)境、文化和實踐的集合,目標(biāo)是高效地自動執(zhí)行軟件交付和基礎(chǔ)架構(gòu)更改流程。開發(fā)和運(yùn)維人員通過持續(xù)不斷的溝通和協(xié)作,可以以一種標(biāo)準(zhǔn)化和自動化的方式快速、頻繁且可靠地交付應(yīng)用。開發(fā)人員通常以持續(xù)集成和持續(xù)交付(CI/CD)的方式,快速交付高質(zhì)量的應(yīng)用程序。持續(xù)集成是指開發(fā)人員頻繁地將開發(fā)分支代碼合并到主干分支,這些開發(fā)分支在真正合并到主干分支之前,都需要持續(xù)編譯、構(gòu)建和測試,以提前檢查和驗證其存在的缺陷。持續(xù)集成的本質(zhì)是確保開發(fā)人員新增的代碼與主干分支正確集成。持續(xù)交付是指軟件產(chǎn)品可以穩(wěn)定、持續(xù)地保持隨時可發(fā)布的狀態(tài),它的目標(biāo)是促進(jìn)產(chǎn)品迭代更頻繁,持續(xù)為用戶創(chuàng)造價值。與持續(xù)集成關(guān)注代碼構(gòu)建和集成相比,持續(xù)交付關(guān)注的是可交付的產(chǎn)物。持續(xù)集成只是對新代碼與原有代碼的集成做了檢查和測試,在可交付的產(chǎn)物真正交付至生產(chǎn)環(huán)境之前,我們一般還需要將其部署至測試環(huán)境和預(yù)發(fā)布環(huán)境,進(jìn)行充分的集成測試和驗證,最后才會交付至生產(chǎn)環(huán)境,保證新增代碼在生產(chǎn)環(huán)境中穩(wěn)定可用。使用持續(xù)集成和持續(xù)交付的優(yōu)勢如下。- 避免重復(fù)性勞動,減少人工操作的錯誤:自動化部署可以將開發(fā)運(yùn)維人員從應(yīng)用程序集成、測試和部署等重復(fù)性勞動環(huán)節(jié)中解放出來,而且人工操作容易犯錯,機(jī)器犯錯的概率則非常小。
- 提前發(fā)現(xiàn)問題和缺陷:持續(xù)集成和持續(xù)交付能讓開發(fā)和運(yùn)維人員更早地獲取應(yīng)用程序的變更情況,更早地進(jìn)入測試和驗證階段,也就能更早地發(fā)現(xiàn)和解決問題。
- 更頻繁的迭代:持續(xù)集成和持續(xù)交付縮短了從開發(fā)、集成、測試、部署到交付各個環(huán)節(jié)的時間,中間有任何問題都可以快速“回爐”改造和更新,整個過程敏捷且可持續(xù),大大提高了應(yīng)用程序的迭代頻率和效率。
- 更高的產(chǎn)品質(zhì)量:持續(xù)集成可以結(jié)合代碼預(yù)覽、代碼質(zhì)量檢查等功能,對不規(guī)范的代碼進(jìn)行標(biāo)識和通知;持續(xù)交付可以在產(chǎn)品上線前充分驗證應(yīng)用可能存在的缺陷,最終提供給用戶一款高質(zhì)量的產(chǎn)品。
云原生應(yīng)用通常包含多個子功能組件,DevOps可以大大簡化云原生應(yīng)用從開發(fā)到交付的過程,實現(xiàn)真正的價值交付。在應(yīng)用開發(fā)測試到上線的過程中,應(yīng)用通常需要被頻繁部署到開發(fā)環(huán)境、測試環(huán)境和生產(chǎn)環(huán)境中,在傳統(tǒng)的可變架構(gòu)時代,通常需要系統(tǒng)管理員保證所有環(huán)境的一致性,而隨著時間的推移,這種靠人工維護(hù)的環(huán)境一致性很難維持,環(huán)境的不一致又會導(dǎo)致應(yīng)用越來越容易出錯。這種由人工維護(hù)、經(jīng)常被更改的環(huán)境就是我們常說的“可變基礎(chǔ)設(shè)施”。與可變基礎(chǔ)設(shè)施相對應(yīng)的是不可變基礎(chǔ)設(shè)施,是指一個基礎(chǔ)設(shè)施環(huán)境被創(chuàng)建以后不接受任何方式的更新和修改。這個基礎(chǔ)設(shè)施也可以作為模板來擴(kuò)展更多的基礎(chǔ)設(shè)施。如果需要對基礎(chǔ)設(shè)施做更新迭代,那么應(yīng)該先修改這些基礎(chǔ)設(shè)施的公共配置部分,構(gòu)建新的基礎(chǔ)設(shè)施,將舊的替換下線。簡而言之,不可變基礎(chǔ)設(shè)施架構(gòu)是通過整體替換而不是部分修改來創(chuàng)建和變更的。不可變基礎(chǔ)設(shè)施的優(yōu)勢在于能保持多套基礎(chǔ)設(shè)施的一致性和可靠性,而且基礎(chǔ)設(shè)施的創(chuàng)建和部署過程也是可預(yù)測的。在云原生結(jié)構(gòu)中,借助Kubernetes和容器技術(shù),云原生不可變基礎(chǔ)設(shè)施提供了一個全新的方式來實現(xiàn)應(yīng)用交付。云原生不可變基礎(chǔ)設(shè)施具有以下優(yōu)勢。- 能提升應(yīng)用交付效率:基于不可變基礎(chǔ)設(shè)施的應(yīng)用交付,可以由代碼或編排模板來設(shè)定,這樣就可以使用Git等控制工具來管理應(yīng)用和維護(hù)環(huán)境。基礎(chǔ)設(shè)施環(huán)境一致性能保證應(yīng)用在開發(fā)測試環(huán)境、預(yù)發(fā)布環(huán)境和線上生產(chǎn)環(huán)境的運(yùn)行表現(xiàn)一致,不會頻繁出現(xiàn)開發(fā)測試時運(yùn)行正常、發(fā)布后出現(xiàn)故障的情況。
- 能快速、可靠地水平擴(kuò)展:基于不可變基礎(chǔ)設(shè)施的配置模板,我們可以快速創(chuàng)建與已有基礎(chǔ)設(shè)施環(huán)境一致的新基礎(chǔ)設(shè)施環(huán)境。
- 能保證基礎(chǔ)設(shè)施的快速更新和回滾:基于同一套基礎(chǔ)設(shè)施模板,若某一環(huán)境被修改,則可以快速進(jìn)行回滾和恢復(fù),若需對所有環(huán)境進(jìn)行更新升級,則只需更新基礎(chǔ)設(shè)施模板并創(chuàng)建新環(huán)境,將舊環(huán)境一一替換。
聲明式設(shè)計是一種軟件設(shè)計理念:我們負(fù)責(zé)描述一個事物想要達(dá)到的目標(biāo)狀態(tài)并將其提交給工具,由工具內(nèi)部去處理如何實現(xiàn)目標(biāo)狀態(tài)。與聲明式設(shè)計相對應(yīng)的是過程式設(shè)計。在過程式設(shè)計中,我們需要描述為了讓事物達(dá)到目標(biāo)狀態(tài)的一系列操作,這一系列的操作只有都被正確執(zhí)行,才會達(dá)到我們期望的最終狀態(tài)。在聲明式API中,我們需要向系統(tǒng)聲明我們期望的狀態(tài),系統(tǒng)會不斷地向該狀態(tài)驅(qū)動。在Kubernetes中,聲明式API指的就是集群期望的運(yùn)行狀態(tài),如果有任何與期望狀態(tài)不一致的情況,Kubernetes就會根據(jù)聲明做出對應(yīng)的合適的操作。使用聲明式API的好處可以總結(jié)為以下兩點(diǎn)。聲明式API能夠使系統(tǒng)更加健壯,當(dāng)系統(tǒng)中的組件出現(xiàn)故障時,組件只需要查看API服務(wù)器中存儲的聲明狀態(tài),就可以確定接下來需要執(zhí)行的操作。聲明式API能夠減少開發(fā)和運(yùn)維人員的工作量,極大地提升工作效率。關(guān)于作者:郝樹偉,畢業(yè)于北京大學(xué),阿里云容器服務(wù)技術(shù)專家,曾就職于IBM。阿里云容器服務(wù)云原生分布式云團(tuán)隊核心成員,專注于云原生多云和混合云多集群統(tǒng)一管理和調(diào)度、混合集群、應(yīng)用交付和遷移等云原生技術(shù)的研究。本文摘編自《多云和混合云:云原生多集群和應(yīng)用管理》,本文摘編自《多云和混合云:云原生多集群和應(yīng)用管理》,經(jīng)出版方授權(quán)發(fā)布。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。