使用豆包 MarsCode 实现高可用扫描工具
以下是「 豆包MarsCode 体验官」优秀文章,作者郝同学测开笔记。
前言
最近接触 K8s,了解到 K8s 提供了非常方便的实现高可用的能力,再加上掘金推出「豆包 MarsCode 初体验」征文活动,所以打算使用豆包 MarsCode IDE 来实现一个高可用扫描工具。 豆包 MarsCode IDE 是一个云端 AI IDE 平台。通过内置的 AI 编程助手,开箱即用的开发环境,详细介绍可以参考官网:docs.marscode.cn/。
准备工作
进入豆包MarsCode,进行注册登录,进入主页面,还是比较简洁的,如下图所示

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

这里提一起这个项目名称的想法,KubeKeeper - 结合了 Kubernetes(Kube)和保护者(Keeper),象征着守护和管理你的集群。哈哈,之后想要做的东西很多,这里先从高可用扫描工具开始。
创建之后,显示英文,感觉不舒服的朋友,可以点击截图所示位置,切换为中文显示

好了,到这里就算准备完成了,可以进入代码实现环节了。整体下来,使用还是比较容易的,不需要过多看文档就可以上手使用了。
项目背景
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 实现效果如下图:


如截图所示,点击代码实例中的复制或者插入光标处,就可以使用代码了,这是我常用的方式,当然也可以点击添加至新文件。
哈哈,看着还不错,直接可以使用。
AI 协助解决编译报错
我们先不急着实现之后的代码,先来编译看看效果,在控制台输入go build -o ./kubescan ./main.go
,会看到控制台报错,如下图

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

可以看到解决方案还是靠谱的,根据解决方案进行修改后,再次执行go build -o ./kubescan ./main.go
会看到编译成功了,编译可能需要等待一小段时间。笔者是刚学 Go 不久,很多语法还不是很熟悉,但是 AI 助手很大提升了我的编码效率。
AI 协助添加注释
接下来,我们在使用 AI 来给函数添加注释,选中代码,可以快速唤起内嵌对话框,如图所示

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

可以选择使用或者不使用,这里生成的很准确,笔者采用该注释。
AI 协助解释代码
接下来,我们在使用 AI 来解释代码,看看效果如何,还是上面选中的代码,然后点击解释,如下图

解释还是相当清楚的,最后还有一个总结,应该是一看就明白了。
AI 协助生成单元测试
单元测试好多人懒得写,感觉太麻烦,但是单元测试还是必要的,这里借助 AI 看看是否能快速编写单元测试用例。还是上面选中的代码,点击单元测试,如图所示

哈哈,相当可以啊,直接添加到新文件就可以了,效率太高了。
继续高可用扫描工具实现
上面我们已经通过 AI 完成了客户端的初始化,以及对 AI 能力使用有了一定的了解。接下来我们继续让 AI 来协助我们完成高可用工具的实现。
实现遍历 pod
我们先获取命名空间下的 pod,然后进行遍历,读取每个 POD 的高可用配置信息,将不符合扫描规则的输出或者保存到数据库即可。如图所示:

借助 AI 来解释代码,爽歪歪,不用自己编织语言来解释。
实现HAScanner
和 Scan
方法
这里就是主要逻辑了,获取 pod 的高可用配置信息。先定义了两个结构体,如图所示

还是借助 AI 解释,我觉得我我自己解释的清晰多了。
接下来实现Scan
方法,如图所示

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

由于 VP 限制,只有连接代理才可以访问公司的 k8s 集群,在云端无法执行,所以这是我本地执行的效果,代码是一样的。可以通过 pod 的高可用配置信息,来确定哪些 pod 有优化空间。
最后展望
借助豆包MarsCode 很快的实现了这个高可用扫描工具,正如我的项目名称 KubeKeeper,守护和管理你的集群,高可用扫描工具只是其中一个功能,后续我们还可以实现资源回收工具、故障注入工具等,期待一起探索吧。
评论