开源小白到核心开发——我与 sealer 的成长故事
简介: 下面将以作者本人与 sealer 的一段成长故事来带领大家体验从小白到核心功能开发者的开源之旅,同时本文也作为一篇引领开源小白入门的文章供大家参考。
作者:周欣元
个人简介
大家好,我是周欣元,本科就读于杭州师范大学,今年 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 项目!
原文链接:https://click.aliyun.com/m/1000359524/
本文为阿里云原创内容,未经允许不得转载。
开源小白到核心开发——我与 sealer 的成长故事的更多相关文章
- 从开源小白到 Apache Member,我的成长之路
我们走过的每一步路,都会留下印记,越坚实,越清晰. 近日,Apache 软件基金会(ASF)官方 Blog 宣布全球新增 40 位 Apache Member,张乎兴有幸成为其中一位. 目前,全球共有 ...
- openfire:基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件
基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件 上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfir ...
- 基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件
原文:http://www.cnblogs.com/hoojo/archive/2013/03/29/openfire_plugin_chatlogs_plugin_.html 随笔-150 评论- ...
- Slickflow.NET 开源工作流引擎高级开发(三) -- 并行分支容器与会签工作流模式的组合
前言: 流程引擎的核心功能是负责解析流程定义XML和流转,业务环节的不断积累,让人们不断总结和抽象出一些模式,这些模式统称为工作流模式(Workflow Pattern).本文的重点就是介绍一种常见 ...
- 小白自制Linux开发板 二. u-boot移植
上一篇:小白自制Linux开发板 一. 瞎抄原理图与乱画PCB 中我们做了一个小型而没用的开发板,用的是Licheepi Nano的镜像,那从本篇开始我们开始自己构建它的灵魂吧. 我们都知道,PC在 ...
- 开源项目|Go 开发的一款分布式唯一 ID 生成系统
原文连接: 开源项目|Go 开发的一款分布式唯一 ID 生成系统 今天跟大家介绍一个开源项目:id-maker,主要功能是用来在分布式环境下生成唯一 ID.上周停更了一周,也是用来开发和测试这个项目的 ...
- GJM : Taurus.MVC 2.0 开源发布:WebAPI开发教程 [转载]
Taurus.MVC 2.0 开源发布:WebAPI开发教程 转载自http://www.cnblogs.com/cyq1162/p/6069020.html 因是新手 粘贴时有一个版权问题 本文原 ...
- 2016年1月25日 《1024伐木累》-小白篇之开发网站,三天!(中篇-2奇怪的IE)-总章节十一
往期回顾: 老王的“先见之明”,解决了困扰耗仔三人的大难题.顺利安装完开发工具,大家投入紧张的工作.航空部领导的突然闯入,IE不兼容,页面错乱,摆在三人面前的形势依然严峻.第一次见这阵仗的耗仔,又会 ...
- HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口
1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...
- 电脑小白学习软件开发-C#语言基础之循环重点讲解,习题
写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用视频. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是不在话下. 本教程是基础教程,适合任何有志于学习软件开发的 ...
随机推荐
- python queue模块实例解析
一 概念: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,是一种操作受限制的线性表. 进行插入操作的端称为队尾,进行 ...
- 蓝牙BLE无线控制氛围灯解决方案之特色解析
谁的方案? 前几天和一个小伙伴讨论方案公司的价值,他给出定位还是比较准确地,作为一家方案公司,就是让产品公司,低成本,快速的推出具有市场竞争力的产品.凭借着本团队在无线蓝牙领域的深耕,这些年也做了 ...
- drf(路由)
一 自动生成路由 基本使用 # 视图类,继承了ViewSetMixein,路由 # path('books/', views.BookViewSet.as_view(actions={'get': ' ...
- Prompt进阶系列4:LangGPT(构建高性能Prompt实践指南)--结构化Prompt
Prompt进阶系列4:LangGPT(构建高性能Prompt实践指南)--结构化Prompt 1.结构化 Prompt简介 结构化的思想很普遍,结构化内容也很普遍,我们日常写作的文章,看到的书籍都在 ...
- spring boot @Scheduled
例子 @EnableScheduling @Component public class Job { /** * 每秒执行一次 */ @Scheduled(cron = "0/1 * * * ...
- KingbaseES V8R6 复制冲突之锁类型冲突
背景 昨天遇到客户现场的一个有关复制冲突的问题 备库报错:ERROR: canceling statement due to conflict with recovery,user was holdi ...
- IDEA代码缩略图插件CodeGlance
打开IDEA设置Settings,选择Plugins,搜索CodeGlance. 点击Install,安装完成后重启即可. 效果如下:
- Git 安全远程访问:SSH 密钥对生成、添加和连接步骤解析
使用 SSH 密钥对的 Git 安全远程访问:生成.添加和连接 SSH(Secure Shell)是一种用于安全远程访问的协议,它提供了加密通信和身份验证机制.在使用 SSH 连接到远程 Git 存储 ...
- 掌握 C++ 中 static 关键字的多种使用场景
static是什么 在最开始C中引入了static关键字可以用于修饰变量和函数,后来由于C++引入了class的概念,现在static可以修饰的对象分为以下5种: 成员变量,成员函数,普通函数,局部变 ...
- QImage将图片白色背景修改为透明色
// 改透明色 QImage setImageColor(QImage img) { QImage img_color = img.convertToFormat(QImage::Format_RGB ...