当前位置: 首页 > article >正文

使用豆包MarsCode 实现高可用扫描工具

以下是「 豆包MarsCode 体验官」优秀文章,作者郝同学测开笔记。

前言

最近接触K8s,了解到K8s提供了非常方便的实现高可用的能力,再加上掘金推出「豆包MarsCode初体验」征文活动,所以打算使用豆包 MarsCode IDE来实现一个高可用扫描工具。 豆包 MarsCode IDE 是一个云端 AI IDE 平台。通过内置的 AI 编程助手,开箱即用的开发环境,详细介绍可以参考官网:docs.marscode.cn/。

准备工作

进入豆包MarsCode,进行注册登录,进入主页面,还是比较简洁的,如下图所示

image.png

基于前言中提到的想法,基于模版来创建该项目,选择模版GO,输入项目名称KubeKeeper,以及简要描述,点击创建即可。如下图所示:

image.png

 这里提一起这个项目名称的想法,KubeKeeper - 结合了 Kubernetes(Kube)和保护者(Keeper),象征着守护和管理你的集群。哈哈,之后想要做的东西很多,这里先从高可用扫描工具开始。

创建之后,显示英文,感觉不舒服的朋友,可以点击截图所示位置,切换为中文显示

image.png

好了,到这里就算准备完成了,可以进入代码实现环节了。整体下来,使用还是比较容易的,不需要过多看文档就可以上手使用了。

项目背景

K8s提供了非常方便的实现高可用的能力,这使用户可以在K8s中非常标准化的实现高可用。只要有标准和规范,扫描工具就有用武之地。 扫描系统中的所有服务,分析是否满足K8s的要求就可以初步判断出我们的系统哪些模块是不符合高可用设计的。

在K8s中实现高可用服务需要怎么做呢?

  • 使用Deployment或者StatefulSet接管Pod的生命周期,保持多个Pod在集群中处于存活状态
  • 配置Pod反亲和性,保证Pod分布在不同的节点,防止单节点部署的情况出现
  • 使用Service接管Pod网络,让服务拥有负载均衡和故障转移的能力
  • 为Pod配置探针,让K8s能及时感知Pod的异常状态

实现原理

在动手开发扫描工具之前我们需要先明确一下扫描的规则。 基本上我们需要注意以下扫描规则。

  • 在K8s中维护Pod生命周期的在线对象有DaemonSet、Deployment和StatefulSet,但是只有Deployment和StatefulSet需要扫描副本数量和Pod反亲和性,因为DaemonSet本身保证在每个节点上都会且只会启动一个Pod。
  • 对于针对探针的扫描,在原则上readiness探针是必须设置的,没有设置readiness探针是一个错误(error)。而如果没有设置liveness探针可以抛出一个警告(warning)来具体分析,因为在低版本的K8s上没有启动探针的情况下,有些项目需要担心liveness探针引起的无限重启问题。启动探针优先级最低,可以根据项目情况选择扫描或者不扫描。
  • 除了要扫描Pod是否设置了探针,一般还需要计算出探针判断一个Pod处于异常状态所需要的最长时间。在第3章介绍过探针需要一定的时间来检测容器状态,而根据相关参数的配置不同,需要的时间也不同。大家需要将这个时间也计算出来,因为在高可用的测试中,服务的恢复时间也是一个重要的指标。
  • Job、CronJob等离线业务原则上不在扫描名单中,因为离线业务一般不在高可用测试的范围内。但其实仍然有一个扫描项目是对所有Pod生效的,就是扫描Pod是否配置了节点亲和性或者节点选择器这些调度策略,因为如果Pod没有配置调度策略则意味着Pod是随机调度到集群中任何一个节点上的。这样的随机调度策略理论上是很不安全的,因为如果K8s集群的主节点上被调度了一个I/O密集型的计算任务的话,它的I/O很可能会把主节点冲垮导致整个集群出现问题,所以基于稳定性考虑我们也需要针对调度策略进行扫描。

代码实现

了解清楚背景和实现原理后,接下来,我们就使用豆包 MarsCode IDE来实现。

AI实现客户端初始化

首先,进行客户端的初始化,直接使用AI助手来完成,看看AI实现效果,然后再进行改进。
在对话框中,输入“使用go实现k8s客户端的初始化,最好可以封装实现”,AI实现效果如下图:

image.png

image.png

 如截图所示,点击代码实例中的复制或者插入光标处,就可以使用代码了,这是我常用的方式,当然也可以点击添加至新文件。

