
作者 | 孫健波(天元)
來源 | 阿里巴巴雲原生公眾號
如今,圍繞 Kubernetes 構建應用交付平台已經逐漸成為共識。
Kubernetes 生態本身的能力池固然是豐富的,但社區里並沒有一個可擴展的、方便快捷的方式,能夠幫助平台團隊把這些能力快速“組裝”成面向最終用戶的功能(Feature)。因此,盡管大家都在基於 Kubernetes 構建上層應用平台,但這些平台本質上並不能與 Kubernetes 生態完全打通,而是變成一個個的垂直“煙囪”。
有沒有方法讓平台團隊能夠在不造輪子、完全打通 Kubernetes 生態的前提下構建上層平台,從而同時保證平台的易用性和可擴展性呢?本文整理自阿里雲容器技術專家、OAM 規范主要制定者之一、KubeVela 作者和負責人孫健波(天元)在阿里雲開發者社區“周二開源日”的直播分享,將剖析當前 Kubernetes 應用交付體系存在的問題詳細介紹如何基於 OAM 和 KubeVela 體系賦能 PaaS,構建開放可擴展又易用的能力。
點擊回看完整視頻:https://developer.aliyun.com/live/246067
什么是 KubeVela
1. KubeVela 的起源
KubeVela是一個簡單易用又高度可擴展的雲原生應用管理引擎,是基於 Kubernetes 及阿里雲與微軟雲共同發布的雲原生應用開發模型 OAM 構建。
KubeVela 基於 OAM 模型構建了一套具體的實現,通過 Golang 編寫,可以端到端地為用戶構建雲原生應用的平台,提供一個相對完整的解決方案。
KubeVela 項目自 2020 年 7 月份在社區里面發起,受到包括阿里、微軟、Crossplane 等公司工程師在內的廣大社區志願者的歡迎,並一起投入到項目開發工作中。他們把在 OAM 實踐里面的各種經驗與教訓,都總結沉淀到 KubeVela 項目中。

KubeVela 在 2020 年 11 月中旬正式發布,並於發布的第 4 天登頂 Github Go 趨勢榜榜首。這個項目的魅力在於,一方面項目本身比較容易理解,因為大家剛看到 OAM 發布時,並不知道這個模型能夠做什么,但是 KubeVela 提供許多開箱即用的功能以及可以實際操作的 Demo,使得大家更容易理解 OAM 模型以及 KubeVela 應用管理的能力。另一方面是由於許多用戶在應用管理方面的訴求越來越強烈,尤其是雲原生應用管理。
2. KubeVela 的用戶

KubeVela 的用戶主要面向的是平台團隊,它為平台團隊提供了一套模型,使得平台團隊的業務用戶可以通過簡單易用的方式管理其應用。
在 KubeVela 出現之前,傳統的 K8s 平台團隊的主要職責可以理解為基於 Kubernetes 為用戶構建應用管理平台。在實際操作中,有一些平台團隊是直接向外暴露了裸 Kubernetes 的概念,但這種做法通常會帶來一些問題,最突出的就是用戶使用門檻高,不易理解。
針對這類問題,KubeVela 提供了一層統一的方式。主要包含兩類模板,一類是基於能力的模板,包含工作負載類型,例如將一些概念封裝成 Web Service,一些概念封裝成 Database。還包含運維特征,是基於這些工作負載的擴展,特征包括金絲雀發布、自動擴縮容、路由訪問等能力。
另外一類是部署環境模板。例如用戶在發布應用前要先進行測試,測試完成后進行小流量的集群灰度發布,最后再慢慢灰度到生產集群,這些不同的集群對應的能力不一樣。基於這兩個方面的模板,我們將它注冊到 CRD 注冊中心里面,構成 KubeVela的完整能力池。
對於平台團隊的業務用戶,即平台團隊服務的一些應用開發者,這類開發者聚焦業務實現,對 Kubernetes 的細節並不關心。在這樣的前提下,開發者可以首先基於我們提供的環境模板,根據自己的實際需求選擇並初始化部署環境。然后再選擇能力模板,根據應用的工作負載,填寫運維特征等參數。
最后由 KubeVela 進行組裝渲染,變成 Kubernetes 的實際資源。
可以看到,KubeVela 為這兩類用戶各自提供了一些能力,平台團隊可以直接使用 Kubernetes 的概念組裝出來一些能力的抽象,應用開發者們可以基於這些抽象構建出應用。
KubeVela 的能力
KubeVela主要有三個能力:
-
快速構建抽象
-
快速構建用戶使用界面
-
以“應用為中心”的方式統一定義和管理雲資源
下面對這三個能力的實現原理進行分析。
1. 快速構建抽象
1)抽象的類型
在之前我們提到,用戶在使用 K8s 時有一個很大的 Gap,這個 Gap 實際上是可以通過抽象來解決的。
抽象是構建雲原生應用平台的基礎,抽象本質上分為這三種類型:轉換抽象(一變一)、組合抽象(一變多)和拆分抽象(多變一),以及抽象后的狀態回流。

