Dapr 遠程調試之 Nocalhost


雖然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也會在這個目錄下。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM