Dapr 遠端除錯之 Nocalhost

張善友發表於2022-04-21

雖然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 也能保持和本地開發一樣的開發體驗
  • 使用即時檔案同步進行開發: 即時將您的程式碼更改同步到遠端容器,而無需重建映象或重新啟動容器。
Dapr 遠端除錯之 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也會在這個目錄下。

image

image

進行nocalhost remote debug之前,還需要設定nocalhost的config配置資訊,目前還不支援dotnet 的除錯 。

在Visual studio code 的左側有個nocalhost,點選Nocalhost,會以目錄樹的形式展示所有的k8s叢集,找到相關k8s的namespace,點對應的專案,然後點Workloads工作負載 → Deployments部署,看到對應的pod。滑鼠右鍵點Start DevMode,等待啟動除錯模式。

首先要連線k8s叢集:connect to cluster

image

然後編輯這個服務的Dev Config: 點選這個,進行一些簡單的設定。(這裡配置很方便的,會選擇用瀏覽器開啟,進行修改,後複製修改的內容到這個檔案即可),如下圖:

image

將修改的內容複製到那個配置的yml中儲存,可以直接用上面那個Apply 按鈕完成拷貝,這裡要特別指出的是對於Dapr sidecar的 配置一定要放在Patches下:

image

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

4b447a806007bbc1ebf1d6a650324f2

在本地修改一行程式碼,就會實時的在遠端容器中生效了,從程式碼修改,到遠端容器中生效的過程很快,可能都不到1秒,如果不使用nocalhots,那起碼都是幾分鐘起步的,流程很複雜,Nocalhost 是使用了原始碼啟動程式,實時熱載入技術,當進入開發模式(Dev Model)後,會實時把本地的原始碼同步到遠端容器中,免去了提交,構建,推送映象等迴圈,提升了開發效率。

相關文章