天天看點

深入解讀:KubeVela 與 PaaS 有何不同?為什麼說 KubeVela 不是 PaaS?KubeVela 整體架構與能力可插拔機制總結

深入解讀:KubeVela 與 PaaS 有何不同?為什麼說 KubeVela 不是 PaaS?KubeVela 整體架構與能力可插拔機制總結

作者 | 鄧洪超  阿裡雲進階技術專家

來源|

阿裡巴巴雲原生公衆号

在 KubeVela 項目釋出以後,很多國内外的社群同學們都會問到一個類似的問題:KubeVela 的體驗真的非常棒,可以說是 Kubernetes 上的 Heroku 了。這麼看來, KubeVela 跟 Heroku 這樣的 PaaS 産品到底是不是一類項目呢?

今天,我們就專門來聊一個這個話題:KubeVela 與 PaaS 有何不同?

備注:本文所提到的 PaaS,既包括 Heroku 這樣的經典 PaaS 産品,也包括各種各樣的基于 Kubernetes 的“雲原生” PaaS。它們雖然底層實作不同,但是對使用者提供的使用接口和體驗是相似的。但 OpenShift 是一個例外,作為一個比 Kubernetes 本身還複雜的項目,OpenShift 不屬于本文所讨論的簡單易用、面向使用者的 PaaS 之列,而是一個道地的 Kubernetes 發行版。

首先,我們先說結論:KubeVela 能夠為使用者帶來非常接近 PaaS 的體驗,但 KubeVela 并不是 PaaS。

為什麼說 KubeVela 不是 PaaS?

大多數 PaaS 都能提供完整的應用生命周期管理功能,同時也非常關注提供簡單友好的使用者體驗,以及對研發效能的提升。在這些點上,KubeVela 跟 PaaS 的目标和提供的使用者體驗,是高度一緻的。但如果你去研究 KubeVela 的實作細節,就不難發現 KubeVela 的整體設計與實作其實與各類 PaaS 項目的差别是非常大的。如果從使用者視角來看,這些差別則會直接反應在整個項目的“可擴充性”上。

進一步來說,PaaS 的使用者體驗雖好,但卻往往是不可擴充的。我們可以直接拿比較新的 Kubernetes PaaS,比如 Rancher Rio 項目來看。這個項目提供了很好的應用部署體驗,比如 Rio run 來讓你快速部署一個容器化應用、自動配置設定域名和通路規則等等。但是,如果我們想讓 Rio 支援更多的能力以滿足不同的使用者訴求呢?

比如:

  • 能否幫助我運作一個 定時任務?
  • 能不能幫我運作一個 OpenKruise 的 CloneSet 工作負載?
  • 能不能幫我運作一個 MySQL Operator?
  • 能不能根據我的自定義 metrics 來做水準擴容?
  • 能不能基于 Flagger 和 Istio來幫我做漸進式灰階釋出?
  • 能不能 ……

而這裡的關鍵點在于,上述這些能力在 Kubernetes 生态中都是非常常見的的能力,有的甚至是 Kubernetes 内置就可以支援。可是到了 PaaS 這裡,要支援上述任何一個能力,都必須對 PaaS 進行一輪開發,而且由于先前的一些假設和設計,甚至很可能需要大規模的重構。

舉個例子,我有一個 PaaS 系統,它所有的應用都是通過 Deployment 來執行的,那麼這個 PaaS 的釋出、擴容等功能,也都會直接按照 Deployment 來進行實作。而現在,使用者提出了原地更新的訴求,需要讓這個 PaaS 再支援 CloneSet,那整套系統很可能就得掀翻重來。再到運維能力這一側,這個問題會更加嚴重,比如現在這個 PaaS 支援的是藍綠釋出政策,那麼它跟流量管理、監控系統等依賴之間,都是需要大量互動和內建的。而現在我們要讓 PaaS 支援一個新的政策叫做“金絲雀”釋出,那麼所有的這些互動和執行邏輯基本全得重重構一遍,工作量是巨大的。

