使用 Nocalhost 與 KubeVela 端云聯(lián)調(diào),一鍵完成多集群混合云環(huán)境部署
精選作者 | 霧霧、玉易才(KubeVela、Nocalhost 團隊)
在云原生快速發(fā)展的當下,如何讓云的技術(shù)賦能業(yè)務開發(fā)?在上線應用時,如何讓云的開發(fā)者在現(xiàn)代化的多集群、混合云環(huán)境中便捷地進行應用的開發(fā)和調(diào)試?在部署過程中,又該如何讓應用部署具備充分的驗證和可靠性?
這些至關(guān)重要的問題,都是我們急需解決的。
在本文中,我們將結(jié)合 KubeVela 以及 Nocalhost 開源項目,給出一個基于 Kubernetes 和容器生態(tài)的端云聯(lián)調(diào)、一鍵完成多集群混合環(huán)境部署的解決方案,來回答上述問題。
當一個新應用需要開發(fā)上線時,我們希望本地 IDE 中調(diào)試的結(jié)果能和云端最終部署的狀態(tài)保持一致。這樣一致的姿態(tài),能最大程度上給予我們部署的信心,并且讓我們可以采用類似 GitOps 這種更高效、敏捷的方式迭代應用更新。即:當新代碼被推送至代碼倉庫中后,環(huán)境中的應用會自動化地實時更新。同時,基于端云聯(lián)調(diào)的模式,可以讓這整個過程不僅敏捷高效、同樣更加穩(wěn)定可靠。
基于 KubeVela 和 Nocalhost,我們可以完成這樣一種部署過程:
如圖:通過 KubeVela 創(chuàng)建應用,將應用部署到測試環(huán)境后,暫停部署。使用 Nocalhost 在測試環(huán)境中對應用進行云端聯(lián)調(diào)。調(diào)試完畢后,將調(diào)試完畢的代碼推送到代碼倉庫,通過 KubeVela 進行 GitOps 部署,在測試環(huán)境進行驗證后,再同步更新到生產(chǎn)環(huán)境。
在本文中,我們將介紹如何使用 KubeVela 及 Nocalhost 完成上述云端應用開發(fā)及上線的全過程。
一、什么是 KubeVela
KubeVela 是一個簡單易用且高度可擴展的應用交付和管理平臺,基于 Kubernetes 與 OAM 技術(shù)構(gòu)建。其核心功能是讓開發(fā)人員方便快捷地在 Kubernetes 上定義與交付現(xiàn)代微服務應用,而無需了解任何 Kubernetes 本身相關(guān)的細節(jié)。
KubeVela 提供了 VelaUX 功能,能夠讓整個應用分發(fā)的過程可視化,使應用組裝、分發(fā)、交付的流程變得更簡單。在 UX 上,不僅可以便捷地通過頁面及時了解整個交付鏈路狀態(tài),還可以通過配置觸發(fā)器,使應用隨著制品倉庫的更新而更新。
而在本文的場景中,KubeVela 提供了以下能力:
1.完整的 GitOps 發(fā)布:
- KubeVela 同時支持了 Pull 模式以及 Push 模式的 GitOps 發(fā)布:我們只需要將更新后的代碼推送到代碼倉庫,KubeVela 就能自動基于最新代碼完成部署。在本文中,我們將使用 Push 模式的 GitOps,關(guān)于 Pull 模式的 GitOps 支持,可以查看文末文章[1]。
2.強大的工作流能力,實現(xiàn)跨環(huán)境(集群)部署、審批以及通知:
- KubeVela 借助其工作流能力,可以輕松讓應用實現(xiàn)跨環(huán)境部署,并且支持用戶在編排工作流的過程中,加入例如人工審批、消息通知等功能,使整個部署過程生產(chǎn)級可用。
3.應用抽象能力,讓開發(fā)者都能看懂使用并且自定義基礎(chǔ)設施能力
KubeVela 遵循 OAM 的開放應用模型,提供了一套簡單易用的應用抽象能力,使開發(fā)者能夠更加清晰地理解應用的功能,并且可以自定義基礎(chǔ)設施能力。例如,對于一個簡單的應用來說,我們可以將其劃分為組件,運維特征,工作流三大部分。在本文的例子中,我們的組件是一個簡單的業(yè)務應用;在運維特征部分,我們?yōu)檫@個組件綁定了一個 Nocalhost 的運維特征,讓這個組件能夠使用 Nocalhost 端云聯(lián)調(diào)的能力;在工作流部分,通過多環(huán)境管理,我們可以先讓這個組件部署在測試環(huán)境,部署完成后自動暫停工作流的發(fā)布,直至人工驗證審批通過后,再進行生產(chǎn)環(huán)境的部署。
二、什么是 Nocalhost
Nocalhost 是一個允許開發(fā)者直接在 Kubernetes 集群內(nèi)開發(fā)應用的工具。
Nocalhost 的核心功能是:提供 Nocalhost IDE 插件(包括 VSCode 和 Jetbrains 插件),將遠端的工作負載更改為開發(fā)模式。在開發(fā)模式下,容器的鏡像將被替換為包含開發(fā)工具(例如 JDK、Go、Python 環(huán)境等)的開發(fā)鏡像。當開發(fā)者在本地編寫代碼時,任何修改都會實時被同步到遠端開發(fā)容器中,應用程序會立即更新(取決于應用的熱加載機制或重新運行應用),開發(fā)容器將繼承原始工作負載所有的聲明式配置(ConfigMap、Secret、Volume、Env 等)。
Nocalhost 還提供:VSCode 和 Jetbrains IDE 一鍵 Debug 和 HotReload;在 IDE 內(nèi)直接提供開發(fā)容器的終端,獲得和本地開發(fā)一致的體驗;提供基于 Namespace 隔離的開發(fā)空間和 Mesh 開發(fā)空間 。此外,Nocalhost 還提供了 Server 端幫助企業(yè)管理 Kubernetes 應用、開發(fā)者和開發(fā)空間,方便企業(yè)統(tǒng)一管理各類開發(fā)和測試環(huán)境。
在使用 Nocalhost 開發(fā) Kubernetes 的應用過程中,免去了鏡像構(gòu)建,更新鏡像版本,等待集群調(diào)度 Pod 的過程,把編碼/測試/調(diào)試反饋循環(huán)(code/test/debug cycle)從分鐘級別降低到了秒級別,大幅提升開發(fā)效率。
三、調(diào)試云端應用
我們以一個簡單的前端應用為例,首先,我們通過 VelaUX 進行多環(huán)境部署。
關(guān)于如何開啟 KubeVela 的 VelaUX 插件,請查看文末官方文檔[2]。
1.使用 VelaUX 部署云端應用
在 VelaUX 中創(chuàng)建一個環(huán)境,每個環(huán)境中可以有多個部署目標,我們以一個包含了測試部署目標以及生產(chǎn)部署目標的環(huán)境為例。
首先,創(chuàng)建兩個部署目標,一個用于測試部署,一個用于生產(chǎn)部署。這里的部署目標會分別將資源下發(fā)到 local 集群的 test 以及 prod namespace 當中。你也可以通過 VelaUX 的集群管理功能,來添加新的集群用于部署。
創(chuàng)建完部署目標后,新建一個環(huán)境,環(huán)境中包含這兩個部署目標。
創(chuàng)建完環(huán)境后,新建應用來進行云端調(diào)試。這個前端應用會在 80 端口暴露服務,因此,我們把這個應用的 80 端口打開。
創(chuàng)建完應用后,應用會默認帶一個工作流,自動將應用部署到兩個部署目標當中。但我們并不希望未經(jīng)過調(diào)試的應用直接部署到生產(chǎn)目標中。因此,我們來編輯一下這個默認工作流:在部署到測試目標和生產(chǎn)目標中添加一個暫停步驟。這樣,我們就可以在部署到測試環(huán)境中后,暫停部署,等待用戶調(diào)試并驗證完成后,再繼續(xù)部署到生產(chǎn)環(huán)境中。
完成這些配置后,我們來為這個應用添加一個 Nocalhost 的 Trait,用于云端調(diào)試。
在這里,詳細介紹一下 Nocalhost Trait 中的幾個參數(shù):
Command 分兩種,Debug 和 Run。開發(fā)時在插件右鍵點擊 Remote Debug、Remote Run 會在遠端 Pod 中運行對應的命令,從而達到云端 Debug 的效果。在這里,我們使用的是前端應用,所以將命令設置為 yarn serve。
這里的 Image 指的是調(diào)試鏡像,Nocalhost 默認提供了五種語言的鏡像(go/java/python/ruby/node),可以通過填寫語言名來使用內(nèi)置鏡像,當然,也可以填寫完整鏡像名以使用自定義鏡像。
開啟 HotReload 意味著開啟熱加載功能,能夠在修改代碼后直接看到效果。PortForward 會將云端應用的 80 端口轉(zhuǎn)發(fā)到本地的 8080 端口。
在 Sync 部分,將 Type 設置為 sendReceive (雙向同步),或者設置為 send (單向發(fā)送)。完成配置后,部署該應用??梢钥吹剑瑧迷诓渴鸬綔y試目標之后,將自動暫停。
此時,打開 VSCode 或者 Jetbrains IDE 中的 Nocalhost 插件頁面,可以在 test namespace 下看到我們已部署的應用,點擊應用旁邊的錘子按鈕進入調(diào)試模式:
進入 Nocalhost 調(diào)試模式后,可以看到,IDE 中的終端已經(jīng)被替換成了容器的終端。通過 ls 命令,可以看到容器內(nèi)的所有文件。
此時,右鍵 Nocalhost 中的應用,可以選擇進入 Remote Debug 或者 Remote Run 模式。這兩個按鍵將自動執(zhí)行我們之前配置的 Debug 和 Run 命令。
進入 Debug 模式后,可以看到,我們的云端應用被轉(zhuǎn)發(fā)到了本地的 8080 端口:
打開本地瀏覽器,可以看到,目前我們部署的前端應用版本為 v1.0.0:
此時,我們可以在本地 IDE 中修改一下代碼,將版本修改為 v2.0.0:
在之前的 Nocalhost 配置中,我們已經(jīng)開啟了熱加載功能。因此,我們再次刷新一下本地的 8080 端口頁面,可以看到,應用版本已經(jīng)變成了 v2.0.0:
此時,我們可以終止 Nocalhost 的調(diào)試模式。將已通過調(diào)試的代碼推送至代碼倉庫中。
四、使用 GitOps 進行多環(huán)境發(fā)布
在我們結(jié)束調(diào)試后,環(huán)境上的應用依舊是之前 v1.0.0 的版本。那么,該使用什么方式來更新環(huán)境中的應用呢?
在整個云端調(diào)試的過程中,我們修改的是源代碼。因此,我們可以借助 GitOps 的模式,以代碼作為更新來源,來完成對環(huán)境中應用的更新。
查看 VelaUX 中部署的應用,可以看到,每個應用都會擁有一個默認 Trigger:
點擊 Manual Trigger 查看詳情, 可以看到,VelaUX 為每個應用提供了一個 Webhook URL,請求該地址,并帶上需要更新的字段(如:鏡像等),可以方便快捷的完成應用的更新。(注:由于需要對外暴露地址,需要在部署 VelaUX 的時候使用 LoadBalancer 或者使用其他方式暴露 VelaUX 的服務)。
在 Curl Command 里,還提供了手動 Curl 該觸發(fā)器的請求示例。我們來詳細解析一下請求體:
{
// 必填,此次觸發(fā)的更新信息
"upgrade": {
// Key 為應用的名稱
"<application-name>": {
// 需要更新的值,這里的內(nèi)容會被 Patch 更新到應用上
"image": "<image-name>"
}
},
// 可選,此次觸發(fā)攜帶的代碼信息
"codeInfo": {
"commit": "<commit-id>",
"branch": "<branch>",
"user": "<user>",
}
}
upgrade 下是本次觸發(fā)要攜帶的更新信息,在應用名下,是需要被 Patch 更新的值。默認推薦的是更新鏡像 image,也可以擴展這里的字段來更新應用的其他屬性。
codeInfo 中是代碼信息,可以選擇性地攜帶,比如提交 ID、分支、提交者等,一般這些值可以通過在 CI 系統(tǒng)中使用變量替換來指定。
當我們經(jīng)過更新后的代碼被合入代碼倉庫后,我們可以通過代碼倉庫中的 CI 配置來完成和 VelaUX Trigger 的對接。以 GitLab CI 為例,可以增加如下步驟:
webhook-request:
stage: request
before_script:
- apk add --update curl && rm -rf /var/cache/apk/*
script:
- |
curl -X POST -H "Content-Type: application/json" -d '{"upgrade":{"'"$APP_NAME"'":{"image":"'"$BUILD_IMAGE"'"}},"codeInfo":{"user":"'"$CI_COMMIT_AUTHOR"'","commit":"'"$CI_COMMIT_SHA"'","branch":"'"$CI_COMMIT_BRANCH"'"}}' $WEBHOOK_URL
配置完成后,當代碼被更新時,將自動觸發(fā)該 CI,并且更新對應 VelaUX 中的應用。
當鏡像被更新后,再次查看應用的頁面,可以看到,測試環(huán)境中的應用已經(jīng)變成了 v2.0.0 版本。
在測試部署目標中驗證完畢后,我們可以點擊應用工作流中的 Continue ,使最新版本的應用部署到生產(chǎn)部署目標中。
部署完畢后,查看生產(chǎn)環(huán)境中的應用,可以看到,生產(chǎn)環(huán)境中已經(jīng)是最新的 v2.0.0 版本:
至此,我們就通過 KubeVela 首先在測試環(huán)境中使用 Nocalhost 進行端云聯(lián)調(diào),驗證通過后,再通過更新代碼,使用 GitOps 來完成部署更新,并且繼續(xù)更新生產(chǎn)環(huán)境中的應用,從而完成了一次應用從開發(fā)到上線的完整部署流程。
五、總結(jié)
使用 KubeVela + Nocalhost,不僅能夠便捷地在開發(fā)環(huán)境中進行云端的聯(lián)調(diào)測試,還能在測試完成后一鍵更新部署到生產(chǎn)環(huán)境,使整個開發(fā)上線過程穩(wěn)定可靠。
參考鏈接:
[1] Using GitOps + KubeVela for Application Continuous Delivery
https://kubevela.io/blog/2021/10/10/kubevela-gitops
[2] 官方文檔地址:https://kubevela.io/docs/install#4-install-velaux