环境说明:

已经配置好k8s集群,并且部署了应用(部署在我本地windows电脑)。

idea(因为我是调试Java代码,习惯用idea)

在idea中安装 nocalhost 的插件。

痛点:

1:为了方便调试远端的k8s集群中的程序,

2:nocalhost 可以将远端 pod中的端口,转发到本地中。(这个作用很大)

一般想要访问k8s集群中的服务方式(我是使用的端口映射为集群内部访问)

都是通过服务发现,用pod的ip+端口访问,所以服务启动之后,在集群中随便一个虚拟机节点上,用ip加端口的方式,或者在服务启动的虚拟机上用ip加端口的方式访问。

注意:k8s通常都是用域名访问服务(通常都是pod的服务名),

而我windows电脑想要访问本地的k8s集群中的服务,要么在虚拟机中访问(因为虚拟机是k8s集群中的一个节点),要么将集群中的服务映射到本机的端口,用localhost + 端口访问;

因此需要一个东西来将集群中的服务映射出来;

而nocalhost 刚好有这个功能,

但是nocalhost 又不仅仅只有这个功能,它相对来说更强大。

1:nocalhost简介:

用户无需在本地电脑配置开发、调试、测试环境,可以直接使用远端的云原生开发环境进行开发。

(当然我这里是自己在本机部署了一套k8s的环境,作用就是用来做自己的测试环境)

举个简单的例子,假设开发者 A 需要本地开发一个容器化应用并修改和验证功能,那么他需要做的事情包括:

  1. 本地搭建和启动 k8s 环境,把所有的微服务组件运行起来;
  2. 在本地把应用跑起来,这会消耗大量的内存资源,越大型的应用意味着本地配置要求更高;
  3. 想要修改和验证代码变更,需要在满足前两个条件的同时,完成重新 build 镜像、更新工作负载、等待新镜像拉取和容器重启步骤。
    在传统模式下,哪怕只是修改一行代码,也需要执行这些繁琐的步骤才能获得验证结果。而在 Nocalhost 的开发模式下,本地 IDE 和云端开发环境相互连接,管理员将为开发者分配环境及开发资源。完整的微服务运行在云端的开发环境中,开发者本地仅需修改需要开发的微服务代码,修改代码保存之后,即可在云端开发环境中进行验证,整个验证过程由 5 分钟缩短至 5 秒,实现本地开发的代码实时生效和调试,大大提高了开发者验证的效率。

对于开发人员来说,原来单体应用的开发体验变得不复存在,由于应用很难在 Docker 容器之外运行,所以每次代码修改,都需要经历以下步骤:

  • 执行 docker build 构建镜像
  • 执行 docker tag 对镜像进行标记
  • 执行 docker push 推送镜像到仓库
  • 修改 Kubernetes 工作负载的镜像版本
  • 等待镜像拉取结束
  • 等待 Pod 重建
  • 查看修改后的代码效果

这直接拖慢了开发的循环反馈过程,每次修改,动辄需要数分钟甚至十分钟的等待时间。

Nocalhost,即 No Localhost,能够聚焦于微服务架构中的某一个服务进行开发,并实现快速的开发反馈循环。

2:nocalhost 有如下特点:

1: 直接在 Kubernetes 集群中构建、测试和调试应用程序。

2: 提供易于使用的 IDE 插件(支持 VS Code 和 JetBrains),即使在 Kubernetes 集群中进行开发和调试,Nocalhost 也能保持和本地开发一样的开发体验。

3: 使用即时文件同步进行开发: 即时将您的代码更改同步到远端容器,而无需重建映像或重新启动容器。

3: Nocalhost直接在k8s中进行开发,有如下几点优势:

1: 生产环境相似 - 开发环境与你的生产环境非常相似,让你更有信心在发布新功能时一切都像在生产环境中一样工作。

2: 更改即时生效 - 通过文件同步,对代码的所有更改都可以在容器中立即生效,而无需重建镜像或重新部署容器,从而提升开发效率。

3: 灵活的扩展性 - 开发人员无需再担心本地资源不足。

4: 降低成本 - 更有效地使用资源并降低 IT 设施成本。

5: 方便调试 - Nocalhost支持远程debug,可以方便地在本地计算机上复现线上的问题。

6: 减少本地配置 - 由于线上、测试环境已经部署过,Nocalhost使用这些现成的资源,不需再在本地安装mysql、redis等进行配置,也不必担心本地资源的限制,从而可以更愉快地本地开发,远程k8s部署并调试。
 

4:nocalhost如何使用

Nocalhost远程调试过程,主要分为Start DevMode启动调试模式、Associate Local DIR关联本地目录、设置断点、Remote Debug远程调试、本地请求接口、查看断点处信息等过程。

