以下是「 豆包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,守护和管理你的集群,高可用扫描工具只是其中一个功能,后续我们还可以实现资源回收工具、故障注入工具等,期待一起探索吧。