- 組合抽象
以一個網絡訪問的服務為例,底下由 Deployment 與 Service 組合構建而成,用戶希望拿到工作負載 WebService,這樣一個組合的抽象可以給用戶提供服務。
- 拆分抽象
當我們在灰度發布時,K8s 生態經常會出現一些像 ArgoRollout 的發布能力,這些發布能力可能有個問題,就是把所有的概念全都糅雜在一起,有時用戶在一開始使用時不關心的發布策略(如 Rollout)也在其中。“拆分抽像”的能力可以使用戶在使用時把這些概念拆開來使用,在單獨使用 Workload 部分時,應用也能正常運行,而不是說一定要填完 ArgoRollout。同時未來灰度發布時,用戶如果希望有金絲雀的發布策略,KubeVela 也能將 Workload 與 Rollout 組裝成 ArgoRollout。
- 轉換抽象
在K8s原來的概念中,有的部分用戶並不關心,如 Deployment 里的 labelSelectors。KubeVela 可以做一層轉換,就像 Knative Revision,去掉多余的參數,封裝出干凈的模型。
通過以上三種方式,KubeVela 可以為用戶提供一個簡潔易用的應用管理界面。
講到這里,可能會有人拿 KubeVela 與 Helm 做比較了,那么它們的區別是什么?Helm 大家比較熟悉,它可以把不同的 YAML 文件寫成模板,模板里面能摳出來一些 Values,然后填寫一些 Values 的信息。但是這里 Helm 有一個問題,就是組裝完后 Helm 整體會成為一個黑盒,用戶無法獲得 Helm 里整體的狀態。
舉一個例子,Helm 安裝完后,它把這些抽象的能力變成K8s原始的資源,但這些資源是否安裝成功,Helm 很難獲得感知。
同時用戶如果想做統一的能力,如要把 Rollout 抽出來的概念變成公共的功能給 WebService 與 Knative Revision 使用,這種情況在 Helm 中無法實現,包括后期做統一的監控、統一的發布管理、統一的日志管理、統一的擴縮容等,Helm 均無法實現。但是在 KubeVela 中,基於 OAM 模型提供的公共標准,就可以實現一些公共的能力。
所以說,像狀態回流和公共能力抽象是HELM無法做到的兩點,但用KubeVela可以很容易做到。
2)KubeVela 對於抽象的實現:DCL(Data Configuration Language)
大家知道,Helm 的抽象能力是基於 Go 的 template,而 KubeVela 對於抽象的實現是則基於 DCL(DataConfiguration Language)。Kubernetes 的前身是 Borg,它在谷歌大規模使用時,有一個類似於腳本的配置語言 BorgConfig,然后它對外開源的版本可以理解成一個 CUE,即 DCL。
CUE 的功能如下圖所示:

