破解Kubernetes應用開發困局
如果您的開發環境是Minikube或自建/雲K8s叢集,開發的物件是微服務應用,自定義Controller或Operator,並且正在面臨編碼/除錯/測試迴圈慢的問題。透過本文,您將收穫如何藉助開源工具實現在Kubernetes環境下更加高效的開發迴圈反饋,以及解密開源工具Nocalhost的全新用法和核心原理。
▲騰訊雲CODING高階架構師 王煒
嘉賓介紹:王煒,騰訊雲CODING DevOps高階架構師。CNCF大使,曾任騰訊雲大學、騰訊雲原生技術開放日、騰訊Live開發者大會、Techo開發者大會、QECon等大會講師,中國電子技術標準化研究院木蘭開源社群導師。主導 Nocalhost——雲原生開發工具:,並著有《Spinnaker 實戰:雲原生多雲環境的持續部署方案》。
以下是王煒老師在SACC2022大會的演講實錄:
一、K8s環境下的開發困局
對於傳統的開發過程來說,大部分開發處於一個單體應用的架構。隨著單體應用越來越複雜,很多團隊會發現,單體應用已經不能很好地嵌合公司的業務發展需要,也不能很好地在公司現有組織架構的責任劃分中承擔迭代作用。
此時,越來越來的公司會把單體應用選擇拆分為微服務。由微服務組成的應用之後,微服務之間的執行以及它所需要的環境有很大的差異。微服務可能由不同的團隊負責研發,團隊裡面採用的語言是多樣性的。
微服務依賴、打包、執行、遷移越來越難,Docker提供映象打包的解決方案。容器越來越多,服務編排、發現、穩定性監控、自愈等成為新的挑戰。Kubernetes提供容器編排的解決方案。
在運維方面,開發難、概念繁多,宣告式定義學習成本高;除錯難,無法像本地一樣除錯,開發效率低。完全面向運維提供能力,對開發增加了巨大的負擔。雲原生環境下的學習成本,招聘成本,用人成本急劇上升。
雲原生開發技能廣度要求急劇提升,傳統應用後端需要具備Java、SpringBoot、Redis、Nginx、Mysql等技能。雲原生應用後端需要具備Java、SpringCloud、Docker、Prometheus、Redis、Nginx、Mysql、etcd、gRPC、Fluentd等技能。
這張圖是CNCF基金會的雲原生全景圖,裡面有數百個專案。其中的技術棧是非常複雜的,每家公司用的技術棧都不太一樣,所以對於開發同學來講,不僅開發和除錯變得很難,而且需要學習的東西也變得非常多。
在基於K8s環境下去做開發的時候,第一,開發同學缺少背景知識。第二,K8s和容器本身給他帶來一些開發和除錯的問題。這就導致一個普通的開發同學在雲原生的環境下,做開發是極其困難的。
除此之外,CNCF官方在雲原生開發工具方面,提供一些專案來解決我們的開發問題。對於開發環節,CNCF官方以及社群仍然缺少標準化的實踐。總而言之,雲原生開發工具依然缺失,目前社群沒有非常好的解決方案。
二、主流的雲原生開發方式
關於主流的雲原生開發方式,可以分為四個過程:全手工流程,業務應用採用了K8s,本地編碼之後,手動構建映象,並且推送到映象倉庫,修改工作負載映象版本,等待K8s重新排程;自動化CI/CD流程,編碼後,推送到程式碼倉庫,自動觸發CI/CD流程,等待生效。
Minikube+Telepresence,Minikube拉起本地K8s開發環境,Telepresence實現本地編碼。雲環境+Telepresence,雲上K8s叢集提供計算資源解決彈效能的問題,Telepresence本地編碼。
本地環境和容器、工作負載宣告有很大的差異,導致業務原始碼很難在本地執行。
一是環境差異,工作負載宣告瞭 env、configmap、secret、volume 等,很難在本地複製出 完全一致的環境。 二是跨平臺差異,即便是能夠將遠端的env、configmap掛載到本地,也難以遮蔽跨平臺之間的差異。三是網路限制,全量代理的方式會使得網路拓撲產生變化,導致內網、公網訪問無法達到預期。
三、熱載入原理
如何實現容器熱載入?從Dockerfile說起,Dockerfile CMD或ENTRYPOINT定義容器啟動命令,只需要執行自己編譯的二進位制檔案,對應容器PID=1的程式。如果將二進位制檔案替換為原始碼執行的方式,那麼就實現了容器的熱載入。
事實上,實現容器熱載入還缺少三個基本的條件:1、原始碼從哪來?2、Golang Runtime從哪來?3、PID=1的程式替換成原始碼執行,如果程式停止,容器將Crash,怎麼阻止?
對此,從本地同步到容器;將業務容器的映象替換為Runtime映象;替換PID=1 程式為阻塞程式:/bin/sh -c tail -f /dev/null。
四、開發和除錯演示
根據Nocalhost使用角色來分類的話,對於基礎設施團隊來講,可以採用Server端,高度集中管理開發環境、開發者、應用、開發叢集等開發資源,實現開發者間環境隔離。使用前提是已定義“應用”,具備重部能力,例如Manifest、Helm、 Kustomize。
對於開發者來講,直接提供的能力是IDE外掛,在開發過程無需重新構建映象,本地編碼實時生效,縮短開發-除錯-測試的迴圈反饋,提高開發和除錯效率。使用前提是叢集內已有工作負載即可進行開發。
管理人員的訴求是統一管理微服務應用包,降低應用的維護成本;統一管理開發環境和叢集,提高叢集資源的利用率,同時具備隔離特性;為新員工快速分配開發環境,分配環境後立刻能進行應用開發;彈性的開發環境資源,用完銷燬、降低開發成本。
Nocalhost Server隔離開發環境,並且統一管理開發資源。為開發建立基於NS隔離的開發環境,開發者可使用管理員預定義的應用隨時拉起開發環境。統一管理開發者、叢集、開發環境、應用,配合IDE外掛使用。
IDE外掛支援VSCode和Jetbrains全系列外掛,支援兩種開發方式,具備容器熱載入和一鍵Debug功能。本地編碼實時生效,無需重新構建映象。便捷的一鍵除錯功能和一鍵Run,遮蔽新人使用複雜度。
替換容器映象為開發映象,提供語言編譯和執行環境。繼承configmap、env、volume掛載等配置,這是原始碼在容器裡執行的核心基礎。此外,替換容器PID=1的程式為阻塞程式,防止容器Crash。增加檔案同步的Sidecar,實現本地和容器原始碼同步。在IDE內自動獲取遠端容器Terminal,方便啟停程式。
在開發環境的使用過程中,有一個常見的差異是很多團隊會共用開發環境的概念,來管理自己的開發環境。在這種模式下,不適合直接替換掉某一個Service,將它進入開發模式裡,因為這會破壞開發環境,影響到其他人的開發。
那麼,對於共用開發環境的用法,Nocalhost提供Duplicate開發模式,又稱為複製開發模式。它不會直接替換掉Service,而是會先複製一個出來。
在隔離開發環境,也就是說開發環境是個人獨享的。這種情況下就可以用Replace開發模式,直接替換某個工作負載,這是最簡單的一個方式,可以實現所見即所得的開發體驗。
五、開源共建
目前,Nocalhost已經在Github上面全部開源,包括外掛端和Server端,且免費使用,有大概1100個Star左右。最近,我們把Nocalhost捐贈給CNCF,成為CNCF的SANDBOX專案。所以,Nocalhost是一個公共的專案,不會有廠商繫結的問題,以及長時間不維護的問題。
六、規劃
Nocalhost整個產品裡面會做一些長遠的規劃。比如說,VCluster虛擬叢集、開發空間休眠、虛擬隔離開發空間。社群有一種技術叫做VCluster,可以基於父親K8s叢集虛擬出n個子K8s叢集。
對於非工作時間,Nocalhost可以實現開發空間自動進行休眠,直接把工作負載的副本數縮為零,從而讓它不佔用你的計算資源。虛擬隔離開發環境,可以將其理解為Service Mesh開發環境的增強。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545813/viewspace-2916315/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CRM快速開發平臺:破解管理困局
- Epinio:Kubernetes 的應用程式開發引擎
- Google釋出VS Code,支援Kubernetes應用開發Go
- Kubernetes 實戰——發現應用(Service)
- Kubernetes(二) 應用部署
- 使用Spring Boot開發基於Kubernetes的Zeebe工作流應用 – SalaboySpring Boot
- 2020技術展望:企業如何破解技術衝突困局
- 1.1.4 應用開發
- 開發Web應用Web
- 用vscode開發vue應用VSCodeVue
- 破解Oracle應用整合難題RWOracle
- 自動化測試在 Kubernetes Operator 開發中的應用:以 OpenTelemetry 為例
- RabbitMQ的開發應用MQ
- Taro開發多端應用
- 用VS Code開發Vue應用Vue
- SpringCloud 應用在 Kubernetes 上的最佳實踐 —— 開發篇SpringGCCloud
- Kubernetes 多叢集在開源專案 KubeSphere 的應用
- 2020遊戲發行大困局遊戲
- 使用Taro開發鴻蒙原生應用——快速上手,鴻蒙應用開發指南鴻蒙
- 使用 Taro 開發鴻蒙原生應用 —— 快速上手,鴻蒙應用開發指南鴻蒙
- 用低程式碼開發平臺開發應用可靠嗎
- 使用 Cert Manager 為 Kubernetes 應用自動簽發 HTTPS 證書HTTP
- Kubernetes client-go實戰應用clientGo
- kubernetes部署第一個應用案例
- kubernetes執行應用1之Deployment
- Kubernetes 實戰——升級應用(Deployment)
- Kubernetes 實戰——配置應用(ConfigMap、Secret)
- [譯] 在 Kubernetes 之上架構應用架構
- openGauss-應用開發介面
- HarmonyOS應用開發——Hello World
- elasticsearch的開發應用(3)Elasticsearch
- 快應用開發入門
- 開發Android系統應用Android
- JavaFX: IntelliJ 開發 Window 應用JavaIntelliJ
- 使用 Flutter 加速應用開發Flutter
- vue + electron 開發桌面應用Vue
- Android應用開發進階Android
- 《反應式應用開發》之“什麼是反應式應用”