當然,并不是所有的 PaaS 都完全沒有可擴充性。工程能力比較強的 PaaS,比如 Cloud Foundry 和 Heroku,它們都提供了自己的插件能力和插件中心,在確定平台本身的使用者體驗和能力的可控制性的前提下開放一定的插件能力,比如允許使用者接入自己的資料庫,或者開發一些簡單的 Feature 進去。但這種插件機制無論怎麼做,說白了隻能是這個 PaaS 專屬的封閉小生态能力。而在雲原生時代,我們開源社群已經有了 Kubernetes 生态這樣一個近乎“無限”的能力池,在這個能力池面前,任何 PaaS 專屬的小生态都顯得太蒼白無力了。 

上述問題,我們可以統稱為 PaaS 的“能力困境”。

深入解讀:KubeVela 與 PaaS 有何不同?為什麼說 KubeVela 不是 PaaS?KubeVela 整體架構與能力可插拔機制總結

相比之下,KubeVela 的目标從一開始就是利用整個 Kubernetes 生态作為自己的“插件中心”,并且“有意”把它的每一個内置能力都設計成獨立的、可插拔的插件。這種高度可擴充的模型,背後其實有着精密的設計與實作。比如,KubeVela 如何確定某個完全獨立的 Trait 一定能夠綁定于某種 Workload Type?如何檢查這些互相獨立的 Trait 間是否存在沖突?這些挑戰正是 Open Application Model(OAM)作為 KubeVela 模型層的起到的關鍵作用,一言以蔽之:OAM 是一個高度可擴充的應用定義與能力裝配模型。

而且,大家設計和制作任何 Workload Type 和 Trait 的定義檔案,隻要存放在 GitHub 上,全世界任何一個 KubeVela 使用者就都可以在自己的 Appfile 裡使用這些能力。具體的方式,請參考 $ vela cap (即:插件能力管理指令)的

使用文檔

是以說,KubeVela 提倡的是一種面向未來的雲原生平台架構,這種架構認為:

  • 應用平台本身架構徹底子產品化,其所有的能力都是可插拔的,而平台核心架構通過模型層提供标準化的能力封裝與裝配流程。
  • 該流程能夠無縫接入雲原生生态中的任何應用管理能力,使得平台工程師完全專注于能力本身的研發和基于該模型的能力封裝過程,使平台團隊在為使用者帶來簡單易用的平台層抽象的同時,快速、靈活地響應使用者千變萬化的應用管理訴求。

KubeVela 整體架構與能力可插拔機制

KubeVela 整體架構如下圖所示:

深入解讀:KubeVela 與 PaaS 有何不同?為什麼說 KubeVela 不是 PaaS?KubeVela 整體架構與能力可插拔機制總結

在架構上,KubeVela 隻有一個 controller 并且以插件的方式運作在 Kubernetes 之上,為 Kubernetes 帶來了面向應用層的抽象,以及以此為基礎的面向使用者的使用界面,即Appfile。Appfile 乃至 KubeVela 運作機制背後的核心,則是其能力管理模型 Open Application Model (OAM) 。基于這個模型,KubeVela 為系統管理者提供了一套基于注冊與自發現的能力裝配流程,來接入 Kubernetes 生态中的任意能力到 KubeVela 中,進而以“一套核心架構搭配不同能力”的方式,适配各種使用場景(比如 AI PaaS,資料庫 PaaS 等等)。

具體操作上,作為系統管理者或者平台開發者,上述能力裝配流程允許他們把任意的 Kubernetes API 資源(含 CRD)以及對應的 Controller  作為“能力”一鍵注冊到 KubeVela 中,然後通過 CUE 模闆語言将這些能力封裝成使用者可用的抽象(即成為 Appfile 中的一部分)。

接下來,我們就來 Demo 一下如何将 kubewatch 這個社群中的告警機制直接插入到 KubeVela 中作為一個告警 Trait 來使用:

Step 1:将平台能力注冊為 OAM 對象

首先,你需要确定 CRD 所表示的能力是對應一個 Workload Type 還是 Trait?這裡的差別在于 Workload Type 指的是如何運作你的代碼。而 Trait 指的是如何運維、管理或者操作已經運作起來的代碼執行個體。

