沃趣科技技术社区
行业前沿信息一网打尽
沃趣科技技术社区
行业前沿信息一网打尽
沃趣科技技术社区
行业前沿信息一网打尽
技术社区 > 数据库技术b|Nocalhost安装操作步骤详解

数据库技术b|Nocalhost安装操作步骤详解

2023年06月14日

01 Nocalhost安装



- VS Code -

  1. 打开 VScode 编辑器,然后单击左侧栏中的方块图标

  2. 在搜索输入框中键入 nocalhost

  3. 选择 Nocalhost 插件,然后单击安装按钮进行安装。

1.jpg


- JetBrains -

Nocalhost 支持 JetBrains 全系列 IDE, 请参阅

https://nocalhost.dev/zh-CN/docs/installation##install-jetbrains-plugin


当安装 Nocalhost 插件时,会自动帮你安装 nhctl。


Windows

'文件 > 设置 > 插件 > 浏览插件仓库... > 搜索 "Nocalhost" > 安装插件


MacOS

'首选项> 设置 > 插件 > 浏览插件仓库...> 搜索"Nocalhost" > 安装插件

2.jpg




02 编写配置


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


目录结构如下:

3.jpg



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



03 关联配置


当编辑好配置后,开始进行开发之前,需要进行一次将本地代码和远程环境上的工作负载关联的动作,因为nocalhost插件是在ide中跨项目共享的。意思是,你只需要配置一次远程服务,在使用pycharm/goland打开多个repo的时候,为了避免混乱,你需要将本地的某一个确定目录和远程的某一个pod中的某一个确定容器进行精确关联。从而开始打通流量和开始同步文件。

5.jpg




04 开发模式


开发模式的本质是使用nhctl工具,在本地计算机和远程环境之间建立VPN隧道和使用syncing文件同步工具建立实时同步机制。


nocalhost会将原本的pod中将要开发的容器替换为两个容器,一个是nocalhost_dev开发容器,一个是nocalhost_sidecar容器。


nocalhost_dev容器负责来运行我们的代码,nocalhost_sidecar来利用pod内共享存储的机制来处理文件同步。

5.jpg


6.jpg



05 VPN模式


在没有开启开发模式的情况下,我们开发远程程序还有另外一种方式,如果我们的应用本身非常简单,没有太多的依赖,也不依赖于k8s环境,不依赖于特定的存储,只是在网络层面上依赖于环境中的其他服务。


这种情况下,完全可以在本地开发,无须在本地和远程之间建立文件同步,将程序跑在远端的pod内。


通过运行 ProxyMode模式,nocalhost可以只帮我们在本地和远端pod容器之间建立vpn隧道。我们直接在本地run程序或者debug程序,在远端pod内能访问的服务,在本地都可以访问到。不需要写/etc/hosts文件等操作。也无须配置环境变量。

7.jpg
8.jpg



06 远程RUN


如果你的程序依赖非常复杂,依赖了:

  • k8s集群

  • 集群中其他服务

  • 依赖了k8s集群中的存储

或者本地环境难以搭建:

  • 比如很多依赖无法在windows上安装

  • 或者本地计算机性能弱,无法在本地愉快的开发

这些问题,当然都可以解决掉,可以在本地模拟出来这些依赖,也可以想办法安装上该装的依赖,但是需要付出的成本很大。


nocalhost提供的方案则非常简单,通过实时同步本地文件直接将本地程序run在远端环境中。并且可以直接通过插件执行,和ide原生的run体验类似。如果是Telepresence则需要编写非常长的命令来执行。

9.jpg




07

远程debug

注意:使用pycharm需要使用商业版,社区版没有remote debug server的插件,无法使用remote debug的功能


原理

10.jpg

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

官方的示例配置是:

11.jpg

但这个例子使用了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: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



让数据库基础设施更简单
加速企业数字化转型建设及落地
立即咨询

沃趣科技

中立的企业级数据库云
十年磨一剑十年来始终如一的专注数据库生态领域
夯实技术底蕴打造最适合时代的数据库基础设施
业绩持续领先目前已累计服务超3000家企业客户

留言咨询

完善信息,我们第一时间跟您联系
姓名
手机
公司
所在地区
咨询问题