首先用戶填抽象數據,接着通過 CUE 的模板注冊在 KubeVela 的服務端,然后用戶填的數據和模板直接合並,最后生成一個完整的 K8sYAML。這種過程看起來和 Helm 的 Go template 以及 Helm 的 Values 很像,但是 CUE 有很多強大的功能,比如:
- 專注於操縱數據,而不是寫代碼
- 完全兼容 JSON
- 簡單直觀:Schema 和 Value 語法一致
之前大家在 K8s 上做一些擴展時,通常情況下要寫一個 CRD,現在有了 KubeVela 這個引擎,在多數場景下構建抽象就不需再編寫代碼了,只要注冊 CUE 配置即可使用。

以上方為例,首先定義 Workload, WorkloadDefinition 實際上就是一個模板,這個模板講的是工作負載里一個 Deployment 模板,Deployment 下面是我們構建出來的參數 Parameter,它包含兩個參數 Image 和 CMD;之后相當於把這個參數填到了 ③ 上面的工作負載中,它的類型叫 Worker,也就是 ① 里面的 Worker。
同時還有一些抽離出來的參數,就是底下的 Deployment 里面,比如 Sidecar,把它抽出來單獨使用變成一個 Trait,Trait 里面可以寫一些內容如 NAME 或 Image。如果不加 Trait,單獨使用 Worker 也是完全可以的。同時這個 Trait 也可以給到其他基於 Development 或帶有 “spec:template:spec:containers” 這種數組模式的工作負載使用。
在 KubeVela 中,用戶只要簡單填寫參數就會拿到這兩個模板,然后在 KubeVela 中做 Merge,即 Patch 的合並,最后生成 Development。
2. 快速構建用戶使用界面
1)Appfile
除了構建抽象,如何讓用戶使用也是一個非常關鍵的問題。在這里 KubeVela 給大家提供一個用戶層的視角,對於不關心 K8s 細細的業務應用研發者, KubeVela 提供了 AppFile 的概念。

如上圖所示,Appfile 里會包含鏡像的構建、鏡像如何啟動、端口是怎樣的、資源有多少等信息。同時包含了一些 Trait 的參數,例如用戶希望能夠對外的訪問提供一個域名、自動擴縮容的參數等,大家可以看到它是圍繞應用展開的,沒有一些多余的概念。同時它是一個文件,當用戶在代碼倉庫里做統一變更時,體驗效果非常好;同時它和應用環境沒有關系,可以自動適配任意 K8s 集群與部署環境,並且具有很好的擴展能力。
總結 Appfile 概念如下:
-
一個完整的應用描述文件(以應用為中心);
-
放置於應用代碼庫中(Gitops 友好);
-
$ vela up(一鍵部署);
-
無需學習 K8s 細節(完整的用戶側抽象);
-
自動適配任意 K8s 集群與部署環境(環境無關)。
2)示例:上線新功能 Metrics
具體流程如下所示。
-
平台研發團隊:
- 開發了一個新 Operator 叫做 Metrics(監控)。
- 編寫一個 K8s 能力描述文件 metrics.yaml(如下方所示)。

-
平台管理員:執行 $ kubectl apply -f metrics.yaml。
-
用戶:立刻就可以在 Appfile 中定義一個新的字段 Metrics(如下方所示);無需系統更新或重啟。

對於業務用戶來說,不需要做任何系統的更新或重啟,就可以看到這個 metrics 的能力,同時在 Appfile 里拿到擴展能力的填寫規范,輕松地用起來。
3)業務用戶使用 KubeVela 的工作流程
大致分為四個步驟:
- 首先執行 vela init 命令,回答問題生成基礎 Appfile。

- 通過 vela traits 查看平台能力,vela show metrics 查看能力細節。

- 根據能力的參數編輯 Appfile。

- 最后,通過 vela up 命令啟動應用。

4)Dashboard/Restful API 支持類似機制

如上圖所示,通過注冊 Definition 文件,Vela 會提供一個 jsonschema 的 API 包含的參數信息,這樣就可以自動生成前端。同時 Vela 里面也會有一個前端的功能,大家可以參照這個來做一些實現。
3. 統一定義和管理雲資源
1)實現原理

