在我們團(tuán)隊將產(chǎn)品的部署形態(tài)遷移到kubernetes上之后,在研發(fā)過程中,開發(fā)和聯(lián)調(diào)代碼的過程非常的痛苦,決定尋找在k8s環(huán)境下的云原生時代的打通本地和開發(fā)環(huán)境的解決方案。
回顧一下,過去的開發(fā)過程,我們的進(jìn)程一共有2種模式,即k8s無關(guān)進(jìn)程和依賴了k8s的進(jìn)程。
- k8s無關(guān)進(jìn)程 -
由于項目依賴了oracle連接庫,安裝oracle驅(qū)動,在團(tuán)隊中既有window,unbuntu,和mac的情況下,團(tuán)隊成員的本地開發(fā)環(huán)境的搭建非常復(fù)雜
進(jìn)程依賴的環(huán)境變量非常多,如果開發(fā)環(huán)境的ip換掉,配置環(huán)境變量非常麻煩
進(jìn)程內(nèi)依賴了一些二進(jìn)制bin文件,格式是ELF的,這些文件在windows和mac的環(huán)境上是無法執(zhí)行的
- 依賴了k8s的進(jìn)程 -
需要復(fù)制開發(fā)環(huán)境上kubeconfig文件到本地,一個人如果同時開發(fā)多個環(huán)境,切換kubeconfig文件非常繁瑣
本地開發(fā)無法將開發(fā)環(huán)境上的流量導(dǎo)到本地,需要打包替換環(huán)境上鏡像來完成聯(lián)調(diào)
因此日常的開發(fā)流程便是:
配置環(huán)境變量和kubeconfig
使用postman等其他工具進(jìn)行本地開發(fā)
提交代碼、跑 CI 流程,出鏡像
替換環(huán)境上鏡像
自測
顯然,為了保證在本地開發(fā)的代碼,在環(huán)境上真實運(yùn)行的效果完全一致,帶來了很大的工作效率問題,本地編碼2分鐘,上環(huán)境自測5分鐘
因此我們急需一種便捷的,學(xué)習(xí)成本低的,基于配置的,一勞永逸的,團(tuán)隊統(tǒng)一的解決方案來打通本地和開發(fā)環(huán)境,節(jié)省本地開發(fā)環(huán)境的搭建和配置的時間,節(jié)省團(tuán)隊成員聯(lián)調(diào)的時間,提高團(tuán)隊效率
Telepresence
參考
https://docs.microsoft.com/zh-cn/visualstudio/bridge/overview-bridge-to-kubernetes?view=vs-2022
介紹
Telepresence是一款為Kubernetes微服務(wù)框架提供快速本地化開發(fā)功能的開源軟件。Telepresence在Kubernetes集群中運(yùn)行的Pod中部署雙向網(wǎng)絡(luò)代理,該P(yáng)od將Kubernetes環(huán)境(如TCP連接,環(huán)境變量,卷)中的數(shù)據(jù)代理到本地進(jìn)程。本地進(jìn)程透明地覆蓋其網(wǎng)絡(luò),以便DNS調(diào)用和TCP連接通過代理路由到遠(yuǎn)程Kubernetes集群,能夠獲取
特性
基于在本地計算機(jī)使用docker,fuse/sshfs 和流量轉(zhuǎn)發(fā)技術(shù),來將本地和遠(yuǎn)程之間的流量和文件系統(tǒng)打通,以在本地使用ide進(jìn)行調(diào)試
本地訪問遠(yuǎn)端的服務(wù), 跨namespace
本地服務(wù)可以完全訪問遠(yuǎn)程群集中的其他服務(wù);
本地服務(wù)可以完全訪問Kubernetes的環(huán)境變量,Secrets和ConfigMap
K8S中運(yùn)行的遠(yuǎn)程服務(wù)也可以完全訪問本地服務(wù)
通過在本地使用docker來運(yùn)行本地代碼,并和遠(yuǎn)程k8s服務(wù)通信,本支行承擔(dān)了類似kubelet的角色
缺陷
不支持ide插件
不能將本地代碼同步到遠(yuǎn)端進(jìn)行調(diào)試
沒有做隔離,進(jìn)入調(diào)試模式后,服務(wù)的可用性取決于本地服務(wù)
只能使用命令操作,操作不能配置化,操作繁瑣
Bridge to kubernetes
參考
https://docs.microsoft.com/zh-cn/visualstudio/bridge/overview-bridge-to-kubernetes?view=vs-2022
介紹
Bridge to Kubernetes 可重定向已連接的 Kubernetes 群集與開發(fā)計算機(jī)之間的流量。Kubernetes 群集中的本地代碼和服務(wù)可以像在同一 Kubernetes 群集中一樣進(jìn)行通信。
Bridge to Kubernetes插件只可用于Visual Studio和VS Code,支持其他ide的計劃還在官方的RoadMap上沒有開始
工作原理
提示你在群集上配置要替換的服務(wù),在開發(fā)計算機(jī)上配置用于代碼的端口,并將代碼的啟動任務(wù)配置為一次性操作。
將群集上 pod 中的容器替換為遠(yuǎn)程代理容器,它會將流量重定向到開發(fā)計算機(jī)。
在開發(fā)計算機(jī)上運(yùn)行 kubectl port-forward,將流量從開發(fā)計算機(jī)轉(zhuǎn)發(fā)到群集中運(yùn)行的遠(yuǎn)程代理。
使用遠(yuǎn)程代理從群集收集環(huán)境信息。此環(huán)境信息包括環(huán)境變量、可見服務(wù)、卷裝載和機(jī)密裝載。
在 Visual Studio 中設(shè)置環(huán)境,以便開發(fā)計算機(jī)上的服務(wù)可以訪問相同變量,就像它在該群集上運(yùn)行一樣。
更新 主機(jī)文件 ,將群集上的服務(wù)映射到開發(fā)計算機(jī)上的本地 IP 地址。 這些主機(jī) 文件條目允許開發(fā)計算機(jī)上運(yùn)行的代碼向群集中運(yùn)行的其他服務(wù)請求。若要更新 主機(jī)文件 ,Bridge to Kubernetes計算機(jī)上需要管理員訪問權(quán)限。
開始在開發(fā)計算機(jī)上運(yùn)行和調(diào)試代碼。如有必要,Bridge to Kubernetes停止當(dāng)前使用這些端口的服務(wù)或進(jìn)程,以釋放開發(fā)計算機(jī)上所需的端口。
特性
打通本地和遠(yuǎn)程k8s環(huán)境的流量
將環(huán)境信息包括環(huán)境變量、service、volume,secret,configmap克隆到本地
通過自動修改/etc/hosts文件,將集群上的服務(wù)映射到開發(fā)計算機(jī)上的本地 IP 地址
缺陷
Bridge to Kubernetes 具有以下限制:
要使 Bridge to Kubernetes 成功連接,一個 pod 只能有一個容器在該 pod 中運(yùn)行,但是現(xiàn)實中有很多多容器的pod。
目前,Bridge to Kubernetes pod 必須是 Linux 容器。Windows容器。
如果k8s環(huán)境是集群環(huán)境,若要更新 /etc/hosts 文件 ,Bridge to Kubernetes計算機(jī)上需要管理員訪問權(quán)限
Nocalhost
參考
https://nocalhost.dev/zh-CN/docs/introduction
介紹
Nocalhost 是一款開源的基于 IDE 的云原生應(yīng)用開發(fā)工具:
直接在 Kubernetes 集群中構(gòu)建、測試和調(diào)試應(yīng)用程序
提供易于使用的 IDE 插件(支持 VS Code 和 JetBrains),即使在 Kubernetes 集群中進(jìn)行開發(fā)和調(diào)試,Nocalhost 也能保持和本地開發(fā)一樣的開發(fā)體驗
使用即時文件同步進(jìn)行開發(fā): 即時將您的代碼更改同步到遠(yuǎn)端容器,而無需重建鏡像或重新啟動容器。
Nocalhost 的野心相比 Bridge to Kubernetes 和 Telepresence 更大,具有開發(fā)環(huán)境的管理體系。深度整合 vscode / IntelliJ IDEA 實現(xiàn)了一鍵部署上云,一鍵遠(yuǎn)程 debug 等式開發(fā)的貼心功能。
其設(shè)計的核心就是自動同步:
自動同步和熱加載代碼
文件
終端
Nocalhost 目前是完全開源的,并已進(jìn)入 CNCF Landscape:
支持goland, idea,pycharm, vscode
工作原理
Nocalhost 由單個二進(jìn)制 CLI 和 IDE 插件組成。理想情況下,您可以直接將它與您熟悉的 IDE 一起使用。
Nocalhost 不需要服務(wù)器端組件,因為它通過 KubeConfig 直接與您的 Kubernetes 集群通信,就像 kubectl 一樣。
特性
- 實時線上編碼 -
Nocalhost 預(yù)配置為與你喜歡的 IDE 配合使用,你可以一鍵連接到任何 Kubernetes 集群,開始享受在集群內(nèi)進(jìn)行編碼,擺脫煩人的本地環(huán)境配置。
- 實時同步 -
Nocalhost 可以在你每次進(jìn)行修改時自動將代碼同步到 K8s 容器中。這樣能免去了鏡像提交、構(gòu)建和推送等步驟,極大提速了開發(fā)的反饋循環(huán)。因此代碼修改可以實現(xiàn)秒級生效。
- 易于協(xié)作 -
Nocalhost 可幫助你的團(tuán)隊實現(xiàn)標(biāo)準(zhǔn)化開發(fā)工作流程,而無需讓團(tuán)隊中的每個人都成為 Kubernetes 專家。
團(tuán)隊中的 Kubernetes 和 DevOps 專家可以通過 Nocalhost Server 配置和管理集群、應(yīng)用程序、DevSpace 和用戶。閱讀有關(guān) Nocalhost Server 的更多信息
開發(fā)人員無需成為 Kubernetes 專家,即可輕松查看項目并即時在 Kubernetes 集群中開始編碼和調(diào)試。
使用方式
Nocalhost 由單個二進(jìn)制 CLI 和 IDE 插件組成。理想情況下,您可以直接將它與您熟悉的 IDE 一起使用。
為什么使用Nocalhost?
構(gòu)建 Kubernetes 應(yīng)用并不簡單,尤其對于大型開發(fā)團(tuán)隊來說更具挑戰(zhàn)。Nocalhost 提供了最高效的方式來構(gòu)建云原生應(yīng)用程序。
使用 Nocalhost 直接在 Kubernetes 中進(jìn)行開發(fā)的優(yōu)勢有:
生產(chǎn)環(huán)境相似性 - 開發(fā)環(huán)境與你的生產(chǎn)環(huán)境非常相似,讓你更有信心在發(fā)布新功能時一切都將在生產(chǎn)環(huán)境中正常工作。
提速反饋循環(huán) - 通過文件同步,你所有代碼更改可以在容器中立即生效,而無需重建鏡像或重新部署容器。
靈活的擴(kuò)展性 - 開發(fā)人員無需再擔(dān)心本地資源不足。
降低成本 - 更有效地使用資源并降低 IT 設(shè)施成本。
在下述環(huán)境里,在 Kubernetes 集群中進(jìn)行開發(fā)很有用:
本地資源的限制
由于環(huán)境的特殊性,在本地?zé)o法搭建能夠運(yùn)行的環(huán)境
想要在類似生產(chǎn)環(huán)境中測試你的應(yīng)用
想要調(diào)試在本地計算機(jī)上難以重現(xiàn)的問題
應(yīng)用程序需要訪問集群內(nèi)部服務(wù) (例如集群 DNS)
對比PK
三者比較來看Nocalhost是特性最多,支持的場景最多,支持IDE的插件最多,并且用戶體驗最好。完勝其他兩位,是其他兩個工具支持特性的超集,因此我們選擇了Nocalhost,讓基于云原生的開發(fā)更高效。
服務(wù)電話: 400-678-1800 (周??周五 09:00-18:00)
商務(wù)合作: 0571-87770835
市場反饋: marketing@woqutech.com
地址: 杭州市濱江區(qū)濱安路1190號智匯中?A座1101室