01 Nocalhost安装
- 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" > 安装插件

02 编写配置
需要在项目根目录下创建.nocalhost文件夹,并在其中创建config.yaml文件。这个文件编写好后可以传到版本控制系统中去,整个团队共享,易于协作, 一个项目只需要编写一次,有一个人负责维护,其他人都可以无须知道该技术的细节,从而将精力和时间聚焦在核心业务之上。
目录结构如下:

python项目设置
注意:使用pycharm需要使用商业版,社区版没有remote debug server的插件,无法使用remote debug的功能
config.yaml设置如下:
configProperties:version: v2application:name: cloud-api-serverservices:# name 与 serviceType 表明这是属于 dock 这个 deployment 的配置# 配置的内容集中在 containers 中- name: cloud-api-serverserviceType: deploymentdependLabelSelector:pods:- "app.kubernetes.io/name=cloud-api-server"# 可以为单个工作负载下的多个容器分别定制不同的配置containers:# 必须设置对应容器的名字,以区分不同的容器# 如果有多个容器,但是只需要调试一个容器的话,只设置一个container即可- name: cloud-api-serverdev:# 开发容器配置# 开发镜像# must install pydevd in dev imageimage: registry.***.com/***/cloud-api-server:v18.0.0# 开发容器默认 Shellshell: "bash"# 文件同步的远程目录workDir: /app/# 开发容器资源的 request 和 limitresources:limits:cpu: "2"memory: 2Girequests:cpu: "2"memory: 2Gi# 热加载hotReload: truecommand:# 一键运行run:- /venv/bin/python- run.py- --port=11101- --debug=true# 一键调试, must install pydevd in dev imagedebug:- /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:11101useDevContainer: true# https://nocalhost.dev/zh-CN/docs/config/config-patternsync: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: v2application:name: dockservices:# name 与 serviceType 表明这是属于 dock 这个 deployment 的配置# 配置的内容集中在 containers 中- name: dockserviceType: deploymentdependLabelSelector:pods:- "app.kubernetes.io/name=dock"# 可以为单个工作负载下的多个容器分别定制不同的配置containers:# 必须设置对应容器的名字,以区分不同的容器# 如果有多个容器,但是只需要调试一个容器的话,只设置一个container即可- name: dockdev:# 开发容器配置# 开发镜像image: golang:1.17# 开发容器默认 Shellshell: "bash"# 文件同步的远程目录workDir: /opt/dock-template/# storageClass 持久化需要 storageClass 的能力来提供支持storageClass: "csi-localpv"persistentVolumeDirs:- path: "./local-pv" # Dir to be persisted in DevContainercapacity: 1Gi # Capability of the dir# 开发容器资源的 request 和 limitresources:limits:cpu: "2"memory: 2Girequests:cpu: "2"memory: 2Gi# 热加载hotReload: truecommand:# 一键运行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:8080useDevContainer: false# https://nocalhost.dev/zh-CN/docs/config/config-patternsync:type: "send"mode: "pattern"filePattern:- "./"ignoreFilePattern:- ".DS_Store"- ".git"- ".idea"- "logs"- "dock.tar.gz"# Specify dev mode environment parametersenv:- name: GOPROXYvalue: https://goproxy.cn# 当存在 go.mod 文件时或处于 GOPATH 外, 其行为均会等同于 GO111MODULE=on。相当于 Go 1.13 下你可以将所有的代码仓库均不存储在 GOPATH 下- name: GO111MODULEvalue: on
03 关联配置
当编辑好配置后,开始进行开发之前,需要进行一次将本地代码和远程环境上的工作负载关联的动作,因为nocalhost插件是在ide中跨项目共享的。意思是,你只需要配置一次远程服务,在使用pycharm/goland打开多个repo的时候,为了避免混乱,你需要将本地的某一个确定目录和远程的某一个pod中的某一个确定容器进行精确关联。从而开始打通流量和开始同步文件。
04 开发模式
开发模式的本质是使用nhctl工具,在本地计算机和远程环境之间建立VPN隧道和使用syncing文件同步工具建立实时同步机制。
nocalhost会将原本的pod中将要开发的容器替换为两个容器,一个是nocalhost_dev开发容器,一个是nocalhost_sidecar容器。
nocalhost_dev容器负责来运行我们的代码,nocalhost_sidecar来利用pod内共享存储的机制来处理文件同步。

05 VPN模式
在没有开启开发模式的情况下,我们开发远程程序还有另外一种方式,如果我们的应用本身非常简单,没有太多的依赖,也不依赖于k8s环境,不依赖于特定的存储,只是在网络层面上依赖于环境中的其他服务。
这种情况下,完全可以在本地开发,无须在本地和远程之间建立文件同步,将程序跑在远端的pod内。
通过运行 ProxyMode模式,nocalhost可以只帮我们在本地和远端pod容器之间建立vpn隧道。我们直接在本地run程序或者debug程序,在远端pod内能访问的服务,在本地都可以访问到。不需要写/etc/hosts文件等操作。也无须配置环境变量。


06 远程RUN
如果你的程序依赖非常复杂,依赖了:
-
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
F A Q
Q 如何设置开发镜像?
A 首先解释下开发镜像,开发镜像是nocalhost在替换原始容器时候的我们指定的容器,nocalhost官方本身已经提供了很多开发容器,这些容器中都内置了很多调试工具和参数,比如pydevd和dlv。
nocalhost-docker.pkg.coding.net/nocalhost/dev-images/node:latestnocalhost-docker.pkg.coding.net/nocalhost/dev-images/node:14nocalhost-docker.pkg.coding.net/nocalhost/dev-images/golang:latestnocalhost-docker.pkg.coding.net/nocalhost/dev-images/golang:1.16nocalhost-docker.pkg.coding.net/nocalhost/dev-images/python:latestnocalhost-docker.pkg.coding.net/nocalhost/dev-images/python:3.9nocalhost-docker.pkg.coding.net/nocalhost/dev-images/java:latestnocalhost-docker.pkg.coding.net/nocalhost/dev-images/java:11nocalhost-docker.pkg.coding.net/nocalhost/dev-images/ruby:latestnocalhost-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