连接k8s集群:connect to cluster

这里需要填写rancher集群中 kubeconfig 文件中的内容,

复制到这里。

等待一会,就会出现你的集群的信息,

首先名字就是集群的名字,其次还有其他东西。如图:

这个就是我环境中集群的一些服务信息。

若是需要调试哪个服务,则在服务名上右键:

 首先编辑这个服务的Dev Config

点击这个,进行一些简单的设定。(这里配置很方便的,会选择用浏览器打开,进行修改,后复制修改的内容到这个文件即可),如下图:

将修改的内容复制到那个配置的yml中保存,

name: xxxx
serviceType: statefulset
containers:
    - name: xxxx
      dev:
        gitUrl: ""
        image: xxxxx:1.0.0.2
        shell: ""
        workDir: ""
        storageClass: ""
        resources: null
        persistentVolumeDirs: []
        command:
            run: []
            debug: []
        debug:
            remoteDebugPort: 19001
        hotReload: false
        sync: null
        env:
            - name: xxxxx
              value: xxxx
        portForward:
            - 19000:9000

(这里有一个镜像地址,其实我感觉可以随便填一个,因为最终还是你本地的代码部署到远程的容器中,那这个镜像地址其实不是多么重要,填一个存在的即可)

大概就是这么个结构。然后就可以使用nocalhost了;

使用Nocalhost之前,要先启动开发模式。(就是根据上面的配置,在k8s中把pod创建好)分两种:
        1: Start DevMode 会替换掉原来的pod,这种方式会影响到正在对外提供的服务
        2: Start DevMode (复制模式),保持原来的POD正常运行,创建一个新的POD供开发使用。                该方式下,外部的正常访问不会访问到该POD,相当于每个人都有一个独立的环境。

(其实我都是直接用的第一种,替换就好了,让所有的流量都进到我本地就行了)

点击start devmodel ,等待启动调试模式;

成功进去开发模式后,会自动在DE中打开一个终端,这就是Nocalhost为我们创建好的容器了。顺利的话,你应该能在该容器的/home/nocalhost-dev目录下看到你的源代码。

这里中间应该会选择一个目录,就是关联你本地服务的代码的目录就好了;

(就是选择关联源代码所在的目录)


接下来就是运行应用了:

Remote Run : 根据之前配置的run命令启动程序
Remote Debug : 根据之前配置的devbug命令启动程序

不过我是直接在远端容器中,用手动的方式启动的服务,这里这个run命令的配置,配置好这个就行了,不过都行,我是手动进入远端容器中我代码的目录,里面有一个我程序的启动脚本,手动执行启动脚本。这两种方式都可以;

启动成功后访问程序
通过localhost + 上面配置的端口转发即可访问,例如:localhost:端口号

在本地修改一行代码,就会实时的在远端容器中生效了,

从代码修改,到远端容器中生效的过程很快,可能都不到1秒,

如果不使用nocalhots,那起码都是几分钟起步的,流程很复杂,

开发效率很低,

那nocalhost 是使用了源码启动进程,实时热加载技术,当进入开发模式(Dev Model)后,会实时把本地的源码同步到远端容器中,免去了提交,构建,推送镜像等循环,提升了开发效率。

代码修改后实时生效,太方便了。

 

 

Reset Pod
调试结束,或者出现问题,不是自己想要的结果,可以Reset Pod,修改配置后,保存配置,自动将修改推送到远程,并启动pod。之后,再Start DevMode进行Remote Debug即可。

具体的使用还要实际生产中使用,反正这个工具还挺好用的,我初期是把它当做k8s集群映射到本地访问的一个工具,后来顺便看了下它远程debug的功能,

那其实这个好像有一个缺点,如果我想直接在本地访问k8s集群中的所有服务的话,好像需要在idea中把每个服务都启动起来,然后本地才能跑完整的业务流程,

其实一个服务可能会关联多个服务,比如nginx,前端,redis,kafka等,要把这些服务都在idea多nocalhost中启动起来,其实也不太方便,这个工具可能是用于调试某一个服务比较方便。

所以为了实现我本地可以随便访问集群中的所有服务,跑通整个业务流程,那就需要将服务都映射到本地,其实还有一个更好的方法,就是k8s中另一个组件,kube forward,我的另一个文章中有简单介绍。

参考文章:

官网: 什么是 Nocalhost? | Nocalhost

云原生环境是使用Nocalhost开发调试Spring boot应用 | 达夕博客

Windows系统配置Nocalhost进行远程调试_sym的博客-CSDN博客

Nocalhost-入门指南_哔哩哔哩_bilibili

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