在管理雲資源方面,尤其是對對不同雲資源管理的統一,社區里比較流行的一個項目叫 Terraform。Terraform 有很多 Package,這些 Package 對應不同雲廠商的雲資源的驅動,即不同的雲資源都可以通過 Input一個Terraform Package,然后再填一些參數,就可以完成啟動。
KubeVela 和 Terraform 有非常好的聯動。當用戶用 workload defination 定義一個類似於 Terraform Package 之后,把相應參數填入,最后定義用戶應該填的是什么。上圖右方可以看到,根據 Terraform 定義出來的參數,業務研發人員其實還是填簡單的 Appfile,用戶體驗和剛剛基於直接 Kubernetes 抽象的體驗是一樣的。
在用戶正常使用數據庫時,可以在 configRef 里填一些配置的引用,這些引用來自 sample-db,填入后 KubeVela 會把 Terraform 的資源拉起,然后同時把獲得的資源輸出,加入 configRef 中,最后生成一個應用,如下圖所示。

2)KubeVela 架構

從整體的架構來看,最上層 KubeVela 從用戶側進來,然后是 Appfile / CLI / Dashboard 等使用界面,同時 KubeVela 給服務端的集成提供了許多能力,如用戶可以將 KubeVela 當成內核使用,然后再基於 Kubernetes 來集成。有一個 CRD 叫 Application,通過這個 CRD 可以直接對接 KubeVela 的能力,同時還會有像 RestfulAPI 這種對接方式,直接有一個 HTTP 的接口來給用戶對接。
然后到了 KubeVela 里面,分為兩種概念,一個概念就是 Workload Types,另外一個概念是 Traits,這里面其實就是 OAM 傳統應用模型的概念。
Workload 里面定義的是應用運行的一些主體,Traits 里是運維的特征及其它擴展。這些通過 CUE 配置語言,然后構建模板,對於用戶來說,在上層可以拿到使用這些使用能力的方法,包括一些文檔等。
下方是通過 CUE 把這些實際的資源翻譯出來,翻譯成 K8s 的 CRD 或原生的一些能力,然后 YourOwn 能力也是這樣注冊進去。注冊進去以后,包括一些 CRD Controller 或 CUE 的模板,最上面提供一些發現的能力,再向下就是生成實際的資源。同時 KubeVela 還會提供一些 CRD 的注冊管理、能力的管理、能力中心等功能。
Roadmap
KubeVela 1.0 即將在 2021 年 3 月中旬發布,它包含以下主體能力:
- KubeVela 的統一服務端接口Application CRD 正式發布。
- 能力注冊中心與擴展能力的包管理(包格式/安裝/版本更新/依賴/沖突發現)。
- 基於 OAM 模型的統一發布能力(金絲雀、灰度、分批、滾動升級、無人值守鈎子)。
- 用戶友好操作界面 KubeVelaDashboard,以及用於服務端對接的 Restful API。
- 集成 Helm,構建 KubeVela 應用交付鏈路,為 Helm 增加部署后的生命周期管理能力。
- 多集群、多環境的應用部署能力以及 K8s 環境無關的 APIServer。
- 更豐富的編排能力--數據傳遞與資源綁定。
以上就是本次分享的全部內容。想要了解更多 OAM 和 KubeVela 信息,請訪問 KubeVela 官網或 Github 項目地址。也歡迎大家加入 OAM 社區交流釘釘群,與更多開發和運維人員深入了解項目及其實際使用場景。
-
OAM 官網:
https://oam.dev -
KubeVela GitHub 項目地址:
https://github.com/oam-dev/kubevela -
社區交流釘群:釘釘搜索群號 23310022 即可加入交流群
“Kubernetes 與雲原生應用開源實踐大講堂”
4 場雲原生與 Kubernetes 技術前沿話題直播、70 節經典課程、3 本雲原生電子書,來“Kubernetes 與雲原生應用開源實踐大講堂”,和阿里雲容器技術專家一起,將熱門的容器開源項目和前沿的雲原生應用落地實踐一網打盡!點擊直達“Kubernetes 與雲原生應用開源實踐大講堂”!
