雖然Visual studio 、Visual studio code 都支援debug甚至遠端debug ,Dapr 搭配Bridge to Kubernetes 支援在計算機上除錯 Dapr 應用程式,同時仍然讓它們與 Kubernetes 叢集上執行的服務和應用程式進行互動。 但是在除錯過程中,難免修改配置、新增除錯資訊、修改程式碼並驗證,這樣就需要提交程式碼,重新編譯、部署以驗證功能是否符合預期,這樣就拉長時間線,拉低了開發效率。一個系統可能還好點,如何專案A呼叫B、B又呼叫C,想要除錯C,本地除錯的話就需要配置3套環境,分別執行3個專案,流程線可想而知。
今天要給大家介紹一款神奇nocalhost, Nocalhost 是一款騰訊雲Coding團隊 開源的基於 IDE 的雲原生應用開發工具,下面是摘抄自他的文件介紹,https://nocalhost.dev/zh-CN/docs/introduction/:
- 直接在 Kubernetes 叢集中構建、測試和除錯應用程式
- 提供易於使用的 IDE 外掛(支援 VS Code 和 JetBrains),即使在 Kubernetes 叢集中進行開發和除錯,Nocalhost 也能保持和本地開發一樣的開發體驗
- 使用即時檔案同步進行開發: 即時將您的程式碼更改同步到遠端容器,而無需重建映象或重新啟動容器。
使用Nocalhost直接在k8s中進行開發,有如下幾點優勢:
- 生產環境相似 - 開發環境與你的生產環境非常相似,讓你更有信心在釋出新功能時一切都像在生產環境中一樣工作。
- 更改即時生效 - 通過檔案同步,對程式碼的所有更改都可以在容器中立即生效,而無需重建映象或重新部署容器,從而提升開發效率,特別是可以藉助於dotnet的熱過載hot reload技術在雲原生場景下搞笑開發。
- 靈活的擴充套件性 - 開發人員無需再擔心本地資源不足。
- 降低成本 - 更有效地使用資源並降低 IT 設施成本,特別是很多公司都是虛擬化的場景下,本地的windows 機器不支援docker,使用者無需在本地電腦配置開發、除錯、測試環境,可以直接使用遠端的雲原生開發環境進行開發 。
- 方便除錯 - Nocalhost支援遠端debug,可以方便地在本地計算機上覆現線上的問題。
- 減少本地配置 - 由於線上、測試環境已經部署過,Nocalhost使用這些現成的資源,不需再在本地安裝資料庫、redis等進行配置,也不必擔心本地資源的限制,從而可以更愉快地本地開發,遠端k8s部署並除錯。
Nocalhost 由單個二進位制 CLI 和 IDE 外掛組成,可以直接與IDE 一起配合除錯程式。 Nocalhost 不需要伺服器端元件,因為它通過 KubeConfig 直接與 Kubernetes 叢集通訊,就像 kubectl 一樣。
Nocalhost遠端除錯過程,主要分為Start DevMode啟動除錯模式、Associate Local DIR關聯本地目錄、設定斷點、Remote Debug遠端除錯、本地請求介面、檢視斷點處資訊等過程。
Visual Studio code 安裝nocalhost 外掛,在檢視-擴充套件的搜尋框中,搜尋nocalhost,點選安裝,即可進行快速安裝Nocalhost外掛。預設安裝在C:\Users\xxx\.nh\目錄下,生成的kubeConfigs也會在這個目錄下。
進行nocalhost remote debug之前,還需要設定nocalhost的config配置資訊,目前還不支援dotnet 的除錯 。
在Visual studio code 的左側有個nocalhost,點選Nocalhost,會以目錄樹的形式展示所有的k8s叢集,找到相關k8s的namespace,點對應的專案,然後點Workloads工作負載 → Deployments部署,看到對應的pod。滑鼠右鍵點Start DevMode,等待啟動除錯模式。
首先要連線k8s叢集:connect to cluster
然後編輯這個服務的Dev Config: 點選這個,進行一些簡單的設定。(這裡配置很方便的,會選擇用瀏覽器開啟,進行修改,後複製修改的內容到這個檔案即可),如下圖:
將修改的內容複製到那個配置的yml中儲存,可以直接用上面那個Apply 按鈕完成拷貝,這裡要特別指出的是對於Dapr sidecar的 配置一定要放在Patches下:
name: catalog
serviceType: deployment
containers:
- name: catalog-api
dev:
gitUrl: ""
image: mcr.microsoft.com/dotnet/sdk:6.0-bullseye-slim
shell: ""
workDir: ""
storageClass: ""
resources:
limits:
memory: 4Gi
cpu: "2"
requests:
memory: 2Gi
cpu: "2"
persistentVolumeDirs: []
command:
run:
- dotnet
- dev-certs
- https
- --trust;
- dotnet
- run
- --urls=http://*:80
- --project
- ./src/Services/Catalog/Catalog.API/Catalog.API.csproj
debug:
- dotnet
- dev-certs
- https
- --trust;
- dotnet
- watch
- run
- --urls=http://*:80
- --project
- ./src/Services/Catalog/Catalog.API/Catalog.API.csproj
debug:
remoteDebugPort: 0
language: ruby
hotReload: false
sync: null
env:
- name: DOTNET_RUNNING_IN_CONTAINER
value: "true"
- name: DOTNET_VERSION
value: 6.0.0
- name: ASPNET_VERSION
value: 6.0.0
- name: ASPNETCORE_URLS
value: http://+:80
- name: PATH
value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
portForward:
- 8080:80
patches:
- patch: '{"spec":{"template":{"metadata":{"annotations":{"dapr.io/app-id":
"catalog-api", "dapr.io/app-port": "80", "dapr.io/enabled": "true",
"dapr.io/config": "dapr-config","dapr.io/log-as-json": "true" }}}}}'
type: strategic
(這裡有一個映象地址,可以填寫我們作為nocalhost的開發映象,因為最終還是你本地的程式碼部署到遠端的容器中,那這個映象地址其實不是多麼重要,填一個存在的即可),最好是nocalhost 官方有支援的,他們的映象倉庫的dockerfile地址在這裡 https://github.com/nocalhost/dev-container ,我做了一個dotnet 6的dockerfile。
使用Nocalhost之前,要先啟動開發模式。成功進去開發模式後,會自動在DE中開啟一個終端,這就是Nocalhost為我們建立好的容器了。順利的話,你應該能在該容器的/home/nocalhost-dev目錄下看到你的原始碼。這裡中間應該會選擇一個目錄,就是關聯你本地服務的程式碼的目錄就好了;
通過patch 拉起Dapr sidecar,不過由於進入開發模式的例項裡面並沒有執行 業務服務的程式碼,只是把Nocalhost的除錯程式碼的容器啟動,我們可以通過Remote run來執行在run 所定義的命令來拉起業務服務,這樣dapr 就可以正常啟動了,具體過程可以看我提的一個issuehttps://github.com/nocalhost/nocalhost/issues/1306:
在本地修改一行程式碼,就會實時的在遠端容器中生效了,從程式碼修改,到遠端容器中生效的過程很快,可能都不到1秒,如果不使用nocalhots,那起碼都是幾分鐘起步的,流程很複雜,Nocalhost 是使用了原始碼啟動程式,實時熱載入技術,當進入開發模式(Dev Model)後,會實時把本地的原始碼同步到遠端容器中,免去了提交,構建,推送映象等迴圈,提升了開發效率。