目录:
1、工作原理
1.2、开发模式
2、基于本地代码进行开发部署
【简介】:
Nocalhost 是一款开源的基于 IDE 的云原生应用开发工具:
- 直接在 Kubernetes 集群中构建、测试和调试应用程序;
- 提供易于使用的 IDE 插件(支持 VS Code 和 JetBrains),即使在 Kubernetes 集群中进行开发和调试,Nocalhost 也能保持和本地开发一样的开发体验;
- 使用即时文件同步进行开发: 即时将您的代码更改同步到远端容器,而无需重建镜像或重新启动容器;
让我们首先站在不同的角色来看 Nocalhost 能给他们带来什么。
开发人员:
- 摆脱每次修改需要重新 build 新镜像以及长时间的循环反馈,修改代码立即生效;
- 一键部署开发环境,摆脱本地环境搭建和资源不足的限制;
- 本地 IDE 编辑器和开发环境联动,支持远程调试;
- 图形化的 IDE 插件,无需熟悉 kubectl 命令即可完成云原生环境下的开发;
管理人员:
- 统一管理微服务应用包,降低应用的维护成本;
- 统一管理开发环境和集群,提高集群资源的利用率,同时具备隔离特性;
- 为新员工快速分配开发环境,分配环境后立刻能进行应用开发;
- 弹性的开发环境资源,用完销毁,降低开发成本;
1、工作原理:
Nocalhost 由单个二进制 CLI 和 IDE 插件组成。 理想情况下,可以直接将它与我们熟悉的 IDE 一起使用。 Nocalhost 不需要服务器端组件,因为它通过 KubeConfig 直接与 Kubernetes 集群通信,就像 kubectl 一样。Nocalhost 可以在你每次进行修改时自动将代码同步到 K8s 容器中。 这样能免去了镜像提交、构建和推送等步骤,极大提速了开发的反馈循环。 因此代码修改可以实现秒级生效。
1.2、开发模式:
1)、Replace DevMode:
Replace DevMode 是 Nocalhost 的默认开发模式。 当对某个工作负载进行开发的时候,会把原有的工作负载的容器镜像替换成开发镜像。 如下所示:
当进入 Replace DevMode时,Nocalhost 会对工作负载执行以下操作:
- 将副本数缩减为 1。 开发应用程序时,只需要在一个容器里运行正在开发的应用程序, 如果存在多个副本,我们通过 Service 访问该工作负载时,就无法控制流量只访问到我们正在开发的应用程序所运行的那个副本。 所以 Nocalhost 需要先将工作负载的副本数缩减为 ;
- 替换容器的镜像为开发镜像。 生产环境运行的容器往往会使用很轻量级的镜像,镜像里仅包含运行业务程序所必须的组件,而缺少编译构建业务程序的相关工具(如 JDK)。 所以在对某个工作负载进行开发的时候,Nocalhost 会将容器镜像替换官方成包含完整开发工具的开发镜像,我们也可以使用我们自己的镜像;
- 增加一个 sidecar 容器。 为了将本地的源代码改动同步到容器中,需要在容器里运行一个文件同步服务器。 为了使文件同步服务器进程和业务进程解耦,Nocalhost 将文件同步服务器运行在一个独立的 sidecar 容器中。 该容器与业务容器挂载相同的同步目录, 因此,同步到 sidecar 容器中的源代码在业务容器中也可以访问;
- 转发一个本地端口到文件同步服务器。 文件同步服务器监听在容器里的某个端口,我们在本地无法直接访问, 所以 Nocalhost 会把一个本地随机端口转发到容器里文件同步服务器监听的端口;
- 启动本地文件同步客户端。 文件同步客户端启动后会通过上一步转发的本地随机端口和文件同步服务器建立通信, 之后便会开始进行文件的同步;
- 打开远程终端。 在容器替换成功之后,Nocalhost 会自动打开一个进入到远程容器的终端。 通过该终端,我们可以把同步到容器里到源代码直接运行起来;
使用直接替换镜像的方式可以很好地保持原有的服务间调用关系,让集群中其它服务的流量打到正在开发的服务上. 但是也存在以下不足:
- 容易破坏原有的环境. 可能会因为开发中的服务出现问题而导致整个环境出问题;
- 容易影响其它团队成员对环境的正常使用. 其它团队成员可能只想访问正常的的环境,而不是处于开发中的环境;
- 多个团队成员无法对同一套环境的同一个服务同时进行开发;
为了解决以上问题,我们可以使用Duplicate DevMode进行开发。
2)、Duplicate DevMode:
在 Duplicate DevMode 中,Nocalhost 不会对原有工作负载进行任何修改,而是创建一个原有工作负载的副本,在该副本上进行开发. 在不同设备上可以同时使用 Duplicate DevMode 创建工作负载的副本进行开发. 副本上会被 Nocalhost 打上设备的 ID 以标识该副本是哪个设备在进行开发 (设备 ID 由 Nocalhost 自动生成,对用户透明. 并保证不同设备上的设备 ID 不会重复). 各个副本之间互不影响. 如下图所示:
副本及其管理的 Pod 会使用和原有工作负载不一样的 labels,所以它不会接收任何访问原有工作负载的流量,这么做的原因是,和 Replace DevMode 不同,Duplicate DevMode 是允许在多台设备上同时进入开发模式的,如果副本和原有工作负载一样都接收来自线上流量的话,我们无法知道当前访问的环境使用的哪个设备上正在开发的服务,从而会导致访问环境的结果变得不可预期。
2、基于本地代码进行开发部署:
nocalhost可以基于本地代码工程、git仓库中的代码工程或者helm方式来快速部署一个应用,然后进行开发调试。这里我以本地代码工程为例进行示范。
这里先简单的介绍一下相关应用的概念,nocalhost把应用的概念进行了高级抽象即一个应用可以是k8s中通过一个deployment.yaml文件部署的pod。也可以是所有k8s相关资源集合如deployment、service、ingress、daemonset等等和在一起部署出来的整体服务称为应用。那么定义了应用的概念后nocalhost使用它自己定义的yaml文件来描述一个应用所需要的属性如:镜像、资源限制、环境变量、代码仓库等。
所以我们在本地代码工程使用nocalhost来部署该工程为一个应用,需要在该代码工程的根目录下创建".nocalhost"目录然后在这个目录下创建一个config.yml文件用于描述nocalhost部署出来一个应用的相关属性。
nocalhost部署较为简单,直接在vscode或者ide里面安装nocalhost插件即可,安装教程就不在此多说,可以看官方文档。
1)、创建nocalhost目录:
在本地代码工程的根目录下创建一个.nocalhost目录,然后在其下面创建一个nocalhost的config.yaml配置文件,manifest目录存放的是该代码工程部署的deployment.yaml文件,整体目录结构如下:
2)、创建nocalhost配置文件:
注意:要是使用本地代码仓库模式做开发nocalhost配置文件中的manifestType类型必须要指定"rawManifestLocal",不能按照官方文档中的示例,官方文档有误。
configProperties:
version: v2
application:
name: httpexample
manifestType: rawManifestLocal #------指定使用本地yaml文件部署模式
resourcePath: ["manifest"] #------指定代码工程yaml存放目录
services:
- name: httpexample-dp #-----这里的名称需要和manifest目录下创建该应用deployment的名称一样
serviceType: deployment
containers:
- name: http-test
dev:
image: golang:1.17.13
workDir: /home/nocalhost-dev-hub #-----指定本地代码同步到pods中的那个目录下
shell: "bash"
sync:
type: send
filePattern:
- .
ignoreFilePattern:
- "./build"
env:
- name: NOCALHOST_INJECT_DEV_ENV
value: WHATEVER
工程部署yaml内容
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpexample-dp
spec:
selector:
matchLabels:
app: httpexample
replicas: 2
template:
metadata:
labels:
app: httpexample
spec:
containers:
- name: httpexample
image: golang:1.17.13
command: ["/usr/bin/tail"]
args: ["-f","/etc/hosts"]
ports:
- containerPort: 8090
---
apiVersion: v1
kind: Service
metadata:
name: httpexample-svc
spec:
type: ClusterIP
selector:
app: httpexample
ports:
- protocol: TCP
port: 8090
targetPort: 8090
3)、部署应用:
将上面代码工程通过nocalhost部署到k8s集群中。
选择一个k8s的命名空间右击,选择Deploy Application
然后选择打开本地工程目录,这里选择我们上面的httpexample工程目录即可,nocalhost会自动的将我们工程目录下的manifest目录下的资源apply到k8s集群中
从控制终端可以看到nocalhost已经完成了该工程应用的部署
4)、研发调试:
对刚刚通过nocalhost部署好的应用右击选择开始研发模式。
然后选择我们的本地的代码工程目录,这里再次选择的原因是,nocalhost会在我们刚刚部署的pod里面启动一个sidecar容器,nocalhost然后将我们本地代码工程目录都拷贝到这个sidecar容器里面同时监控我们本地这些代码文件,这样我们在本地修改的文件就会自动同步到远端pod里面,然后就能在pod里面进行代码的调试工作。
启动后在pod内可以看到我们本地的代码文件都同步完成了
在远端的研发pod内启动我们的代码工程
5)、端口转发:
将k8s集群中我们部署的应用端口转发到我们本地,这样我们就能在本地来访问k8s集群中我们部署的应用了。
更多功能可以看官方文档:
https://nocalhost.dev/docs/introduction/