哈哈,看着还不错,直接可以使用。

AI协助解决编译报错

我们先不急着实现之后的代码,先来编译看看效果,在控制台输入go build -o ./kubescan ./main.go ,会看到控制台报错,如下图

image.png

截图可以看到有一个AI修复按钮,点击这个按钮,会自动将错误提交给AI,得到错误解决方案,如下图

image.png

可以看到解决方案还是靠谱的,根据解决方案进行修改后,再次执行go build -o ./kubescan ./main.go会看到编译成功了,编译可能需要等待一小段时间。
笔者是刚学Go不久,很多语法还不是很熟悉,但是AI助手很大提升了我的编码效率。

AI协助添加注释

接下来,我们在使用AI来给函数添加注释,选中代码,可以快速唤起内嵌对话框,如图所示

image.png

点击注释,会自动生成注释,如图所示

image.png

可以选择使用或者不使用,这里生成的很准确,笔者采用该注释。

AI协助解释代码

接下来,我们在使用AI来解释代码,看看效果如何,还是上面选中的代码,然后点击解释,如下图

image.png

解释还是相当清楚的,最后还有一个总结,应该是一看就明白了。

AI协助生成单元测试

单元测试好多人懒得写,感觉太麻烦,但是单元测试还是必要的,这里借助AI看看是否能快速编写单元测试用例。还是上面选中的代码,点击单元测试,如图所示

image.png

 哈哈,相当可以啊,直接添加到新文件就可以了,效率太高了。

继续高可用扫描工具实现

上面我们已经通过AI完成了客户端的初始化,以及对AI能力使用有了一定的了解。接下来我们继续让AI来协助我们完成高可用工具的实现。

实现遍历pod

我们先获取命名空间下的pod,然后进行遍历,读取每个POD的高可用配置信息,将不符合扫描规则的输出或者保存到数据库即可。
如图所示:

image.png

借助AI来解释代码,爽歪歪,不用自己编织语言来解释。

实现HAScanner 和 Scan 方法

这里就是主要逻辑了,获取pod的高可用配置信息。先定义了两个结构体,如图所示

image.png

还是借助AI解释,我觉得我我自己解释的清晰多了。

接下来实现Scan方法,如图所示

image.png

整体代码还是比较简单的,AI解释的也很清晰,这里不做过多说明了,最后我们看看效果。

image.png

由于VP限制,只有连接代理才可以访问公司的k8s集群,在云端无法执行,所以这是我本地执行的效果,代码是一样的。可以通过pod的高可用配置信息,来确定哪些pod有优化空间。

最后展望

借助豆包MarsCode 很快的实现了这个高可用扫描工具,正如我的项目名称KubeKeeper,守护和管理你的集群,高可用扫描工具只是其中一个功能,后续我们还可以实现资源回收工具、故障注入工具等,期待一起探索吧。


http://www.kler.cn/news/326795.html

相关文章:

  • makefile和CMakeLists/C++包管理器
  • 七、添加攻击音效
  • 汽车出险报告接口介绍及作用
  • Docekrfile和docker compose编写指南及注意事项
  • Android常用C++特性之std::this_thread
  • python14_运算符复合赋值
  • 【韩顺平Java笔记】第4章:运算符
  • SpringIOCDI
  • CaChe的基本原理
  • ECMAScript标准的详细解析
  • sql-labs:42~65
  • AIGC对网络安全的影响
  • ansible之playbook\shell\script模块远程自动安装nginx
  • Python 时间占位符:毫秒的使用
  • TDengine 签约国家电投旗下四大火力发电厂,助力汽轮机振动数据的有效管理
  • 大模型增量训练--基于transformer制作一个大模型聊天机器人
  • 使用 Llama 3.1 和 Qdrant 构建多语言医疗保健聊天机器人的步骤
  • 【CSS in Depth 2 精译_040】6.3 CSS 定位技术之:相对定位(下)—— 用纯 CSS 绘制一个三角形
  • 使用激光定高需要注意的问题以及效果测试与读取
  • 栈:只允许在一端进行插入或删除操作的线性表
  • 王道-计网
  • HTML讲解(三)通用部分
  • 音频编码:PCM【无损音频】
  • 如何保证Redis与数据库的数据一致性
  • 《程序猿之Redis缓存实战 · 字符串类型》
  • 浅谈网络通信中的透传和非透传
  • 01---java面试八股文——springboot---10题
  • rsync+inotify
  • 【KVM】虚拟化技术及实战
  • defineExpose 显式导出子组件方法