基于 KubeVela 与 Kubernetes 打造“无限能力”的开放 PaaS
作者 | 孫健波(天元)
來源 | 阿里巴巴云原生公眾號
如今,圍繞 Kubernetes 構(gòu)建應(yīng)用交付平臺已經(jīng)逐漸成為共識。
Kubernetes 生態(tài)本身的能力池固然是豐富的,但社區(qū)里并沒有一個可擴展的、方便快捷的方式,能夠幫助平臺團隊把這些能力快速“組裝”成面向最終用戶的功能(Feature)。因此,盡管大家都在基于 Kubernetes 構(gòu)建上層應(yīng)用平臺,但這些平臺本質(zhì)上并不能與 Kubernetes 生態(tài)完全打通,而是變成一個個的垂直“煙囪”。
有沒有方法讓平臺團隊能夠在不造輪子、完全打通 Kubernetes 生態(tài)的前提下構(gòu)建上層平臺,從而同時保證平臺的易用性和可擴展性呢?本文整理自阿里云容器技術(shù)專家、OAM 規(guī)范主要制定者之一、KubeVela 作者和負責人孫健波(天元)在阿里云開發(fā)者社區(qū)“周二開源日”的直播分享,將剖析當前 Kubernetes ?應(yīng)用交付體系存在的問題詳細介紹如何基于 OAM 和 KubeVela 體系賦能 PaaS,構(gòu)建開放可擴展又易用的能力。
點擊回看完整視頻:https://developer.aliyun.com/live/246067
什么是 KubeVela
1. KubeVela 的起源
KubeVela是一個簡單易用又高度可擴展的云原生應(yīng)用管理引擎,是基于 Kubernetes 及阿里云與微軟云共同發(fā)布的云原生應(yīng)用開發(fā)模型 OAM 構(gòu)建。
KubeVela 基于 OAM 模型構(gòu)建了一套具體的實現(xiàn),通過 Golang 編寫,可以端到端地為用戶構(gòu)建云原生應(yīng)用的平臺,提供一個相對完整的解決方案。
KubeVela 項目自 2020 年 7 月份在社區(qū)里面發(fā)起,受到包括阿里、微軟、Crossplane 等公司工程師在內(nèi)的廣大社區(qū)志愿者的歡迎,并一起投入到項目開發(fā)工作中。他們把在 OAM 實踐里面的各種經(jīng)驗與教訓,都總結(jié)沉淀到 KubeVela 項目中。
KubeVela 在 2020 年 11 月中旬正式發(fā)布,并于發(fā)布的第 4 天登頂 Github Go 趨勢榜榜首。這個項目的魅力在于,一方面項目本身比較容易理解,因為大家剛看到 OAM 發(fā)布時,并不知道這個模型能夠做什么,但是 KubeVela 提供許多開箱即用的功能以及可以實際操作的 Demo,使得大家更容易理解 OAM 模型以及 KubeVela 應(yīng)用管理的能力。另一方面是由于許多用戶在應(yīng)用管理方面的訴求越來越強烈,尤其是云原生應(yīng)用管理。
2. KubeVela 的用戶
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xS6tY94L-1614756252857)(https://ucc.alicdn.com/pic/developer-ecology/449523b6405c4751ad2608c8dc403384.jpg)]
KubeVela 的用戶主要面向的是平臺團隊,它為平臺團隊提供了一套模型,使得平臺團隊的業(yè)務(wù)用戶可以通過簡單易用的方式管理其應(yīng)用。
在 KubeVela 出現(xiàn)之前,傳統(tǒng)的 K8s 平臺團隊的主要職責可以理解為基于 Kubernetes 為用戶構(gòu)建應(yīng)用管理平臺。在實際操作中,有一些平臺團隊是直接向外暴露了裸 Kubernetes 的概念,但這種做法通常會帶來一些問題,最突出的就是用戶使用門檻高,不易理解。
針對這類問題,KubeVela 提供了一層統(tǒng)一的方式。主要包含兩類模板,一類是基于能力的模板,包含工作負載類型,例如將一些概念封裝成 Web Service,一些概念封裝成 Database。還包含運維特征,是基于這些工作負載的擴展,特征包括金絲雀發(fā)布、自動擴縮容、路由訪問等能力。
另外一類是部署環(huán)境模板。例如用戶在發(fā)布應(yīng)用前要先進行測試,測試完成后進行小流量的集群灰度發(fā)布,最后再慢慢灰度到生產(chǎn)集群,這些不同的集群對應(yīng)的能力不一樣。基于這兩個方面的模板,我們將它注冊到 CRD 注冊中心里面,構(gòu)成 KubeVela的完整能力池。
對于平臺團隊的業(yè)務(wù)用戶,即平臺團隊服務(wù)的一些應(yīng)用開發(fā)者,這類開發(fā)者聚焦業(yè)務(wù)實現(xiàn),對 Kubernetes 的細節(jié)并不關(guān)心。在這樣的前提下,開發(fā)者可以首先基于我們提供的環(huán)境模板,根據(jù)自己的實際需求選擇并初始化部署環(huán)境。然后再選擇能力模板,根據(jù)應(yīng)用的工作負載,填寫運維特征等參數(shù)。
最后由 KubeVela 進行組裝渲染,變成 Kubernetes 的實際資源。
可以看到,KubeVela 為這兩類用戶各自提供了一些能力,平臺團隊可以直接使用 Kubernetes 的概念組裝出來一些能力的抽象,應(yīng)用開發(fā)者們可以基于這些抽象構(gòu)建出應(yīng)用。
KubeVela?的能力
KubeVela主要有三個能力:
-
快速構(gòu)建抽象
-
快速構(gòu)建用戶使用界面
-
以“應(yīng)用為中心”的方式統(tǒng)一定義和管理云資源
下面對這三個能力的實現(xiàn)原理進行分析。
1. 快速構(gòu)建抽象
1)抽象的類型
在之前我們提到,用戶在使用 K8s 時有一個很大的 Gap,這個 Gap 實際上是可以通過抽象來解決的。
抽象是構(gòu)建云原生應(yīng)用平臺的基礎(chǔ),抽象本質(zhì)上分為這三種類型:轉(zhuǎn)換抽象(一變一)、組合抽象(一變多)和拆分抽象(多變一),以及抽象后的狀態(tài)回流。
- 組合抽象
以一個網(wǎng)絡(luò)訪問的服務(wù)為例,底下由 Deployment 與 Service 組合構(gòu)建而成,用戶希望拿到工作負載 WebService,這樣一個組合的抽象可以給用戶提供服務(wù)。
- 拆分抽象
當我們在灰度發(fā)布時,K8s 生態(tài)經(jīng)常會出現(xiàn)一些像 ArgoRollout 的發(fā)布能力,這些發(fā)布能力可能有個問題,就是把所有的概念全都糅雜在一起,有時用戶在一開始使用時不關(guān)心的發(fā)布策略(如 Rollout)也在其中。“拆分抽像”的能力可以使用戶在使用時把這些概念拆開來使用,在單獨使用 Workload 部分時,應(yīng)用也能正常運行,而不是說一定要填完 ArgoRollout。同時未來灰度發(fā)布時,用戶如果希望有金絲雀的發(fā)布策略,KubeVela 也能將 Workload 與 Rollout 組裝成 ArgoRollout。
- 轉(zhuǎn)換抽象
在K8s原來的概念中,有的部分用戶并不關(guān)心,如 Deployment 里的 labelSelectors。KubeVela 可以做一層轉(zhuǎn)換,就像 Knative Revision,去掉多余的參數(shù),封裝出干凈的模型。
通過以上三種方式,KubeVela 可以為用戶提供一個簡潔易用的應(yīng)用管理界面。
講到這里,可能會有人拿 KubeVela 與 Helm 做比較了,那么它們的區(qū)別是什么?Helm 大家比較熟悉,它可以把不同的 YAML 文件寫成模板,模板里面能摳出來一些 Values,然后填寫一些 Values 的信息。但是這里 Helm 有一個問題,就是組裝完后 Helm 整體會成為一個黑盒,用戶無法獲得 Helm 里整體的狀態(tài)。
舉一個例子,Helm 安裝完后,它把這些抽象的能力變成K8s原始的資源,但這些資源是否安裝成功,Helm 很難獲得感知。
同時用戶如果想做統(tǒng)一的能力,如要把 Rollout 抽出來的概念變成公共的功能給 WebService 與 Knative Revision 使用,這種情況在 Helm 中無法實現(xiàn),包括后期做統(tǒng)一的監(jiān)控、統(tǒng)一的發(fā)布管理、統(tǒng)一的日志管理、統(tǒng)一的擴縮容等,Helm 均無法實現(xiàn)。但是在 KubeVela 中,基于 OAM 模型提供的公共標準,就可以實現(xiàn)一些公共的能力。
所以說,像狀態(tài)回流和公共能力抽象是HELM無法做到的兩點,但用KubeVela可以很容易做到。
2)KubeVela 對于抽象的實現(xiàn):DCL(Data Configuration Language)
大家知道,Helm 的抽象能力是基于 Go 的 template,而 KubeVela 對于抽象的實現(xiàn)是則基于 DCL(DataConfiguration Language)。Kubernetes 的前身是 Borg,它在谷歌大規(guī)模使用時,有一個類似于腳本的配置語言 BorgConfig,然后它對外開源的版本可以理解成一個 CUE,即 DCL。
CUE 的功能如下圖所示:
首先用戶填抽象數(shù)據(jù),接著通過 CUE 的模板注冊在 KubeVela 的服務(wù)端,然后用戶填的數(shù)據(jù)和模板直接合并,最后生成一個完整的 K8sYAML。這種過程看起來和 Helm 的 Go template 以及 Helm 的 Values 很像,但是 CUE 有很多強大的功能,比如:
- 專注于操縱數(shù)據(jù),而不是寫代碼
- 完全兼容 JSON
- 簡單直觀:Schema 和 Value 語法一致
之前大家在 K8s 上做一些擴展時,通常情況下要寫一個 CRD,現(xiàn)在有了 KubeVela 這個引擎,在多數(shù)場景下構(gòu)建抽象就不需再編寫代碼了,只要注冊 CUE 配置即可使用。
以上方為例,首先定義 Workload, WorkloadDefinition 實際上就是一個模板,這個模板講的是工作負載里一個 Deployment 模板,Deployment 下面是我們構(gòu)建出來的參數(shù) Parameter,它包含兩個參數(shù) Image 和 CMD;之后相當于把這個參數(shù)填到了 ③ 上面的工作負載中,它的類型叫 Worker,也就是 ① 里面的 Worker。
同時還有一些抽離出來的參數(shù),就是底下的 Deployment 里面,比如 Sidecar,把它抽出來單獨使用變成一個 Trait,Trait 里面可以寫一些內(nèi)容如 NAME 或 Image。如果不加 Trait,單獨使用 Worker 也是完全可以的。同時這個 Trait 也可以給到其他基于 Development 或帶有 “spec:template:spec:containers” 這種數(shù)組模式的工作負載使用。
在 KubeVela 中,用戶只要簡單填寫參數(shù)就會拿到這兩個模板,然后在 KubeVela 中做 Merge,即 Patch 的合并,最后生成 Development。
2. 快速構(gòu)建用戶使用界面
1)Appfile
除了構(gòu)建抽象,如何讓用戶使用也是一個非常關(guān)鍵的問題。在這里 KubeVela 給大家提供一個用戶層的視角,對于不關(guān)心 K8s 細細的業(yè)務(wù)應(yīng)用研發(fā)者, KubeVela 提供了 AppFile 的概念。
如上圖所示,Appfile 里會包含鏡像的構(gòu)建、鏡像如何啟動、端口是怎樣的、資源有多少等信息。同時包含了一些 Trait 的參數(shù),例如用戶希望能夠?qū)ν獾脑L問提供一個域名、自動擴縮容的參數(shù)等,大家可以看到它是圍繞應(yīng)用展開的,沒有一些多余的概念。同時它是一個文件,當用戶在代碼倉庫里做統(tǒng)一變更時,體驗效果非常好;同時它和應(yīng)用環(huán)境沒有關(guān)系,可以自動適配任意 K8s 集群與部署環(huán)境,并且具有很好的擴展能力。
總結(jié) Appfile 概念如下:
-
一個完整的應(yīng)用描述文件(以應(yīng)用為中心);
-
放置于應(yīng)用代碼庫中(Gitops 友好);
-
$ vela up(一鍵部署);
-
無需學習 K8s 細節(jié)(完整的用戶側(cè)抽象);
-
自動適配任意 K8s 集群與部署環(huán)境(環(huán)境無關(guān))。
2)示例:上線新功能 Metrics
具體流程如下所示。
-
平臺研發(fā)團隊:
- 開發(fā)了一個新 Operator 叫做 Metrics(監(jiān)控)。
- 編寫一個 K8s 能力描述文件 metrics.yaml(如下方所示)。
-
平臺管理員:執(zhí)行 $ kubectl apply -f metrics.yaml。
-
用戶:立刻就可以在 Appfile 中定義一個新的字段 Metrics(如下方所示);無需系統(tǒng)更新或重啟。
對于業(yè)務(wù)用戶來說,不需要做任何系統(tǒng)的更新或重啟,就可以看到這個 metrics 的能力,同時在 Appfile 里拿到擴展能力的填寫規(guī)范,輕松地用起來。
3)業(yè)務(wù)用戶使用?KubeVela?的工作流程
大致分為四個步驟:
- 首先執(zhí)行 vela init 命令,回答問題生成基礎(chǔ) Appfile。
- 通過 vela traits 查看平臺能力,vela show metrics 查看能力細節(jié)。
- 根據(jù)能力的參數(shù)編輯 Appfile。
- 最后,通過 vela up 命令啟動應(yīng)用。
4)Dashboard/Restful API 支持類似機制
如上圖所示,通過注冊 Definition 文件,Vela 會提供一個 jsonschema 的 API 包含的參數(shù)信息,這樣就可以自動生成前端。同時 Vela 里面也會有一個前端的功能,大家可以參照這個來做一些實現(xiàn)。
3. 統(tǒng)一定義和管理云資源
1)實現(xiàn)原理
在管理云資源方面,尤其是對對不同云資源管理的統(tǒng)一,社區(qū)里比較流行的一個項目叫 Terraform。Terraform 有很多 Package,這些 Package 對應(yīng)不同云廠商的云資源的驅(qū)動,即不同的云資源都可以通過 Input一個Terraform ?Package,然后再填一些參數(shù),就可以完成啟動。
KubeVela 和 Terraform 有非常好的聯(lián)動。當用戶用 workload defination 定義一個類似于 Terraform ?Package 之后,把相應(yīng)參數(shù)填入,最后定義用戶應(yīng)該填的是什么。上圖右方可以看到,根據(jù) Terraform 定義出來的參數(shù),業(yè)務(wù)研發(fā)人員其實還是填簡單的 Appfile,用戶體驗和剛剛基于直接 Kubernetes 抽象的體驗是一樣的。
在用戶正常使用數(shù)據(jù)庫時,可以在 configRef 里填一些配置的引用,這些引用來自 sample-db,填入后 KubeVela 會把 Terraform 的資源拉起,然后同時把獲得的資源輸出,加入 configRef 中,最后生成一個應(yīng)用,如下圖所示。
2)KubeVela?架構(gòu)
從整體的架構(gòu)來看,最上層 KubeVela 從用戶側(cè)進來,然后是 Appfile / CLI / Dashboard 等使用界面,同時 KubeVela 給服務(wù)端的集成提供了許多能力,如用戶可以將 KubeVela 當成內(nèi)核使用,然后再基于 Kubernetes 來集成。有一個 CRD 叫 Application,通過這個 CRD 可以直接對接 KubeVela 的能力,同時還會有像 RestfulAPI 這種對接方式,直接有一個 HTTP 的接口來給用戶對接。
然后到了 KubeVela 里面,分為兩種概念,一個概念就是 Workload Types,另外一個概念是 Traits,這里面其實就是 OAM 傳統(tǒng)應(yīng)用模型的概念。
Workload 里面定義的是應(yīng)用運行的一些主體,Traits 里是運維的特征及其它擴展。這些通過 CUE 配置語言,然后構(gòu)建模板,對于用戶來說,在上層可以拿到使用這些使用能力的方法,包括一些文檔等。
下方是通過 CUE 把這些實際的資源翻譯出來,翻譯成 K8s 的 CRD 或原生的一些能力,然后 YourOwn 能力也是這樣注冊進去。注冊進去以后,包括一些 CRD Controller 或 CUE 的模板,最上面提供一些發(fā)現(xiàn)的能力,再向下就是生成實際的資源。同時 KubeVela 還會提供一些 CRD 的注冊管理、能力的管理、能力中心等功能。
Roadmap
KubeVela 1.0 即將在 2021 年 3 月中旬發(fā)布,它包含以下主體能力:
以上就是本次分享的全部內(nèi)容。想要了解更多 OAM 和 KubeVela 信息,請訪問 KubeVela 官網(wǎng)或 Github 項目地址。也歡迎大家加入 OAM 社區(qū)交流釘釘群,與更多開發(fā)和運維人員深入了解項目及其實際使用場景。
-
OAM 官網(wǎng):
https://oam.dev -
KubeVela GitHub 項目地址:
https://github.com/oam-dev/kubevela -
社區(qū)交流釘群:釘釘搜索群號 23310022 即可加入交流群
“Kubernetes 與云原生應(yīng)用開源實踐大講堂”
4 場云原生與 Kubernetes 技術(shù)前沿話題直播、70 節(jié)經(jīng)典課程、3 本云原生電子書,來“Kubernetes 與云原生應(yīng)用開源實踐大講堂”,和阿里云容器技術(shù)專家一起,將熱門的容器開源項目和前沿的云原生應(yīng)用落地實踐一網(wǎng)打盡!點擊直達“Kubernetes 與云原生應(yīng)用開源實踐大講堂”!
總結(jié)
以上是生活随笔為你收集整理的基于 KubeVela 与 Kubernetes 打造“无限能力”的开放 PaaS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kubernetes 稳定性保障手册 -
- 下一篇: 基于 Wasm 和 ORAS 简化扩展服