雖然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下https://nocalhost.dev/docs/config/config-dev-container-en/#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)后,會實時把本地的源碼同步到遠端容器中,免去了提交,構建,推送鏡像等循環,提升了開發效率。