而 KubeWatch 作為一種告警機制,自然作為 Trait 來使用的。這時候,我們就可以通過寫一個 TraitDefinition yaml 來将它注冊:

深入解讀:KubeVela 與 PaaS 有何不同?為什麼說 KubeVela 不是 PaaS?KubeVela 整體架構與能力可插拔機制總結

KubeVela 内置的伺服器端 Runtime 會識别監聽的 TraitDefinition 注冊事件,然後将該能力納入平台管理中。

這一步完成,KubeVela 就已經注冊完畢在 KubeVela 平台中可用了。但接下來我們還需要将它暴露給使用者使用,是以需要定義這個能力對外的使用接口。

Step 2:編寫 CUE template 來封裝對外暴露接口

實際上,大多數社群能力雖然很強大,但對于最終使用者來都比較複雜,學習和上手非常困難。是以在 KubeVela 中,它允許平台管理者對能力做進一步封裝以便對使用者暴露簡單易用的使用接口,在絕大多數場景下,這些使用接口往往隻有幾個參數就足夠了。在能力封裝這一步,KubeVela 選擇了 CUE 模闆語言,來連接配接使用者界面和後端能力對象,并且天然就支援完全動态的模闆綁定(即變更模闆不需要重新開機或者重新部署系統)。下面就是 KubeWatch Trait 的模闆例子:

深入解讀:KubeVela 與 PaaS 有何不同?為什麼說 KubeVela 不是 PaaS?KubeVela 整體架構與能力可插拔機制總結

将這個模闆放到 Definition 檔案中并 $ kubectl apply -f 到 Kubernetes 中,KubeVela 就會自動識别和處理相關輸入。這時候,使用者就可以直接在 Appfile 中聲明使用剛加進來的能力了,比如發送告警資訊到指定的 Slack channel:

深入解讀:KubeVela 與 PaaS 有何不同?為什麼說 KubeVela 不是 PaaS?KubeVela 整體架構與能力可插拔機制總結

可以看到,這個 kubewatch 的配置是我們通過三方擴充進來的一個新的能力,通過 KubeVela 平台管理 Kubernetes 擴充能力就是這麼簡單快速。有了 KubeVela,平台開發人員就可以簡單快速地在 Kubernetes 上搭建起一個 PaaS,且能夠将任何一個 Kubernetes 能力快速封裝成面向最終使用者的上層抽象。

以上示例,僅僅是 KubeVela 可擴充性的“冰山一角”。在後續的文章中,我們會繼續詳細介紹 KubeVela 能力裝配流程中更多的細節問題,比如:

  • 如何定義能力之間的沖突關系與協作關系?
  • 如何快速的定義 CUE 模闆檔案?
  • 如何基于 CUE 語言定義出功能強大的“能力子產品”,然後把這些子產品安裝到 KubeVela 中?
  • 等等 ……

總結

原生的可擴充性與能力裝配機制,是 KubeVela 與大多數 PaaS 項目的根本性不同,這也導緻 KubeVela 背後的實作和模型跟它們相比也有着本質性的差異。是以說,KubeVela 的核心目标,乃是在為使用者帶來簡單易用的應用管理體驗的同時,為平台管理者提供完全 Kubernetes 原生的可擴充性與靈活度。

KubeVela 項目是 OAM 社群的官方項目,由來自阿裡、微軟多位雲原生社群資深成員共同維護,同時也是阿裡雲 EDAS 服務和内部多個雙十一級應用管理平台背後的核心元件。KubeVela 旨在建構一個面向未來的雲原生 PaaS 架構,将橫向可擴充性和以應用為中心這些最佳實踐帶給大家,推動甚至引領雲原生社群在應用層的發展。

想要了解更多?歡迎前往

官方網站

上學習更多示例:

作者簡介

鄧洪超  阿裡雲進階技術專家, 人稱 “Kubernetes Operator 第二人”,OAM 與 KubeVela 項目核心維護者。