作者:周欣元
个人简介
大家好,我是周欣元,本科就读于杭州师范大学,今年 9 月将去往云南大学进行研究生学习。本科研究方向为 docker 容器在网络攻防中的应用,目前作为 sealer member 加入了核心模块 sealer runtime 的研发工作。
个人主页:https://github.com/starComingup
引言
sealer 是一款由阿里巴巴开源的集群镜像软件,是快速安装 Kubernetes 的交付工具,能够短时间“一键”完成新集群的安装。sealer 主打的“集群镜像”概念能够帮助使用 docker 的用户平滑的过渡到 Kubernetes。
作为准研一“00 后”,在 2022 年 6 月初,我怀着对开源的憧憬加入了 sealer 的 Developers 的队列,此时距离 sealer 启动已经有一年了,在 2022 年 4 月左右进入了 CNCF sandbox 阶段。
我相信很多人都一样,接触到 Github 大多是从上面克隆一个下来然后随便改改交个作业,至少本科如此。而真正的作为一个 Github 良好社区项目,需要有活跃的生态,活跃的提交(Pull Request),活跃的建议(Issues)。而我,凭借实习用起来的 git commit/pull/clone/push 对于加入社区来说无从下手。
下面就以我个人与 sealer 的一段成长故事来带领大家体验从小白到核心功能开发者的开源之旅,同时本文也作为一篇引领开源小白入门的文章供大家参考。
参与 sealer 开源的偶然与必然
大四上学期考完研后,我依靠本科项目经验所积累的 Java、SpringBoot、docker 等技术出来寻找工作。此时恰逢杭州的容器云岗位大量招募,我有幸进到了杭州谐云科技有限公司,并在一个机缘巧合下进入了和阿里云合作的云原生项目中,并在岗位上认识了团队的 Leader–孙宏亮。后面恰逢技术调研需要,天天在 Github 上逛,发现团队正在运营开源的交付工具 sealer,只不过仅仅听说了 sealer 大名–号称“三分钟通过集群镜像交付一套集群”。因此 sealer 在我脑海中蒙上了神秘的面纱,恰逢 4 月底录取通知发出,我想我今后是否能为开源贡献力量。
大概 5 月中旬,我确定了我去读研的计划,这个时候我比较迷茫,因为无法留在杭州,但又不舍坚持三年的云原生领域。偶然一次周会上听说 sealer 正在吸引开源志愿者参加开源之夏-2022(下称 OSPP),我一听:这不是明摆的机会吗?于是我在 5 月底离开了团队,开始着手 OSPP 上 sealer 关于支持安装 K0s 的项目计划书。6 月份的入选如期而至–当然,背后少不了宏亮的鼎力支持。
CNCF sealer 对我的神秘引力
如果说通过 OSPP 参与开源是一种必然,那选择众多的项目中总要有一个理由。刚开始关注了三个均有云原生的社区,一个 Java 调试天花板 Arthas 社区,另一个 Kubesphere 社区,以及 sealer.io 社区,且后两个社区的项目可以说互相替代(KubeKey 和 sealer)。为什么最终聚焦在了 sealer,我想有三个坚定不移的原因:
-
sealer 是 CNCF Sandbox 项目。相信大家多多少少见过 CNCF 的 Landscape 全景图,以及项目成长三个阶段:Sandbox,Incubating,Graduated。我想是否能让一个从沙箱到孵化最终到毕业的项目陪伴我的成长。
-
sealer 具有“集群镜像”这一创新力。作为一个 docker 用户,我赞叹于 dockerfile 以及 docker 镜像技术带来的便利。看到集群镜像后,我又不由自主的想象 sealer 是如何将云基础设施封装于 Kubefile。
-
sealer 充满了更多的挑战,在社区和用户的共同推进中,项目中出现了一些不成熟的地方,这些问题罗列于 RoadMap 和 Issue 中,不止于 OSPP 的任务。
上手 sealer 开源的拦路虎
作为新人可以说,刚加入社区的我不会流畅的 Git,不知道如何提交 Issue,不会发起代码合并请求(Pull Request),甚至因为代码技术不够硬而不敢和社区人员交流,我相信大多数想参与开源的同学和我的处境比较相似。
中途加入社区虽然没有项目启动困难大,但对于一个新手来说也足够复杂。使用 sealer 安装集群体验其功能后,转型为 Developer 的重要一步就是熟悉代码,原以为对着代码编辑器 Goland 开冲就完事,但如同社区维护者所说,“Don’t buy in all",开源代码和社区并不是 100% 优秀。作为二进制安装工具,验证代码并不直观,单元测试不完善,也造成了验证代码逻辑的不少麻烦。
打虎第一棒:将官方文档和源码搭配食用
在 6 月的项目启动期,将官方文档和项目中的 README 以及源码结合起来看,是一种丝滑的体验方式。首先从官方文档我们能了解其架构,模块,功能,这些对于半路上车的新人至关重要。从个人来看,我更专注 runtime 及其相关的架构,官方文档中主要着重阅读集群镜像的构建,集群镜像仓库的设计。代码方面对照 kubeadm 的官方安装文档看 runtime 模块中的业务逻辑、从cobra 命令行调用的接口跟随源代码至实现层。
打虎第二棒:对 sealer 的第一次 Issue
第一个在 sealer 社区的 Issue 比较生猛,上来就提出 Runtime 模块耦合度高,对 K0s、K3s、K8s 的扩展支持不太友好,同时抽象出顶层的集群管理接口。第一次点击 comment 的时候反反复复用中英翻译软件把每个句子都检查了一遍,生怕语法和单词不对。不过很快社区维护者就给出了回应,并表示愿意把这个改造的机会给我,于是我就开始了长达半个月的 K8s 及其下游版本的安装调研以及改造。
打虎第三棒:对 sealer 的第一次 Pull Request
加入一个 CNCF 认可的社区的好处是有 CODE_OF_CONDUCT,CONTRIBUTING 等等的引导文档,我很快学会了 fork、rebase 等 Git 技能。第一次的提交是关于修改错误反馈的 Github Issue 模板,也是首先把 PR 的流程熟悉起来。但在第一次提交 PR 的时候,关于 DCO 签名的第一项检查就失败了,在焦急中折腾了许久,终于把签名给弄好了,结果由于多次的提交,使得 commits 出现了分支。最终直接把这个 PR 又重新 open 了一次,第一次 PR 在 3 次意外后得到了社区的认可并合并。
逐步融入 sealer
sealer 支持 K0s、K3s 的安装功能将在不久后和大家见面了,以下是使用的简单演示,通过 Kubefile 将自己的应用打包进集群镜像中,通过 sealer run 即可启动一个 K3s 集群。
FROM k3s:v1.24.1
COPY imageList manifests
在完成参与开源的基本步骤后,我投入了核心模块 runtime 的重构,开发之前的设计稿打磨了很多个版本,在使用了 Kubeadm、K0s、K0sctl、K3s-install 等官方安装工具多次安装集群后,形成了各种集群的安装经验以及共性接口的抽象。其中也有不少问题的存在,例如:选用何种安装引导程序、管理集群的动作是否一致、配置文件修改镜像仓库为 SeaHub:5000 后能否从 Registry 中拉取镜像、如何制作 K0s、K3s 的集群镜像等等。
下图是我进行 K0s、K3s、K8s 引导程序调研时形成的草稿,通过研究 K8s 的各个下游版本的安装,帮助 sealer 完成了 runtime 模块的重构,补充了单元测试,方便后续扩展 runtime 的开发。
逐步参与社区会议
sealer 社区每两周有一次 Maintainer 的会议,我非常喜欢这个会议,一群有着技术热情的同学,在这里处理一些 Feature 和 Issue 相关的问题,大家有不同的思路,为 sealer 的未来功能和 Bug 提出一些理解,帮助 sealer 社区建设地更好。记得第一次在社区会议发言比较慌张,刚好需要分享 runtime 的设计稿,设计稿已经写得蛮清楚了,但因为要介绍,同时要接受社区维护者的提问,发言的时候有一丝紧张。最终参与下来,发现大家都和蔼可亲,并没有提出质疑,相反给我了很多建议促进了思考。
作为新手如何参与开源的社区
第一种是有明确目标的,开源社区制定的 RoadMap。这种情况下开源社区一般会通过一些开源活动来招募社区志愿者,这样的机会每年都有,例如国内外开源之夏,以及各个互联网厂商定期给出的开源命题,这些命题大多数愿意给学生机会。
第二种是在使用过程中发现错误并定位到代码,或者发现官方文档的描述不准确。这种时候可以通过提 Issue 并提交 PR 来引起社区对个人的关注。
当然,如果有很大的兴趣要参与开源社区,学会发送一封自荐的邮件是迈向社区的重要一步,同时在参与过程中,要及时的和社区维护者进行沟通交流,这样自己会收获更多的思路。
总结
开源是一种包容和开放的形式,引用《开源法则》中的一句话来说:“开源并不是免费的代名词,他是技术开放的成功实践,是创新得以持续发展的原动力,充满着机遇和风险。”
参与开源社区并不是一件轻松的事情,特别是想要将社区维护得更好。作为开源的新手,当没有丰富的代码经验和开源经验的时候,首先容易劝退的就是自己的内心。但作为新人我想:sealer 现在很优秀,那我可以在社区中汲取营养,当成长到一定的程度,那我也可以反过来推动 sealer 的进步。回顾参与社区的这一个半月,现在面对 sealer 问题的时候,我可以轻松的在 Github 上提出或评论 Issue,也可以在 Maintainer Group 参与讨论,sealer 社区从代码规范、注释规范、功能设计、协同建设等方方面面给予了我快速成长的空间。
从软件使用到提 Issue 再到发起 Pull Request,从用户转变为开发者,如此一个参与开源的切入点是开源小白不错的起步方式。
当然,sealer 也在用户和开发者的共同努力下朝着更加稳定的方向进步。在这里,也让我们一起期待 sealer 的生态将在未来更加强大。
欢迎钉钉扫描下方二维码或搜索群号 34619594 加入 CNCF sealer 社区交流钉群!
戳此处,立即了解 sealer 项目!