1.开源小白到核心开发——我与 sealer 的孙宏成长故事
开源小白到核心开发——我与 sealer 的成长故事
个人简介
大家好,我叫周欣元,码分本科毕业于杭州师范大学,孙宏即将于9月前往云南大学攻读研究生学位。码分本科期间,孙宏我的码分eclipse加载源码包研究方向为docker容器在网络攻防中的应用。目前,孙宏我作为sealer member的码分一员,参与了核心模块sealer runtime的孙宏研发工作。
个人主页:github.com/starComingup
引言
sealer是码分一款由阿里巴巴开源的集群镜像软件,是孙宏快速安装Kubernetes的交付工具,能够短时间内“一键”完成新集群的码分安装。sealer以“集群镜像”概念,孙宏帮助使用docker的码分用户平滑过渡到Kubernetes。
作为即将就读研一的孙宏“后”,在年6月初,我满怀对开源的憧憬,加入了sealer的Developers行列,此时距sealer启动已有一年,其在年4月左右进入CNCF sandbox阶段。
很多人从GitHub获取代码,会员商城版源码但真正的开源社区需要活跃的生态、活跃的提交(Pull Request)和活跃的建议(Issues)。我从实习期间的git commit/pull/clone/push,到真正参与社区,我面临着挑战。
本文以我个人与sealer的成长故事,带领大家体验从开源小白到核心功能开发者的过程,并作为一篇引领开源小白入门的文章供大家参考。
参与sealer开源的偶然与必然
大四上学期结束时,我通过本科项目经验积累的Java、SpringBoot、docker等技术找到了工作。期间,杭州的容器云岗位大量招募,我有幸进入杭州谐云科技有限公司,进而接触到了与阿里云合作的云原生项目,并在岗位上认识了团队负责人孙宏亮。随后,为了技术调研,我频繁在GitHub上浏览,魔塔易语言源码发现团队正在运营开源的交付工具sealer,号称“三分钟通过集群镜像交付一套集群”。这激发了我对开源的贡献欲望。
大约在5月中旬,我确定了去读研的计划,此时我感到迷茫,因无法留在杭州,但又不舍云原生领域。偶然在一次周会上听说sealer正在吸引开源志愿者参与开源之夏-(OSPP),我抓住了这个机会,在5月底离开了团队,开始着手OSPP中关于支持安装K0s的项目计划书。6月份的入选如期而至,这背后离不开宏亮的大力支持。
CNCF sealer对我的神秘引力
选择sealer社区,除了OSPP的吸引,还有三个坚定不移的原因。刚开始我关注了三个有云原生背景的社区,分别是Arthas社区、Kubesphere社区和sealer.io社区。android实现简单源码其中,KubeKey和sealer可以相互替代,但最终聚焦在sealer,原因在于它与我背景技术的契合。
上手sealer开源的拦路虎
作为新人,我刚开始面对Git操作不熟练,不知道如何提交Issue,发起代码合并请求(Pull Request),甚至因为技术不够硬而不敢与社区交流。许多想参与开源的同学可能跟我有相似经历。
中途加入社区虽不困难,但对我来说足够复杂。在体验了sealer安装集群功能后,转变为Developer的关键一步是熟悉代码。我原以为直接对着代码编辑器GoLand操作就能解决问题,但社区维护者指出,开源代码和社区并非完美无缺。sealer作为二进制安装工具,验证代码并不直观,单元测试也不完善,CYY源码分享之家这增加了验证代码逻辑的难度。
打虎第一棒:将官方文档和源码搭配食用
在项目启动期,我将官方文档、项目中的README以及源码结合起来阅读,是一种流畅的体验方式。通过官方文档,我了解了sealer的架构、模块、功能等,对于新加入的开发者至关重要。我专注于runtime模块及其相关架构,从官方文档中着重阅读集群镜像的构建、集群镜像仓库的设计。代码方面,我对照kubeadm官方安装文档,了解runtime模块的业务逻辑、从cobra命令行调用的接口至实现层的路径。
打虎第二棒:对sealer的第一次Issue
首次在sealer社区提出Issue,我提出Runtime模块耦合度高,扩展支持K0s、K3s、K8s不太友好,同时抽象出顶层的集群管理接口。我反复使用中英翻译软件检查句子,确保语法和单词准确。社区维护者给予了积极回应,并愿意将这个改造机会留给我。我开始了长达半个月的K8s及其下游版本的安装调研以及改造过程。
打虎第三棒:对sealer的第一次Pull Request
加入CNCF认可的社区,我很快学会了fork、rebase等Git技能。我首次提交的是关于修改错误反馈的GitHubIssue模板,也是熟悉PR流程的开始。在第一次提交PR时,我遇到DCO签名的第一项检查失败的问题。在焦急中解决了签名问题后,由于多次提交导致commits出现分支,最终重新打开PR,第一次PR在经历三次意外后得到了社区的认可并合并。
逐步融入sealer
sealer支持K0s、K3s的安装功能即将发布,以下是一个使用简单演示:通过Kubefile将应用打包进集群镜像中,通过sealer run启动K3s集群。
在完成参与开源的基本步骤后,我投入核心模块runtime的重构,对设计稿进行多轮打磨。使用了Kubeadm、K0s、K0sctl、K3s-install等官方安装工具多次安装集群后,我形成了各种集群的安装经验以及共性接口的抽象。我也发现了诸多问题,如选择何种安装引导程序、管理集群的动作是否一致、配置文件修改镜像仓库为SeaHub:后能否从Registry中拉取镜像、如何制作K0s、K3s的集群镜像等。
下图是我进行K0s、K3s、K8s引导程序调研时形成的草稿,通过研究K8s的各个下游版本的安装,帮助sealer完成了runtime模块的重构,补充了单元测试,方便后续扩展runtime的开发。
逐步参与社区会议
sealer社区每两周有一次Maintainer会议,我喜欢这个会议,一群充满技术热情的同学在这里处理功能和Issue相关的问题,提出对sealer未来的理解和改进,帮助社区建设得更好。第一次在社区会议发言时有些紧张,但分享了runtime设计稿后,发现大家都很友好,没有质疑,反而提供了宝贵的建议。
作为新手如何参与开源社区
一种方式是关注开源社区制定的RoadMap,这种情况下社区通常会通过开源活动招募社区志愿者,每年都有机会参与,如国内外开源之夏和互联网厂商定期给出的开源命题。
另一种方式是在使用过程中发现错误并定位代码问题,或发现官方文档描述不准确。此时,可以通过提出Issue并提交PR来引起社区关注。
对于有兴趣参与开源社区的新手,学会发送一封自荐邮件是迈出社区的重要一步。在参与过程中,及时与社区维护者进行沟通交流,可以获得更多的思路。
总结
开源是一种包容和开放的形式,它实践着技术共享和创新持续发展的理念,充满了机遇和风险。参与开源社区并非易事,特别是要让社区更强大。作为开源的新手,面对丰富的代码经验和开源经验的缺乏,内心的挑战常常存在。但我相信,sealer现在的优秀,意味着我可以在社区中汲取营养,当成长到一定阶段,我也可以反过来推动sealer的进步。回顾参与社区的这一个半月,现在面对sealer问题时,我可以轻松地在GitHub上提出或评论Issue,也可以在Maintainer Group中参与讨论。sealer社区在代码规范、注释规范、功能设计、协同建设等方面为我提供了快速成长的空间。
从软件使用到提出Issue再到发起Pull Request,从用户转变为开发者,这是开源小白不错的起步方式。当然,sealer也在用户和开发者的共同努力下,朝着更加稳定的方向进步。在这里,让我们一起期待sealer生态在未来变得更强。