云原生全景图之五:应用程序定义和开发层
作者 | Catherine Paganini、Jason Morgan
來源 | K8sMeetup
頭圖 | 下載于視覺中國
前文介紹了如何將所有應用程序組件作為整體來編排和管理(編排和管理層)。本文將介紹云原生全景圖的最上層:應用程序定義和開發層。
現在我們來到了云原生全景圖的最上層。應用程序定義和開發層,顧名思義,聚焦在幫助工程師構建應用程序并使其運行的工具上。本系列前面的文章都是關于構建可靠安全的環境以及提供所有必需的應用程序依賴,應用程序定義和開發層則是關于構建軟件。
數據庫
是什么
數據庫管理系統是一個應用程序,可幫助其他應用程序高效地存儲和檢索數據。
數據庫能保障數據存儲,僅授權的用戶能訪問數據,并且允許用戶通過專門的請求來檢索數據。盡管數據庫類型繁多,但它們的總體目標都是相同的。
解決的問題
大多數應用程序都需要有效的方式來存儲和檢索數據,并且保證數據安全。數據庫使用成熟的技術以結構化的方式進行此操作。
如何解決
數據庫提供存儲和檢索應用程序數據的通用接口。開發人員使用這些標準接口,并用一種簡單的查詢語言來存儲、查詢和檢索信息。同時,數據庫允許用戶連續備份和保存數據以及加密和管理數據訪問權限。
對應工具
我們已經了解了數據庫管理系統是一種用于存儲和檢索數據的應用程序。它使用一種通用的語言和界面,并且可以被多種語言和框架輕松使用。
常見的兩種數據庫類型為:結構化查詢語言(SQL)數據庫和 NoSQL 數據庫。應用程序該使用哪種數據庫應該由其需求來驅動。
Kubernetes 支持有狀態的應用程序,近年來使用 Kubernetes 的使用越來越廣泛,我們已經看到了利用容器化技術的新一代數據庫。這些新的云原生數據庫旨在將 Kubernetes 的擴展性和可用性優勢引入數據庫。YugaByte 和 Couchbase 之類的工具是典型的云原生數據庫,Vitess 和 TiKV 是該領域的 CNCF 項目。
注意:查看此類別時會發現以 DB 結尾的多個名稱(例如 MongoDB、CockroachDB、FaunaDB),你可能會猜測它們代表數據庫。還有以 SQL 結尾的各種名稱(例如 MySQL 或 MemSQL)。一些是已經適應了云原生環境的“老派”數據庫,還有一些是兼容 SQL 的 NoSQL 數據庫,例如 YugaByte 和 Vitess。
數據流和消息傳遞
是什么
數據流和消息傳遞工具通過在系統之間傳輸消息(即事件)來實現服務到服務的通信。單個服務連接到消息傳遞服務以發布事件和(或)從其他服務讀取消息。這種動態變化創造了一個環境,在這個環境中單個應用要么是發布者,即可編寫事件;要么是訂閱事件的訂閱者,或者更可能是兩者兼而有之。
解決的問題
隨著服務激增,應用程序環境變得越來越復雜,應用程序之間的通信編排也更具挑戰性。數據流或消息平臺提供了一個中心位置來發布和讀取系統中發生的所有事件,從而使應用程序可以一起工作,而不必相互了解。
如何解決
當一個服務執行其他服務應該知道的事情時,它會將事件“發布”到數據流或消息傳遞工具。需要了解這些事件類型的服務將訂閱并監視數據流或消息傳遞工具。這就是“發布-訂閱”的本質。
通過引入管理通信的“中間層”可以使服務彼此解耦。服務只是監視事件、采取行動并發布新事件,這樣能建立高度分離的體系結構。在此體系結構中,服務可以協作而無需彼此了解。這種解耦使工程師能夠添加新功能,而無需更新下游應用程序(消費者)或發送大量查詢。系統的解耦程度越高,更改的靈活性和適應性就越高,而這正是工程師在系統中所追求的。
對應工具
數據流和消息傳遞工具早在云原生技術成為現實之前就已經存在了。為了集中管理關鍵業務事件,組織建立了大型的企業級服務總線。但是,當我們在云原生環境中談論數據流和消息傳遞時,通常是指 NATS、RabbitMQ、Kafka 或云提供的消息隊列之類的工具。
消息傳遞和數據流傳輸系統為編排系統進行通信提供了一個中心位置。消息總線提供了所有應用程序都可以訪問的公共位置,應用程序都可以通過發布消息來告訴其服務它們在做什么,或者通過訂閱消息來查看正在發生的事情。
NATS 和 Cloudevents 項目都是這個領域的孵化項目,NATS 提供了一個成熟的消息傳遞系統,而 Cloudevents 則致力于標準化系統之間的消息格式。Strimzi,Pravega 和 Tremor 是沙盒項目,每個項目都針對數據流和消息傳遞的獨特用例進行了量身定制。
應用程序定義和鏡像構建
是什么
應用程序定義和鏡像構建是一個廣泛的類別,可以分為兩個主要的子類別:
聚焦于開發的工具:可幫助將應用程序代碼構建到容器和(或)Kubernetes 中;
聚焦于運維的工具:以標準化的方式部署應用。
無論是加快或簡化開發環境,提供標準化的方式來部署第三方應用程序,還是簡化編寫新的 Kubernetes 擴展的過程,此類別的工具都可以優化 Kubernetes 開發和運維人員的體驗。
解決的問題
Kubernetes(或者容器化環境)非常靈活且功能強大。這種靈活性也帶來了復雜性,主要體現在對于各種新用例有眾多配置選項。開發人員必須將代碼容器化,并在類生產環境中進行開發。在快速的發布計劃周期下,運維人員需要以一種標準化的方法來將應用程序部署到容器環境中。
如何解決
該領域的工具旨在解決開發或運維人員面臨的一些挑戰。對于開發者,有一些工具可以簡化擴展 Kubernetes 的過程以構建、部署和連接應用程序。許多項目和產品可以存儲或部署預打包的應用程序,使運維人員可以快速部署 Kafka 之類的流服務或安裝 Linkerd 之類的服務網格。
開發云原生應用程序帶來了一系列全新的挑戰,因此需要大量多樣化的工具來簡化應用程序的構建和部署。當你需要解決環境中的開發和運維問題時,可以看看此類別中的工具。
對應的工具
應用程序定義和構建工具涵蓋了廣泛的功能,比如使用 KubeVirt 將 Kubernetes 擴展到虛擬機,或使用 Telepresence 之類的工具將開發環境移植到 Kubernetes 中來加速應用程序開發等。從整體上講,該領域中的工具可以解決開發人員面臨的正確編寫、打包、測試或運行自定義應用程序的問題,也可以解決運維人員面臨的部署和管理應用程序的問題。
Helm 是該類別中唯一一個畢業的項目,為許多應用程序部署模式奠定了基礎。Helm 允許 Kubernetes 用戶部署和自定義一些流行的第三方應用程序,Artifact Hub(CNCF 沙箱項目)和 Bitnami 等項目已采用 Helm 來提供精選的應用程序目錄。Helm 也足夠靈活,允許用戶自定義自己的應用程序部署。
Operator Framework 是一個孵化項目,旨在簡化構建和部署 Operator 的過程。Operator 不在本文討論范圍之內,但請注意,它類似于 Helm,有助于部署和管理應用程序。Cloud Native Buildpacks 是另一個孵化項目,旨在簡化將應用程序代碼構建到容器中的過程。
持續集成和持續交付
是什么
持續集成(CI)和持續交付(CD)工具可通過嵌入式質量保證實現快速高效的開發過程。CI 通過立即構建和測試代碼來自動化代碼變更,確保生成可部署的制品。CD 則更進一步,推動該制品進入部署階段。
成熟的 CI/CD 系統會監視源代碼中的變更,自動構建和測試代碼,然后將其從開發階段轉移到生產階段。在此過程中,CI/CD 系統必須通過各種測試或驗證來決定該過程是繼續還是失敗。
解決的問題
構建和部署應用程序是一個困難重重且容易出錯的過程,特別是當過程中涉及很多人為干預和手動步驟時。如果不將代碼集成到代碼庫中,開發人員在軟件上花的時間越長,識別錯誤所花費的時間就越長,問題修復也就越困難。通過定期集成代碼,可以及早發現錯誤并更輕松地排除故障。畢竟,在幾行代碼中查找錯誤比在幾百行代碼中查找錯誤要容易得多。
盡管 Kubernetes 之類的工具為運行和管理應用程序提供了極大的靈活性,它們也為 CI/CD 工具帶來了新的挑戰和機遇。云原生 CI/CD 系統能夠利用 Kubernetes 本身來構建、運行和管理 CI/CD 流程(通常稱為流水線)。Kubernetes 還提供應用程序運行狀況的信息,從而使云原生 CI/CD 工具能夠更輕松地確定給定的變更是否成功,是否需要回滾。
如何解決
CI 工具可確保開發人員引入的任何代碼更改或更新都能自動、連續地與其他更改進行構建、驗證并集成。開發人員每次添加更新時都會觸發自動測試,確保只有良好的代碼才能將其導入系統。CD 擴展了 CI,能將 CI 流程的結果推送到類生產和生產環境中。
假設開發人員更改了 Web 應用的代碼。CI 系統會看到代碼更改,然后構建并測試該 Web 應用的新版本。CD 系統獲取該新版本,并將其部署到開發、測試、預生產以及最終生產環境中。在流程的每個步驟之后測試已部署的應用程序時,它會執行此操作。這些系統一起構成了該 Web 應用的 CI/CD 管道。
對應工具
隨著時間的流逝,市面上已經有了許多工具來幫助將代碼從存儲庫移至運行最終應用程序的生產環境。像大多數其他計算領域一樣,云原生開發的到來改變了 CI/CD 系統。類似 Jenkins (可能是市場上使用最廣泛的 CI 工具)的傳統工具已經通過完善迭代,以更好地適應 Kubernetes 生態系統。Flux 和 Argo 等公司率先開發了一種稱為 GitOps 的持續交付的新方法。
通常,該領域的項目和產品是:
CI 系統;
CD 系統;
幫助 CD 系統確定代碼是否準備好投入生產的工具;和(或)
前三者的合集(Spinnaker 和 Argo 就是如此)。
Argo 和 Brigade 是該領域中僅有的 CNCF 項目,但是你可以找到由持續交付基金會(Continuous Delivery Foundation)托管的更多項目。在此空間中尋找工具,可以幫助組織自動化生產路徑。
總結
應用程序定義和開發層中的工具使工程師能夠構建云原生應用程序。該層的工具包括:
數據庫:存儲和檢索數據;
數據流和消息傳遞工具:實現相互分離、精心設計的架構;
應用程序定義和鏡像構建工具:包含可改善開發人員和操作員體驗的多種技術;
CI/CD 工具:確保代碼處于可部署狀態,并幫助工程師及早發現錯誤,從而確保代碼質量。
總結
以上是生活随笔為你收集整理的云原生全景图之五:应用程序定义和开发层的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 老码农90%的程序员都是瞎努力!这份路线
- 下一篇: 《科学:无尽的前沿》分享会在京举办,助力