nocalhost使用(云原生下开发方式)

目录:

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 容器中。 这样能免去了镜像提交、构建和推送等步骤,极大提速了开发的反馈循环。 因此代码修改可以实现秒级生效。

image.jpeg

1.2、开发模式:

1)、Replace DevMode:

Replace DevMode 是 Nocalhost 的默认开发模式。 当对某个工作负载进行开发的时候,会把原有的工作负载的容器镜像替换成开发镜像。 如下所示:

image.jpeg

当进入 Replace DevMode时,Nocalhost 会对工作负载执行以下操作:

  1. 将副本数缩减为 1。 开发应用程序时,只需要在一个容器里运行正在开发的应用程序, 如果存在多个副本,我们通过 Service 访问该工作负载时,就无法控制流量只访问到我们正在开发的应用程序所运行的那个副本。 所以 Nocalhost 需要先将工作负载的副本数缩减为 ;
  2. 替换容器的镜像为开发镜像。 生产环境运行的容器往往会使用很轻量级的镜像,镜像里仅包含运行业务程序所必须的组件,而缺少编译构建业务程序的相关工具(如 JDK)。 所以在对某个工作负载进行开发的时候,Nocalhost 会将容器镜像替换官方成包含完整开发工具的开发镜像,我们也可以使用我们自己的镜像;
  3. 增加一个 sidecar 容器。 为了将本地的源代码改动同步到容器中,需要在容器里运行一个文件同步服务器。 为了使文件同步服务器进程和业务进程解耦,Nocalhost 将文件同步服务器运行在一个独立的 sidecar 容器中。 该容器与业务容器挂载相同的同步目录, 因此,同步到 sidecar 容器中的源代码在业务容器中也可以访问;
  4. 转发一个本地端口到文件同步服务器。 文件同步服务器监听在容器里的某个端口,我们在本地无法直接访问, 所以 Nocalhost 会把一个本地随机端口转发到容器里文件同步服务器监听的端口;
  5. 启动本地文件同步客户端。 文件同步客户端启动后会通过上一步转发的本地随机端口和文件同步服务器建立通信, 之后便会开始进行文件的同步;
  6. 打开远程终端。 在容器替换成功之后,Nocalhost 会自动打开一个进入到远程容器的终端。 通过该终端,我们可以把同步到容器里到源代码直接运行起来;

使用直接替换镜像的方式可以很好地保持原有的服务间调用关系,让集群中其它服务的流量打到正在开发的服务上. 但是也存在以下不足:

  1. 容易破坏原有的环境. 可能会因为开发中的服务出现问题而导致整个环境出问题;
  2. 容易影响其它团队成员对环境的正常使用. 其它团队成员可能只想访问正常的的环境,而不是处于开发中的环境;
  3. 多个团队成员无法对同一套环境的同一个服务同时进行开发;

为了解决以上问题,我们可以使用Duplicate DevMode进行开发。

2)、Duplicate DevMode:

在 Duplicate DevMode 中,Nocalhost 不会对原有工作负载进行任何修改,而是创建一个原有工作负载的副本,在该副本上进行开发. 在不同设备上可以同时使用 Duplicate DevMode 创建工作负载的副本进行开发. 副本上会被 Nocalhost 打上设备的 ID 以标识该副本是哪个设备在进行开发 (设备 ID 由 Nocalhost 自动生成,对用户透明. 并保证不同设备上的设备 ID 不会重复). 各个副本之间互不影响. 如下图所示:

image.jpeg

副本及其管理的 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文件,整体目录结构如下:

image.jpeg

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

image.jpeg

然后选择打开本地工程目录,这里选择我们上面的httpexample工程目录即可,nocalhost会自动的将我们工程目录下的manifest目录下的资源apply到k8s集群中

image.jpeg

从控制终端可以看到nocalhost已经完成了该工程应用的部署

image.jpeg

4)、研发调试:

对刚刚通过nocalhost部署好的应用右击选择开始研发模式。

image.jpeg

然后选择我们的本地的代码工程目录,这里再次选择的原因是,nocalhost会在我们刚刚部署的pod里面启动一个sidecar容器,nocalhost然后将我们本地代码工程目录都拷贝到这个sidecar容器里面同时监控我们本地这些代码文件,这样我们在本地修改的文件就会自动同步到远端pod里面,然后就能在pod里面进行代码的调试工作。

image.jpeg
image.jpeg
image.jpeg

启动后在pod内可以看到我们本地的代码文件都同步完成了

image.jpeg

在远端的研发pod内启动我们的代码工程

image.jpeg

5)、端口转发:

将k8s集群中我们部署的应用端口转发到我们本地,这样我们就能在本地来访问k8s集群中我们部署的应用了。

image.jpeg
image.jpeg
image.jpeg

更多功能可以看官方文档:
https://nocalhost.dev/docs/introduction/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容