• 云原生时代开发提效神器-Nocalhost


    前言

    在很早以前发表了一篇文章springcloud本地开发的微服务如何调用远程k8s的微服务。着重介绍的如何利用kt-connect来打通开发环境与K8S环境的调试。今天介绍的Nocalhost,不仅仅能达到上述的效果,而且功能更加强大。下面我们就进入正题

    什么是Nocalhost

    Nocalhost 是一款开源的基于 IDE 的云原生应用开发工具,它具有如下功能:

    • 直接在 Kubernetes 集群中构建、测试和调试应用程序
    • 提供易于使用的 IDE 插件(支持 VS Code 和
      JetBrains),即使在 Kubernetes 集群中进行开发和调试,Nocalhost 也能保持和本地开发一样的开发体验
    • 使用即时文件同步进行开发: 即时将您的代码更改同步到远端容器,而无需重建镜像或重新启动容器。

    Nocalhost是如何工作

    Nocalhost 由单个二进制 CLI 和 IDE 插件组成。 理想情况下,您可以直接将它与您熟悉的 IDE 一起使用。 Nocalhost 不需要服务器端组件,因为它通过 KubeConfig 直接与您的 Kubernetes 集群通信,就像 kubectl 一样。

    实操

    注: 本文以java语言为例子,window环境通过idea来演示

    1、在idea中安装Nocalhost插件

    通过文件 > 设置 > 插件 > 浏览插件仓库… > 搜索 “Nocalhost” > 安装插件"

    注: Nocalhost对idea版本有要求,他idea的最低要求版本为2020.3

    其他方式的插件安装,查看Nocalhost官网
    https://nocalhost.dev/zh-CN/docs/installation

    2、配置K8S集群

    点击idea右侧菜单栏,选中nocalhost tab

    点开,看到如下界面

    点击connect to cluster按钮,进入如下界面

    可以通过下载 kubeconfig 文件到本地,然后Load KubeConfig选择kubeconfig 保存的文件路径。或者可以直接复制
    kubeconfig 内容到文本区

    如果连接成功,就会看下形如下内容


    更多集群配置可以查看官网,https://nocalhost.dev/zh-CN/docs/guides/manage-cluster/

    3、创建实例应用

    以一个java项目为例,本示例以mvc来演示,编写一个controller

    @RestController
    @RequestMapping(value = "develop")
    @Api(tags = "开发专用")
    @Slf4j
    public class DevelopController {
    
        @GetMapping("local")
        @ApiOperation(value = "本地调试")
        public String testLocalDev(){
            return "localDev";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4、将创建的java项目打成jar(可选)

    通过执行

    mvn clean package -DskipTests
    
    • 1

    打包后,会在target目录下,产生相应的jar,形如下

    注: 是否需要打包,根据config.yaml的配置的command参数而定,如果配置如下示例,其实可以不用打成jar

    # Deployment Name
    name: pig-auth
    serviceType: deployment
    containers:
    	# Deployment 主容器名称
      - name: auth
        dev:
        	# 开发镜像,该镜像包含了 Java Maven 环境
          image: registry.cn-hangzhou.aliyuncs.com/zqqq/maven:3.8.6-openjdk-8
          # 默认终端为 bash
          shell: bash
          # Rainbond 提供的 StorageClass Name
          storageClass: rainbondvolumerwx
          # 配置开发容器资源
          resources:
            limits:
              memory: 4096Mi
              cpu: "2"
            requests:
              memory: 2048Mi
              cpu: "1"
          persistentVolumeDirs:
          	# Maven 依赖包缓存路径,配合 storageClass 一起食用
            - path: /root/.m2/repository
              capacity: 10Gi
          command:
            # 一键启动命令,安装依赖包和启动 pig-auth 子模块
            run:
              - mvn
              - install
              - '&&'
              - mvn
              - spring-boot:run
              - -pl
              # 指定子模块启动
              - pig-auth
            # 一键 Debug 命令,安装依赖包和 Debug pig-auth 子模块
            debug:
              - mvn
              - install
              - '&&'
              - mvn
              - spring-boot:run
              - -pl
              # 指定子模块启动
              - pig-auth
              # Java Debug 命令
              - -Dspring-boot.run.jvmArguments=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
          debug:
            # 远程端口,对应Debug命令中的 address=5005
            remoteDebugPort: 5005
            # 选择 Java 语言
            language: java
          # 热加载
          hotReload: true
          # 文件同步
          sync:
            type: send
            mode: gitIgnore
            deleteProtection: true
          # 端口转发,转发容器内的3000端口到本地3999
          portForward:
            - 3999:3000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    该配置来源博客https://cloud.tencent.com/developer/article/2043129的配置示例

    5、将应用发布到k8s

    可以通过界面操作,也可以通过kubectl apply -f 或者helm进行操作

    附: 示例的deployment.yml文件

    ApiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        workload.user.cattle.io/workloadselector: nocalhost-demo
      name: nocalhost-demo
      namespace: test
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          workload.user.cattle.io/workloadselector: nocalhost-demo
      template:
          labels:
           workload.user.cattle.io/workloadselector: nocalhost-demo
        spec:
          affinity: {}
          containers:
          - env:
            - name: SERVER_PORT
              value: "80"
            image: harbor.images.cn/devops/adoptopenjdk/openjdk8
            imagePullPolicy: IfNotPresent
            name: nocalhost-demo
            ports:
            - containerPort: 80
              name: 80tcp
              protocol: TCP
            readinessProbe:
              failureThreshold: 5
              httpGet:
                path: /actuator/health/ping
                port: 80
                scheme: HTTP
              initialDelaySeconds: 10
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 1
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    发布上去后,可以通过nocalhost面板查看

    6、使用nocalhost进行服务调试

    a、 选择想要调试的工作负载


    b、 右键点击工作负载并选择 Dev Config,编辑您的调试配置


    选中后会提示


    选择yes,跳转到如下页面


    其实就跳转到这个链接https://nocalhost.dev/zh-CN/tools,填好相关信息,选择应用即可

    注: 不过我们更经常使用如下方式

    在项目根目录创建个 .nocalhost 文件夹,然后拷贝形如下内容到config.yaml文件


    示例

    name: "nocalhost-demo"
    serviceType: "deployment"
    containers:
      -
        name: "nocalhost-demo"
        dev:
          gitUrl: ""
          image: "nocalhost-docker.pkg.coding.net/nocalhost/dev-images/java:11"
          shell: "bash"
          workDir: ""
          storageClass: ""
          resources:
            limits:
              memory: "2048Mi"
              cpu: "2"
            requests:
              memory: "512Mi"
              cpu: "0.5"
          persistentVolumeDirs: []
          command:
            run:
              - "exec"
              - "java"
              - "-Dlog4j2.formatMsgNoLookups=true"
              - "-Djava.security.egd=file:/dev/./urandom"
              - "-jar"
              - "/home/nocalhost-dev/target/nocalhost-demo.jar"
            debug:
              - "java"
              - "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
              - "-jar"
              - "/home/nocalhost-dev/target/nocalhost-demo.jar"
          debug:
            language: "java"
            remoteDebugPort: 5005
          hotReload: true
          sync:
            type: "send"
            mode: "pattern"
            filePattern:
              - "."
            ignoreFilePattern:
              - ".git"
            deleteProtection: true
          env:
            - name: JAVA_TOOL_OPTIONS
              value: -Xms1024M -Xmx1024M
          portForward:
            # 8082本地端口,80为容器端口
            - "8082:80"
          sidecarImage: ""
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    注: 这些内容可以直接通过nocalhost提供的可视化界面https://nocalhost.dev/zh-CN/tools进行操作配置,再拷贝即可

    c、 右键再次点击此工作负载并选择Start DevMode 或者Start DevMode(Duplicate )

    Nocalhost 目前支持两种开发模式, Repliace DevMode 和 Duplicate DevMode。其中Repliace 是默认模式
    这两者的区别在于

    Repliace DevMode使用直接替换镜像的方式可以很好地保持原有的服务间调用关系,让集群中其它服务的流量打到正在开发的服务上。即开发的镜像会直接替换原有的镜像。该模式可能会出现以下问题

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

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

    Duplicate DevMode 是允许在多台设备上同时进入开发模式的,如果副本和原有工作负载一样都接收来自线上流量的话,我们无法知道当前访问的环境使用的哪个设备上正在开发的服务,从而会导致访问环境的结果变得不可预期.

    这两种模式的更多信息可以查看如下链接https://nocalhost.dev/zh-CN/docs/guides/develop-service-dup-en

    我们通过Duplicate DevMode启动,观察控制台

    通过控制台,可以看出来,已经启动成功了

    e、 配置端口转发(可选)

    可以通过config.yaml配置形如下内容(如果是已经在配置文件中,已经配置转发端口,则该步骤可以跳过)

       portForward:
            # 8082本地端口,80为容器端口
            - "8082:80"
    
    • 1
    • 2
    • 3

    也可以右键点击此工作负载,选中Port Forward

    8082为本地端口,80为代理端口

    f: 右键点击工作负载,选中Remote run或者Remote debug

    正常情况下,idea的控制台会打印相关项目日志信息,形如下

    在这里插入图片描述

    该日志是容器里面的日志,我们可以先在项目中打个断点,然后通过浏览器访问localhost:8082/develop/local

    跳过断点,浏览器跳转到如下页面


    说明已经成功进行调试。

    更多关于调试相关内容可以查看如下链接https://nocalhost.dev/zh-CN/docs/guides/debug/jetbrains-debug/

    总结

    其实本文的内核都来自官网,对Nocalhost感兴趣的朋友,可以看下官网,实操一下。官网的资料还是很齐全。

  • 相关阅读:
    我的月光宝盒初体验失败了
    【C++入门基础】命名空间 | 缺省参数 | 函数重载 | 引用 | 内联函数
    Go语言类型与接口的关系
    【分享】如何使用集简云的“数组拆分“ 功能
    Cesium实现卫星在轨绕行
    【yolov3】yolov3原理详解
    hadoop MapReduce运营商案例关于用户基站停留数据统计
    MYSQL查询已数组形式返回 将查询结果组装成数组、逗号连接或者对象
    wireshark分析tcp协议(一)三次握手【理论 + 实操】
    基于python+django+php 仓库进销存管理系统
  • 原文地址:https://blog.csdn.net/kingwinstar/article/details/131062509