有關(guān)云可移植性的三個(gè)考量:一. 云原生和容器?
市面上的云服務(wù)平臺(tái)豐富各異,如何選擇最適合自己的?這往往需要慎重考慮。然而更重要的是,您考慮過(guò)云的可移植性問(wèn)題嗎?您在今年根據(jù)具體需求選擇的云平臺(tái),能否滿足以后的需求?如果不能滿足,是否可以方便快捷地將應(yīng)用移植到其他平臺(tái)去?
延伸閱讀,了解 Akamai cloud-computing
出海云服務(wù),選擇Akamai cloud-computing!
在這一系列文章中,我們將從架構(gòu)、設(shè)計(jì)等不同方面來(lái)探討,在云的可移植性方面,具體都需要考慮哪些細(xì)節(jié)問(wèn)題,如何最大限度避免云時(shí)代的技術(shù)鎖定,充分發(fā)揮云的靈活性優(yōu)勢(shì)。
下文將簡(jiǎn)要探討云原生和容器技術(shù)。
在云時(shí)代,諸如容器和無(wú)服務(wù)器計(jì)算這樣的云原生技術(shù)是構(gòu)建高可移植性應(yīng)用程序時(shí)不可或缺的。在這些技術(shù)的幫助下,我們可以設(shè)計(jì)出更具彈性和擴(kuò)展性,同時(shí)適應(yīng)性也更強(qiáng)的應(yīng)用程序,從而適應(yīng)不斷變化的環(huán)境。實(shí)際上,我們可以用一個(gè)詞來(lái)解釋所有這些好處:可移植性。
與日漸繁瑣并且?guī)缀鯚o(wú)法管理的單體(Monolithic)模型不同,云原生微服務(wù)架構(gòu)是模塊化(Modular)的。這種方法使得我們可以自由地為工作選擇適合的工具,用一個(gè)服務(wù)來(lái)執(zhí)行一種特定功能,通過(guò)“專精”獲得更好的效果。云原生方法就是在這種情況下開(kāi)始大放異彩的,它提供了一種有效的流程,方便我們更新和替換應(yīng)用程序中的單個(gè)組件,而不會(huì)對(duì)整個(gè)工作負(fù)載產(chǎn)生影響。使用云原生思維進(jìn)行開(kāi)發(fā),這會(huì)催生出一種聲明性(Declarative)的部署方法:分別部署應(yīng)用程序、為其提供支撐的軟件棧,以及配套的系統(tǒng)配置。
為何使用容器?
我們可以把容器想像成一種專為執(zhí)行某一種特定任務(wù)而設(shè)計(jì)的超輕量級(jí)虛擬機(jī)。容器的壽命往往很短暫,前一分鐘可能還在運(yùn)行,下一分鐘就消失了,因此缺乏持久性。實(shí)際上,所需的持久性是通過(guò)綁定主機(jī)文件系統(tǒng)中的塊存儲(chǔ)或所掛載的其他存儲(chǔ)服務(wù)來(lái)實(shí)現(xiàn)的,并非通過(guò)與容器本身的綁定來(lái)實(shí)現(xiàn)。
通過(guò)對(duì)應(yīng)用程序進(jìn)行容器化改造,即可使其具備可移植性!只需準(zhǔn)備好一個(gè)容器鏡像,就能將其部署到不同架構(gòu)CPU上運(yùn)行的不同操作系統(tǒng)中,并順序運(yùn)行該容器。由于容器化應(yīng)用程序是一種自包含(Self-contained)的獨(dú)立單元,其中包括了所有必須的依賴項(xiàng)、庫(kù)以及配置文件,因此在不同云環(huán)境中運(yùn)行時(shí)完全無(wú)需更改代碼。
簡(jiǎn)單來(lái)說(shuō),在云原生設(shè)計(jì)中,容器是通過(guò)下列方式實(shí)現(xiàn)可移植性的:
- 輕量級(jí)虛擬化:容器為應(yīng)用程序的運(yùn)行提供了一種隔離的環(huán)境,雖然共享主機(jī)操作系統(tǒng)內(nèi)核,但會(huì)對(duì)進(jìn)程、文件系統(tǒng)以及網(wǎng)絡(luò)資源進(jìn)行隔離。
- 可移植且一致:容器將應(yīng)用程序及其依賴項(xiàng)打包在一起,確保無(wú)論在開(kāi)發(fā)還是生產(chǎn)環(huán)境中,應(yīng)用程序都可以一致地運(yùn)行。
- 資源效率:容器比虛擬機(jī)消耗的資源更少,因?yàn)槿萜鲿?huì)隔離進(jìn)程并共享主機(jī)操作系統(tǒng)的內(nèi)核;同時(shí)容器不需要在主機(jī)操作系統(tǒng)之上運(yùn)行一個(gè)單獨(dú)的“來(lái)賓”操作系統(tǒng),這進(jìn)一步降低了開(kāi)銷。
- 快速啟動(dòng)和部署:容器啟動(dòng)速度飛快,因?yàn)樗⒉恍枰龑?dǎo)完整的操作系統(tǒng),因此容器成了快速部署、擴(kuò)展和恢復(fù)等場(chǎng)景中的理想選擇。
- 不可變的基礎(chǔ)架構(gòu):容器在設(shè)計(jì)上是不可變(Immutable)的,這意味著容器在構(gòu)建完成之后就不會(huì)再產(chǎn)生任何變化,這種特性簡(jiǎn)化了容器的部署、版本控制和回滾流程,同時(shí)還有助于確保在不同環(huán)境中實(shí)現(xiàn)一致的行為。
何時(shí)應(yīng)當(dāng)考慮使用容器?
容器可以幫助我們維持一致性,同時(shí)有助于省略開(kāi)發(fā)過(guò)程中的某些暫存和投產(chǎn)環(huán)節(jié),例如Verbose調(diào)試輸出。開(kāi)發(fā)過(guò)程中所發(fā)布的代碼將在整個(gè)測(cè)試和部署周期中保持完整。
容器在資源的使用方面非常高效,并且本身就非常輕巧。雖然上文提到容器類似于虛擬機(jī),但容器一般只有數(shù)十MB大小,不像虛擬機(jī)那么龐大(往往有數(shù)GB大小,雖然也有更小的,但資源浪費(fèi)情況更嚴(yán)重)。容器越輕巧,啟動(dòng)速度就越快,從而越容易在動(dòng)態(tài)的云計(jì)算環(huán)境中實(shí)現(xiàn)彈性和高性能的橫向擴(kuò)展。容器在設(shè)計(jì)上還是不可變的。如果有什么東西需要變更,我們并不需要將變更嵌入到容器中,此時(shí)只需要銷毀舊容器,創(chuàng)建新容器就行了。
除此之外,在決定是否將容器作為云原生模型的一部分時(shí),還需要注意下列因素:
- 提高部署的一致性:容器會(huì)將應(yīng)用程序及其依賴項(xiàng)打包在一起,確保在不同環(huán)境中運(yùn)行時(shí)產(chǎn)生一致的行為,這還有助于簡(jiǎn)化部署過(guò)程,降低與配置相關(guān)問(wèn)題所造成的風(fēng)險(xiǎn)。
- 增強(qiáng)可擴(kuò)展性:容器可通過(guò)快速啟動(dòng)新實(shí)例來(lái)應(yīng)對(duì)激增的需求,借此幫助應(yīng)用程序?qū)崿F(xiàn)快速擴(kuò)展,同時(shí)還可優(yōu)化資源使用,改善系統(tǒng)整體性能。
- 經(jīng)濟(jì)高效的資源利用率:容器的資源用量遠(yuǎn)少于傳統(tǒng)虛擬機(jī),企業(yè)可以在相同硬件上運(yùn)行更多實(shí)例,從而節(jié)約云基礎(chǔ)設(shè)施的成本。
- 為開(kāi)發(fā)和測(cè)試周期提速:容器促進(jìn)了開(kāi)發(fā)、測(cè)試和生產(chǎn)環(huán)境之間的無(wú)縫過(guò)渡,簡(jiǎn)化了開(kāi)發(fā)過(guò)程,加快了新功能和Bug修復(fù)的發(fā)布速度。
- 簡(jiǎn)化應(yīng)用程序管理:容器編排平臺(tái)負(fù)責(zé)管理容器化應(yīng)用程序的部署、擴(kuò)展和維護(hù),可自動(dòng)實(shí)現(xiàn)大部分運(yùn)維任務(wù),降低IT團(tuán)隊(duì)的負(fù)擔(dān)。
有關(guān)容器的最佳實(shí)踐
運(yùn)行容器的方法有很多,這些方法都是可以互操作的。例如,在從其他公有云平臺(tái)遷移時(shí),只需將自己的容器鏡像重新部署到新環(huán)境即可,借此即可快速遷移工作負(fù)載。此外,我們還可以使用不同的工具和引擎來(lái)運(yùn)行容器。這些方式有著不同的資源利用率和價(jià)格點(diǎn)。如果通過(guò)Linode(Akamai的云計(jì)算服務(wù))進(jìn)行托管,用戶可以使用Linode Kubernetes Engine(LKE)運(yùn)行自己的容器,或者也可以通過(guò)虛擬機(jī)來(lái)運(yùn)行Podman、HashiCorp Nomad、Docker Swarm以及Compose。
這些符合開(kāi)放標(biāo)準(zhǔn)的工具可以幫助大家快速完成開(kāi)發(fā)和測(cè)試工作,并且在使用LKE這樣的服務(wù)時(shí),還可以通過(guò)簡(jiǎn)化管理為用戶帶來(lái)更多附加值。Kubernetes會(huì)成為用戶的控制平面。用戶可將其視作一個(gè)控制臺(tái),通過(guò)上面的各種按鈕和旋鈕控制自己的容器,并使用各種基于開(kāi)放標(biāo)準(zhǔn)的工具。此外,如果決定使用各種特定平臺(tái)原生的產(chǎn)品,例如AWS Elastic Container Service (ECS),則需要為不同類型的利用率付費(fèi)。
容器的另一個(gè)重點(diǎn)在于需要理解該用什么來(lái)存儲(chǔ)和訪問(wèn)自己的容器鏡像(這個(gè)東西也被稱為容器注冊(cè)表)。通常我們會(huì)建議使用Harbor。作為一個(gè)CNCF項(xiàng)目,Harbor可以幫助我們運(yùn)行專用的容器注冊(cè)表,從而控制相關(guān)的安全設(shè)置。
請(qǐng)始終記得進(jìn)行測(cè)試,并準(zhǔn)備好足夠深入的回歸測(cè)試套件,以確保自己的代碼符合最高的性能和安全性要求。容器還應(yīng)該具備失敗計(jì)劃。如果一個(gè)容器失敗,此時(shí)的重試機(jī)制應(yīng)該是怎樣的?該如何重新啟動(dòng)?這會(huì)產(chǎn)生怎樣的影響?應(yīng)用程序又該如何恢復(fù)?有狀態(tài)數(shù)據(jù)是否持久保留在映射卷或已綁定的掛載卷上?
在云原生開(kāi)發(fā)模型中使用容器時(shí),還需要注意下列最佳實(shí)踐:
- 使用輕量級(jí)基礎(chǔ)鏡像:從輕量級(jí)基礎(chǔ)鏡像(例如Alpine Linux或BusyBox)著手,這有助于減小容器的整體大小并最大限度減小攻擊面。
- 使用容器編排工具:使用容器編排工具(例如Kubernetes、HashiCorp Nomad、Docker Swarm或Apache Mesos)來(lái)跨越多臺(tái)主機(jī)管理和擴(kuò)展容器。
- 使用容器注冊(cè)表:使用容器注冊(cè)表(例如Docker Hub、GitHub Packages registry、GitLab Container registry、Harbor等)來(lái)存儲(chǔ)和訪問(wèn)容器鏡像。這有助于跨越多臺(tái)主機(jī)和計(jì)算環(huán)境共享和部署容器鏡像。
- 限制容器特權(quán):限制容器所獲的的特權(quán),只為容器提供完成預(yù)期目的所必須的特權(quán)。盡可能部署無(wú)Root容器,從而降低容器遭到破壞被濫用后所造成的風(fēng)險(xiǎn)。
- 實(shí)施資源約束:針對(duì)CPU和內(nèi)存等資源設(shè)置限制約束,防止容器使用太多資源并影響到系統(tǒng)整體性能。
- 確保容器處于最新?tīng)顟B(tài):通過(guò)最新安全補(bǔ)丁和更新讓容器鏡像始終處于最新?tīng)顟B(tài),最大限度降低漏洞所造成的風(fēng)險(xiǎn)。
- 充分測(cè)試容器:在部署到生產(chǎn)環(huán)境前,確保容器能夠按照預(yù)期工作且不包含漏洞。使用CI管道在每個(gè)階段進(jìn)行自動(dòng)化測(cè)試,從而減少人為錯(cuò)誤。
- 為容器實(shí)施備份和恢復(fù)機(jī)制:為容器訪問(wèn)的持久數(shù)據(jù)實(shí)施備份和恢復(fù)策略,以確保在出現(xiàn)故障或?yàn)?zāi)難后,工作負(fù)載依然可以快速恢復(fù)。
這篇文章的內(nèi)容感覺(jué)還行吧?有沒(méi)有想要立即在 Linode 平臺(tái)上親自嘗試一下?別忘了,現(xiàn)在注冊(cè)可以免費(fèi)獲得價(jià)值 100 美元的使用額度,快點(diǎn)自己動(dòng)手體驗(yàn)本文介紹的功能和服務(wù)吧↓↓↓
歡迎關(guān)注Akamai ,第一時(shí)間了解高可用的MySQL/MariaDB參考架構(gòu),以及豐富的應(yīng)用程序示例