点击上方蓝色字体,选择“设为星标”
回复”云原生“获取基础架构实践
背景
在这个以k8s为云os的时代,程序员在日常的开发过程中,肯定会遇到各种问题,比如:本地开发完,需要部署到远程k8s集群,本地如何直接操作呢?又如:提测到测试环境发现有问题,或者nightly环境本身没过,这时候,可能需要一些调试。下面介绍一款开源已久的产品来体验秒级体验下本地操作远程k8s、直接在调试远程代码。
借助 Nocalhost 实现 k8s 应用秒级的本地开发体验
直入主题,Nocalhost 是腾讯云 CODING 在 2020 年开源的项目,同时它也是云原生开发领域下第一个由国人主导并进入 CNCF Sandbox 的项目。
Nocalhost 开发实战
安装 Nocalhost 插件
首先,需要先安装 Nocalhost IDE 插件。Nocalhost 支持 VS Code 和 Jetbrains 全系列的 IDE,你可以在市场中搜索。
接下来,我以 Jetbrains Goland 插件为例简单介绍如何安装 Nocalhost 插件。
首先,在 IDEA Goland 插件市场中搜索 Nocalhost,然后点击“安装”按钮进行安装,如下图所示。
在安装 IDE 插件之后,Nocalhost 会自动下载 nhctl 工具,你可以在 Jetbrains Goland 的右下角查看下载进度,nhctl 是 Nocalhost 的核心组件,它为插件提供 Kubernetes API 调用能力。
集成远程 k8s 集群
接下来,添加 Kubernetes 集群,在右侧菜单栏中打开 Nocalhost 插件,如果你已经提前准备好了 K8s 集群,Nocalhost 就会自动识别,点击“Add”即可添加集群。
在上面的第二步,选择k8s的kubeconfig,选择完后,会自动检测是否存在该集群:
如果不存在该集群,会提示:
最后,在 Add 完成功后,会在该菜单下看到集群相关的信息以及资源:
部署应用
接着,我们就可以部署应用了,先来看看部署官方给的示例应用,首先鼠标移到default
命名空间位置右击,然后可以看到Deploy App:
点击部署 app后,出现图:
我们点击第四个按钮Deploy Demo
,此时,Nocalhost 将自动从 GitHub 克隆示例应用仓库,并将它部署到集群的 default 命名空间下。同时,此时,控制台就会打印如下日志:
此时,表示应用部署成功,Nocalhost 将自动进行端口转发,并打开浏览器访问http://127.0.0.1:39080/productpage
示例应用页面,如下图所示:
简单介绍一下这个示例应用,这是一个图书管理系统,展示了书籍的详情信息、评价、作者信息、评分。每部分信息都是由不同的微服务输出的,示例应用一共有 5 个微服务组成,它们分别是 Productpage 服务、Reviews 服务、Details 服务、Rattings 服务和 Authors 服务。其中,Productpage 服务负责输出首页以及请求其他的微服务,也是应用的入口,其他服务根据字面意思分别输出了其他的内容。
秒级开发循环反馈
接下来我们来看一下如何使用 Nocalhost 打破传统的开发循环反馈,并获得秒级的 Kubernetes 应用开发体验。
我们在 Nocalhost 插件中点击 default 展开命名空间,然后点击 bookinfo 展开应用,点击 Workload 展开工作负载,最后,点击 Deployment 查看工作负载列表:
此时,将鼠标移动到 authors 服务,点击右侧的“绿色锤子”按钮进入该服务的开发模式:
然后,在弹出的对话框中选择“Clone from Git Repo”,并选择一个本地目录用来存储源码:
首次打开会出现是否信任,直接点击信任:
点击确认后, Nocalhost 将自动克隆 authors 服务的源码到所选择的目录下,并将源码通过新的 UI 窗口打开:
此时,在新的窗口的右下角你会看到 Nocalhost 进入开发模式的提示,等待片刻后,将获得一个远端容器的终端:
注意,这个终端并不是本地的终端,而是 authors 服务在开发模式下的终端。也就是说,在此终端下执行的所有命令实际上都是在 authors 服务的容器里执行的。此时,你可以在终端内执行 ls 命令来查看容器的文件目录:
由于这个容器启动的逻辑是直接通过运行源码,所以这里有源码,并且执行go run app.go
:
此时,我们可以任意改代码进行调试了吧~
容器热加载
其实,可以看出 Nocalhost 是通过文件同步的技术来实现本地和远端代码一致的,在实际编码过程中,每次在本地修改源码后,我们往往需要手动重启容器内的业务进程才能看到编码效果。
那么,能不能更进一步,实现修改代码后自动重载呢?Nocalhost 同样也为我们提供了和语言无关的容器热加载,也就是说,当本地有任何代码变更时,Nocalhost 都会自动帮助我们重启容器内的业务进程,达到容器热加载的目的。接下来,我们一起来体验这个功能。首先,在当前 VS Code 窗口中重新打开 Nocalhost 插件,找到 authors 服务。此时,你将看到该服务左侧有一个“绿色锤子”图标,这表示这个服务正在开发模式当中,如下图所示:
接下来,右击 authors 服务,选择一个选项 Remote Run:
注意,在点击 Remote Run 之前,一定要先确保已经通过 Ctrl+C 的方式手动停止了容器内的业务进程,这可以避免重复运行业务进程导致的端口冲突。
现在,Nocalhost 将自动开启一个新的终端,并自动启动业务进程:
到这里,可能有疑惑,Nocalhost 怎么知道我的业务的启动命令呢?答案是通过为 Nocalhost 配置启动命令。你可以通过点击 authors 服务右侧的“设置”按钮,在弹出的对话框中选择“取消”来查看配置文件中的 command.run 字段。实际上,Nocalhost 是通过运行配置的 run.sh 脚本来启动业务的。
最后,你可以在终端窗口中通过 Ctrl+C 的方式来中断容器热加载。到这里,Nocalhost 容器热加载的全过程就已经体验完了。
一键调试
除了容器热加载以外,Nocalhost 还为我们提供了便利的一键远程调试功能。同样地,找到 authors 服务,右击选择“Remote Debug”来进入远程调试。
接下来,Nocalhost 就会以调试模式启动业务进程,然后通过 Kubernetes 端口转发的方式将远端的调试端口转发到本地,并控制调试器连接到调试端口。需要注意的是,由于 authors 服务是 Golang 编写的,所以调试依赖于本地的 Golang 开发工具,如果你的电脑里没有 Golang 开发环境,Nocalhost 将提示你安装相关工具和插件。进入调试后,你将看到窗口右下角出现准备连接调试器,如下图所示:
后面就可以打断点进行Debug模式调试了。
在这个调试例子中,如果你用的是 M1 芯片的 Mac,那么你可能会发现在调试过程中 IDE 的调试器一直无法连接到远端容器,这时候,你还需要进行下面的操作。在 Nocalhost 插件中点击 authors 服务的“设置”按钮进入服务的开发配置页,并将 image 字段修改为 okteto/golang:1.19,然后,点击“红色锤子”退出 authors 服务的开发模式,退出完成后,再点击“Remote Debug”来进入调试模式即可。最后,要退出调试模式,你可以切换到 VS Code 终端菜单,并通过 Ctrl+C 的方式来终止调试进程。
到此,就完整的带大家走一圈秒级体验本地远程调试k8s集群的应用服务了。谢谢大家关注~
下面给大家介绍几本好书,目前销售火热,有原理加实战,感兴趣可以点击下方链接购买。
开源项目
实践项目代码开源:https://gitee.com/damon_one/microservice-k8s
欢迎大家star、fork,欢迎联系我,一起学习。
号内回复“云原生”,获取云原生基础架构实践
云原生社区合肥站
云原生社区合肥站正式启动啦,欢迎Base合肥、关注云原生、长期从事云原生的同志们踊跃加入,云原生社区合肥站会因为你们的加入而变得更加美好~
详情参见Issue:https://github.com/cloudnativeto/community/issues/107
联系号主
欢迎关注个站
往期回顾
微服务自动化部署CI/CD
如何利用k8s拉取私有仓库镜像
个站建设基础教程
ArrayList、LinkedList 你真的了解吗?
大佬整理的mysql规范,分享给大家
如果张东升是个程序员
微服务架构设计之解耦合
浅谈负载均衡
Oauth2的认证实战-HA篇
Oauth2的授权码模式《上》
浅谈开发与研发之差异
浅谈 Java 集合 | 底层源码解析
基于 Sentinel 作熔断 | 文末赠资料
基础设施服务k8s快速部署之HA篇
今天被问微服务,这几点,让面试官刮目相看
Spring cloud 之多种方式限流(实战)
Spring cloud 之熔断机制(实战)
面试被问finally 和 return,到底谁先执行?
Springcloud Oauth2 HA篇
Spring Cloud Kubernetes之实战一配置管理
Spring Cloud Kubernetes之实战二服务注册与发现
Spring Cloud Kubernetes之实战三网关Gateway
点击 "damon8.cn" 获取更好的阅读体验!
❤️给个「在看」,是对我最大的支持❤️