- 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室