- VS Code -
打開 VScode 編輯器,然后單擊左側欄中的方塊圖標
在搜索輸入框中鍵入 nocalhost
選擇 Nocalhost 插件,然后單擊安裝按鈕進行安裝。
- JetBrains -
Nocalhost 支持 JetBrains 全系列 IDE, 請參閱
https://nocalhost.dev/zh-CN/docs/installation##install-jetbrains-plugin
當安裝 Nocalhost 插件時,會自動幫你安裝 nhctl。
Windows
'文件 > 設置 > 插件 > 瀏覽插件倉庫... > 搜索 "Nocalhost" > 安裝插件
MacOS
'首選項> 設置 > 插件 > 瀏覽插件倉庫...> 搜索"Nocalhost" > 安裝插件
需要在項目根目錄下創建.nocalhost文件夾,并在其中創建config.yaml文件。這個文件編寫好后可以傳到版本控制系統中去,整個團隊共享,易于協作, 一個項目只需要編寫一次,有一個人負責維護,其他人都可以無須知道該技術的細節,從而將精力和時間聚焦在核心業務之上。
目錄結構如下:
python項目設置
注意:使用pycharm需要使用商業版,社區版沒有remote debug server的插件,無法使用remote debug的功能
config.yaml設置如下:
configProperties: version: v2 application: name: cloud-api-server services: # name 與 serviceType 表明這是屬于 dock 這個 deployment 的配置 # 配置的內容集中在 containers 中 - name: cloud-api-server serviceType: deployment dependLabelSelector: pods: - "app.kubernetes.io/name=cloud-api-server" # 可以為單個工作負載下的多個容器分別定制不同的配置 containers: # 必須設置對應容器的名字,以區分不同的容器 # 如果有多個容器,但是只需要調試一個容器的話,只設置一個container即可 - name: cloud-api-server dev: # 開發容器配置 # 開發鏡像 # must install pydevd in dev image image: registry.***.com/***/cloud-api-server:v18.0.0 # 開發容器默認 Shell shell: "bash" # 文件同步的遠程目錄 workDir: /app/ # 開發容器資源的 request 和 limit resources: limits: cpu: "2" memory: 2Gi requests: cpu: "2" memory: 2Gi # 熱加載 hotReload: true command: # 一鍵運行 run: - /venv/bin/python - run.py - --port=11101 - --debug=true # 一鍵調試, must install pydevd in dev image debug: - /venv/bin/python - -m - pydevd - --client - 127.0.0.1 - --port - 8008 - --file - run.py # debug 協議的端口 debug: remoteDebugPort: 8008 # Ports to be forwarded to local when enter devMode # 進入 Devmode 后是否自動開啟端口轉發功能 portForward: - 11101:11101 useDevContainer: true # https://nocalhost.dev/zh-CN/docs/config/config-pattern sync: type: "send" # 一般設置send就行 mode: "pattern" # 需要同步的文件的模式 filePattern: - "." ignoreFilePattern: - ".DS_Store" - ".idea" - "logs/**" - ".git" - ".github" - ".vscode" - "bin" - "docs" - "examples" - "tests" - "venv"
通過編寫這份配置文件,來描述本地環境和遠程k8s環境的 流量,文件同步,遠程debug的通信端口的關系。nocalhost插件會通過加載該配置文件來完成所有工作
golang項目設置
configProperties: version: v2 application: name: dock services: # name 與 serviceType 表明這是屬于 dock 這個 deployment 的配置 # 配置的內容集中在 containers 中 - name: dock serviceType: deployment dependLabelSelector: pods: - "app.kubernetes.io/name=dock" # 可以為單個工作負載下的多個容器分別定制不同的配置 containers: # 必須設置對應容器的名字,以區分不同的容器 # 如果有多個容器,但是只需要調試一個容器的話,只設置一個container即可 - name: dock dev: # 開發容器配置 # 開發鏡像 image: golang:1.17 # 開發容器默認 Shell shell: "bash" # 文件同步的遠程目錄 workDir: /opt/dock-template/ # storageClass 持久化需要 storageClass 的能力來提供支持 storageClass: "csi-localpv" persistentVolumeDirs: - path: "./local-pv" # Dir to be persisted in DevContainer capacity: 1Gi # Capability of the dir # 開發容器資源的 request 和 limit resources: limits: cpu: "2" memory: 2Gi requests: cpu: "2" memory: 2Gi # 熱加載 hotReload: true command: # 一鍵運行 run: - go - run - dock-server.go # 一鍵調試 debug: - go get -d github.com/go-delve/delve/cmd/dlv && - dlv - --headless - --log - --listen - :9009 - --api-version 2 - --accept-multiclient - debug - dock-server.go # debug 協議的端口 debug: remoteDebugPort: 9009 # Ports to be forwarded to local when enter devMode # 進入 Devmode 后是否自動開啟端口轉發功能 portForward: - 8080:8080 useDevContainer: false # https://nocalhost.dev/zh-CN/docs/config/config-pattern sync: type: "send" mode: "pattern" filePattern: - "./" ignoreFilePattern: - ".DS_Store" - ".git" - ".idea" - "logs" - "dock.tar.gz" # Specify dev mode environment parameters env: - name: GOPROXY value: https://goproxy.cn # 當存在 go.mod 文件時或處于 GOPATH 外, 其行為均會等同于 GO111MODULE=on。相當于 Go 1.13 下你可以將所有的代碼倉庫均不存儲在 GOPATH 下 - name: GO111MODULE value: on
當編輯好配置后,開始進行開發之前,需要進行一次將本地代碼和遠程環境上的工作負載關聯的動作,因為nocalhost插件是在ide中跨項目共享的。意思是,你只需要配置一次遠程服務,在使用pycharm/goland打開多個repo的時候,為了避免混亂,你需要將本地的某一個確定目錄和遠程的某一個pod中的某一個確定容器進行精確關聯。從而開始打通流量和開始同步文件。
開發模式的本質是使用nhctl工具,在本地計算機和遠程環境之間建立VPN隧道和使用syncing文件同步工具建立實時同步機制。
nocalhost會將原本的pod中將要開發的容器替換為兩個容器,一個是nocalhost_dev開發容器,一個是nocalhost_sidecar容器。
nocalhost_dev容器負責來運行我們的代碼,nocalhost_sidecar來利用pod內共享存儲的機制來處理文件同步。
在沒有開啟開發模式的情況下,我們開發遠程程序還有另外一種方式,如果我們的應用本身非常簡單,沒有太多的依賴,也不依賴于k8s環境,不依賴于特定的存儲,只是在網絡層面上依賴于環境中的其他服務。
這種情況下,完全可以在本地開發,無須在本地和遠程之間建立文件同步,將程序跑在遠端的pod內。
通過運行 ProxyMode模式,nocalhost可以只幫我們在本地和遠端pod容器之間建立vpn隧道。我們直接在本地run程序或者debug程序,在遠端pod內能訪問的服務,在本地都可以訪問到。不需要寫/etc/hosts文件等操作。也無須配置環境變量。
如果你的程序依賴非常復雜,依賴了:
k8s集群
集群中其他服務
依賴了k8s集群中的存儲
或者本地環境難以搭建:
比如很多依賴無法在windows上安裝
或者本地計算機性能弱,無法在本地愉快的開發
這些問題,當然都可以解決掉,可以在本地模擬出來這些依賴,也可以想辦法安裝上該裝的依賴,但是需要付出的成本很大。
nocalhost提供的方案則非常簡單,通過實時同步本地文件直接將本地程序run在遠端環境中。并且可以直接通過插件執行,和ide原生的run體驗類似。如果是Telepresence則需要編寫非常長的命令來執行。
07
遠程debug
注意:使用pycharm需要使用商業版,社區版沒有remote debug server的插件,無法使用remote debug的功能
原理
python通過pydevd在pod中啟動應用進程,除了應用本身會listen多個port。
同時會在pod的nocalhost_dev容器上的127.0.0.1上bind一個remote debug的端口,該端口是config.yaml中定義的 remoteDebugPort。
由于本地和遠程pod之間已經建立了vpn隧道通信,此時remoteDebugPort端口上的流量會被route到本地計算機的remoteDebugPort端口之上,至此本地和遠端進程的remote debug通信建立,我們可以在就可以在本地ide中debug運行在pod中的進程了。
和在本地開發沒有任何區別,并且此時并不是我們在本地模擬了應用運行所需要的資源,而是該進程本就運行在真實的環境中,沒有任何區別。
python
官方的示例配置是:
但這個例子使用了Flask框架來做演示,并且命令是錯誤的。對于python程序,常見的IDE,比如Jetbrains pycharm,vs code,pydev 等,都是使用pydevd的庫來做debug的,而且pydevd支持remote debug。
因此我們需要一個和框架無關,可以remote debug所有python程序的命令。因此更通用的debug配置應該是:
pydevd --client 127.0.0.1 --port 8008 --file run.py
注意:
config.yaml中配置的開發鏡像中應提前安裝pydevd依賴,才可以在debug參數中直接配置pydevd的命令,否則就需要將debug的值配置為:
pip install pydevd && pydevd --client 127.0.0.1 --port 8008 --file run.py
golang
golang使用了dlv來debug進程,goland本身也是使用該工具。因此通過預先在開發容器中安裝dlv工具或者在debug時候立即安裝,都可以來使用該工具。
golang項目的remote debug的指令是:
dlv --headless --log --listen :9009 --api-version 2 --accept-multiclient debug app.go
Q:如何設置開發鏡像?
A:首先解釋下開發鏡像,開發鏡像是nocalhost在替換原始容器時候的我們指定的容器,nocalhost官方本身已經提供了很多開發容器,這些容器中都內置了很多調試工具和參數,比如pydevd和dlv。
nocalhost-docker.pkg.coding.net/nocalhost/dev-images/node:latest nocalhost-docker.pkg.coding.net/nocalhost/dev-images/node:14 nocalhost-docker.pkg.coding.net/nocalhost/dev-images/golang:latest nocalhost-docker.pkg.coding.net/nocalhost/dev-images/golang:1.16 nocalhost-docker.pkg.coding.net/nocalhost/dev-images/python:latest nocalhost-docker.pkg.coding.net/nocalhost/dev-images/python:3.9 nocalhost-docker.pkg.coding.net/nocalhost/dev-images/java:latest nocalhost-docker.pkg.coding.net/nocalhost/dev-images/java:11 nocalhost-docker.pkg.coding.net/nocalhost/dev-images/ruby:latest nocalhost-docker.pkg.coding.net/nocalhost/dev-images/ruby:3.0
針對node,python,java,ruby這些語言的項目,一般以來包非常的大,特別是node的依賴,體積和數量較為夸張,建議在開發鏡像中預置依賴,減少初次初始化開發環境同步文件的時間。一般可以使用當前代碼倉庫分支的最新/較新鏡像作為開發鏡像,一般來講依賴比較并不是很頻繁。
針對golang的項目,依賴一般量比較小,或者在線安裝也比較快,開發鏡像可以使用官方原始鏡像,通過在run/debug指令中實時安裝的方式來安裝依賴。可以避免頻繁改動開發鏡像
Q:熱加載的作用是?如何開啟?
A:熱加載:在 IDE 中對源代碼文件的修改將實時同步到遠端容器中,同時你配置的 Run/Debug 命令將會被重新執行。
開啟方法:
參考
https://nocalhost.dev/zh-CN/docs/reference/nh-config
服務電話: 400-678-1800 (周??周五 09:00-18:00)
商務合作: 0571-87770835
市場反饋: marketing@woqutech.com
地址: 杭州市濱江區濱安路1190號智匯中?A座1101室