破解Kubernetes應用開發困局

網路通訊頻道發表於2022-09-27

如果您的開發環境是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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章