一起聊聊什么是云原生技術(shù)
??想了解更多關(guān)于開源的內(nèi)容,請訪問:??
近期在社區(qū)里看到很多人都在問什么是云原生,很有幸我是一位云原生技術(shù)的初級使用者,我們目前運用到的云原生技術(shù)有微服務(wù)、Kubernetes、Docker、Istio、Serverless, 今天我們就一起來聊聊。
云原生的起源
重量級嘉賓
在介紹云原生之前,我們先介紹一位重量級嘉賓,可以說是目前云原生領(lǐng)域影響力最大最有話語權(quán)的組織 CNCF。
CNCF,全稱Cloud Native Computing Foundation(云原生計算基金會),成立于 2015 年7月21日于美國波特蘭OSCON 2015上宣布,其最初的口號是堅持和整合開源技術(shù)來讓編排容器作為微服務(wù)架構(gòu)的一部分,其作為致力于云原生應(yīng)用推廣和普及的一支重要力量。
再來一張 CNCF 的全景圖:
云原生定義
CNCF 的定義
Cloud native technologies empower organizations to build and run scalable applications in modern, dynamic environments such as public, private, and hybrid clouds. Containers, service meshes, microservices, immutable infrastructure, and declarative APIs exemplify this approach.
These techniques enable loosely coupled systems that are resilient, manageable, and observable. Combined with robust automation, they allow engineers to make high-impact changes frequently and predictably with minimal toil.
The Cloud Native Computing Foundation seeks to drive adoption of this paradigm by fostering and sustaining an ecosystem of open source, vendor-neutral projects. We democratize state-of-the-art patterns to make these innovations accessible for everyone.
云原生技術(shù)有利于各組織在公有云、私有云和混合云等新型動態(tài)環(huán)境中,構(gòu)建和運行可彈性擴展的應(yīng)用。云原生的代表技術(shù)包括容器、服務(wù)網(wǎng)格、微服務(wù)、不可變基礎(chǔ)設(shè)施和聲明式API。這些技術(shù)能夠構(gòu)建容錯性好、易于管理和便于觀察的松耦合系統(tǒng)。結(jié)合可靠的自動化手段,云原生技術(shù)使工程師能夠輕松地對系統(tǒng)作出頻繁和可預(yù)測的重大變更。
云原生計算基金會(CNCF)致力于培育和維護(hù)一個廠商中立的開源生態(tài)系統(tǒng),來推廣云原生技術(shù)。我們通過將最前沿的模式民主化,讓這些創(chuàng)新為大眾所用。
以上內(nèi)容來源于:CNCF Cloud Native Definition v1.0 - github.com
Pivotal 的定義
2015年,云原生剛推廣時,Matt Stine在《遷移到云原生架構(gòu)》一書中定義了符合云原生架構(gòu)的幾個特征:12因素、微服務(wù)、自敏捷架構(gòu)、基于API 協(xié)作、扛脆弱性。
到了2017年,Matt Stine改了口風(fēng),將云原生架構(gòu)歸納為模塊化、可觀察、可部署、可測試、可替換、可處理6特質(zhì)。而Pivotal官網(wǎng)對云原生概括為4個要點:DevOps+持續(xù)交付+微服務(wù)+容器。
MattStine認(rèn)為云原生它是一個思想的集合,包括DevOps、持續(xù)交付(Continuous Delivery)、微服務(wù)(MicroServices)、敏捷基礎(chǔ)設(shè)施(Agile Infrastructure)、康威定律(Conways Law)等。
云原生既包含技術(shù)(微服務(wù),敏捷基礎(chǔ)設(shè)施),也包含管理(DevOps,持續(xù)交付,康威定律,重組等),可以說是一系列云技術(shù)、企業(yè)管理方法的集合。
我們暫且以 CNCF 官方的定義為準(zhǔn),按CNCF的定義,云原生的代表技術(shù)包括容器、服務(wù)網(wǎng)格、微服務(wù)、不可變基礎(chǔ)設(shè)施和聲明式API。
云原生的代表技術(shù)
微服務(wù)
微服務(wù)可以從兩個方面去理解:什么是“微”、什么是“服務(wù)”。
微,狹義來講就是體積小。
服務(wù),一定要區(qū)別于系統(tǒng),服務(wù)一個或者一組相對較小且獨立的功能單元,是用戶可以感知最小功能集。
傳統(tǒng)的單體架構(gòu),是以整個系統(tǒng)為單位進(jìn)行部署。而微服務(wù),則是以每一個獨立組件(例如用戶服務(wù),商品服務(wù))為單位進(jìn)行部署。
對于單體應(yīng)用,如果發(fā)現(xiàn)某一業(yè)務(wù)的請求量非常大,那么是無法單獨擴展該業(yè)務(wù)的,只能拷貝整個單體應(yīng)用,再部署一套環(huán)境,來實現(xiàn)集群。正因為單體應(yīng)用的缺陷,才有了微服務(wù)。而近幾年流行的Docker,為微服務(wù)架構(gòu)提供了有效的容器。
容器
開源解決方案供應(yīng)商紅帽官網(wǎng)給出的容器定義:
Linux?容器是與系統(tǒng)其他部分隔離開的一系列進(jìn)程。
運行這些進(jìn)程所需的所有文件都由另一個鏡像提供,這意味著從開發(fā)到測試再到生產(chǎn)的整個過程中,Linux 容器都具有可移植性和一致性。
容器提供進(jìn)程級的隔離,可以將操作系統(tǒng)管理的資源劃分到相互隔離的組中,在相互隔離的組之間解決資源使用存在沖突的問題。比如應(yīng)用程序(Application)APP 1 ,只能在centos 操作系統(tǒng)上運行;APP2只能在Ubuntu操作系統(tǒng)上運行。而同一個操作系統(tǒng)同時運行APP1和APP2就產(chǎn)生沖突。容器技術(shù)則恰恰可以解決這類問題。目前主流的容器技術(shù)有Docker、LXD以及RKT等。
Docker
說到容器,就不得不說Docker。
2010年,幾個大胡子的年輕人在美國舊金山成立了一家名叫“dotCloud”的公司。這家公司主要提供基于PaaS的云計算技術(shù)服務(wù)。具體來說,是和LXC有關(guān)的容器技術(shù)。
LXC,就是Linux容器虛擬技術(shù)(Linux container)。
后來,dotCloud公司將自己的容器技術(shù)進(jìn)行了簡化和標(biāo)準(zhǔn)化,并命名為——Docker。
Docker項目通過容器鏡像,直接將一個應(yīng)用運行所需的完整環(huán)境,即:整個操作系統(tǒng)的文件系統(tǒng)也打包了進(jìn)去。
這種思路,可算是解決了困擾PaaS用戶已久的一致性問題,制作一個“一次發(fā)布、隨處運行”的Docker鏡像的意義,一下子就比制作一個連開發(fā)和測試環(huán)境都無法統(tǒng)一的Buildpack高明了太多。
Docker項目大大降低了容器技術(shù)的使用門檻。輕量級,可移植,虛擬化,語言無關(guān),寫了程序扔上去做成鏡像可以隨處部署和運行,開發(fā)、測試和生產(chǎn)環(huán)境徹底統(tǒng)一了,還能進(jìn)行資源管控和虛擬化。
Docker作為一種開源應(yīng)用容器引擎,是為開發(fā)人員和系統(tǒng)管理員設(shè)計的用于構(gòu)建、發(fā)布和運行分布式應(yīng)用的平臺,典型的Docker平臺Kubernetes、OpenShift V3、Flynn、Deis等。
Docker允許開發(fā)人員將各種應(yīng)用以及依賴包打包到一個可移植的Docker容器中,以Docker容器為資源分割和調(diào)度的基本單位,封裝整個軟件運行時的環(huán)境,然后發(fā)布到Linux機器上。
Kubernetes
有了容器,就需要編排管理容器的生命周期。這里不得不提一下 Kubernetes。
Kubernetes,這個單詞來自于希臘語,含義是舵手或領(lǐng)航員。K8s是它的縮寫,用“8”字替代了“ubernete”這8個字符。Kubernetes并不是一件全新的發(fā)明。它是谷歌根據(jù)其內(nèi)部使用的Borg改造成的一個通用容器編排調(diào)度器,于2014年6月開源。
2015年,谷歌將其捐贈給Linux基金會下屬的云原生計算基金會(CNCF),Kubernetes也成為CNCF第一個項目。
CNCF中托管的一系列項目,即致力于云原生應(yīng)用整個生命周期的管理,從部署平臺、日志收集、Service Mesh(服務(wù)網(wǎng)格)、服務(wù)發(fā)現(xiàn)、分布式追蹤、監(jiān)控以及安全等各個領(lǐng)域通過開源軟件為我們提供一整套解決方案。
Kubernetes作為云應(yīng)用的部署標(biāo)準(zhǔn),直接面向業(yè)務(wù)應(yīng)用,大大提高了云應(yīng)用的可移植性,解決云廠商鎖定的問題,讓云應(yīng)用可以在夸云之間無縫遷移,甚至用來管理混合云,成為企業(yè) IT 云平臺的新標(biāo)準(zhǔn)。
服務(wù)網(wǎng)格
服務(wù)網(wǎng)格(Service Mesh),是指用以處理服務(wù)與服務(wù)之間通信的基礎(chǔ)設(shè)施層。
其最早由Buoyant公司(開發(fā)Service Mesh項目Linkerd的公司)提出,并在內(nèi)部使用。該公司2016年9月29日第一次公開使用這個術(shù)語。
Service Mesh一般用于微服務(wù)應(yīng)用的可配置基礎(chǔ)架構(gòu)層(configurable infrastructure layer)。Istio(由Google、IBM、Lyft公司在背后進(jìn)行支持)是目前最廣為人知的一款服務(wù)網(wǎng)格架構(gòu)。
Docker和Kubernetes這樣的工具已經(jīng)“解決了部署問題”。但他們還沒有解決運行時的問題,這就是服務(wù)網(wǎng)格的由來, 而 Service Mesh的出現(xiàn),彌補了Kubernetes在微服務(wù)的連接、管理和監(jiān)控方面的短板,為Kubernetes提供更好的應(yīng)用和服務(wù)管理。
因此,Service Mesh的代表Istio一經(jīng)推出,就被認(rèn)為是可以和Kubernetes形成雙劍合璧效果的微服務(wù)管理的利器,受到了業(yè)界的推崇。
不可變基礎(chǔ)設(shè)施
在傳統(tǒng)的可變服務(wù)器基礎(chǔ)架構(gòu)中,服務(wù)器會不斷更新和修改。使用此類基礎(chǔ)架構(gòu)的工程師和管理員可以通過SSH連接到他們的服務(wù)器,手動升級或降級軟件包,逐個服務(wù)器地調(diào)整配置文件,以及將新代碼直接部署到現(xiàn)有服務(wù)器上。可變基礎(chǔ)設(shè)施通常在災(zāi)難發(fā)生的時候,難以重新構(gòu)建服務(wù)。持續(xù)過多的手工操作,缺乏記錄,會導(dǎo)致很難由標(biāo)準(zhǔn)初始化后的服務(wù)器來重新構(gòu)建起等效的服務(wù)。在服務(wù)運行過程中,持續(xù)的修改服務(wù)器,就猶如程序中的可變變量的值發(fā)生變化而引入的狀態(tài)不一致的并發(fā)風(fēng)險。這些對于服務(wù)器的修改,同樣會引入中間狀態(tài),從而導(dǎo)致不可預(yù)知的問題。
而不可變基礎(chǔ)架構(gòu)是程序設(shè)計中不可變變量(ImmutableVariable)就是在完成賦值后就不能發(fā)生更改,只能創(chuàng)建新的來整體替換舊的。由于具有這樣的特性這種變量可以在并發(fā)環(huán)境下安全的使用。對于基礎(chǔ)設(shè)施的不可變性,最基本的就是指運行服務(wù)的服務(wù)器在完成部署后,就不在進(jìn)行更改。其好處包括基礎(chǔ)架構(gòu)中更高的一致性和可靠性,以及更簡單,更可預(yù)測的部署過程。它可以緩解或完全防止可變基礎(chǔ)架構(gòu)中常見的問題,例如配置漂移和雪花服務(wù)器。
聲明式API
在聲明式 API 中,我們可以聲明系統(tǒng)要執(zhí)行的操作,系統(tǒng)將不斷向該狀態(tài)驅(qū)動。有點“產(chǎn)品經(jīng)理”和“開發(fā)”之間的關(guān)系,“產(chǎn)品經(jīng)理”只負(fù)責(zé)提需求,而“開發(fā)”怎么實現(xiàn)的,他并不關(guān)心。
總結(jié)一下:
- Kubernetes是整個云原生的基石,云原生的整個生態(tài)體系都是依靠Kubernetes建立起來的。
- 容器(Container)是Kubernetes的底層引擎。
- Docker是應(yīng)用最廣的容器工具。
- 微服務(wù)是Docker的好搭檔。
- 服務(wù)網(wǎng)格是微服務(wù)的輔助,建立在k8s上的針對請求的擴展功能。
- 不可變基礎(chǔ)設(shè)施是現(xiàn)代運維的基石。
- 聲明式API是Kubernetes的編碼方式。
云原生到底哪里好?
綜合來說云原生可以打通微服務(wù)開發(fā)、測試、部署、發(fā)布的整個流程環(huán)節(jié),在云原生架構(gòu)下,底層的服務(wù)或者是API都由將部署到云中,等價于將繁重的運維工作轉(zhuǎn)移給了云平臺供應(yīng)商, 但這也得益于云計算的基礎(chǔ)設(shè)施更加廉價。詳細(xì)來說一下個人認(rèn)為的以下三個優(yōu)勢:
快速迭代
利用云原生應(yīng)用程序開發(fā),使得交付團(tuán)隊可以使用重復(fù)的自動化和編排來快速迭代,讓開發(fā)人員有更多的精力聚焦于業(yè)務(wù)開發(fā)上。
自動部署
云原生方法遠(yuǎn)優(yōu)于傳統(tǒng)的面向虛擬化的業(yè)務(wù)流程,傳統(tǒng)方法需要投入大量的精力來構(gòu)建開發(fā)環(huán)境,以及軟件交付過程中的其他不同環(huán)境。而云原生架構(gòu)具備自動化和組合功能,并且依賴于可靠、經(jīng)過驗證和審核的已知良好流程的基礎(chǔ),交付十分敏捷,而不再需要人工干預(yù)重復(fù)執(zhí)行。
獨立高效
云原生帶來了微服務(wù)化架構(gòu),一個微服務(wù)基本是一個能獨立發(fā)布的應(yīng)用服務(wù),因此可以作為獨立組件升級、灰度或復(fù)用等,對整個大應(yīng)用的影響也較小,每個服務(wù)可以由專門的組織來單獨完成,依賴方只要定好輸入和輸出口即可完全開發(fā)、甚至整個團(tuán)隊的組織架構(gòu)也會更精簡,因此溝通成本低、效率高。
寫在最后,云原生的確給我們帶來了很多便捷,但同時也對我們研發(fā)和運維人員提出了更高的要求,如何選擇更合適的云原生技術(shù)來解決日益復(fù)雜的業(yè)務(wù)問題。
參考資料
- https://github.com/cncf/landscape#trail-map。
- https://github.com/cncf/toc/blob/main/DEFINITION.md。
- https://www.bookstack.cn/read/kubernetes-handbook-201910/cloud-native.md。
??想了解更多關(guān)于開源的內(nèi)容,請訪問:??