你甚至可以在业余时间参与最大的开源项目之一的内部工作。

2018年10月,我开始为Kubernetes (K8s)做贡献,那时我在IBM的产品安全事件响应团队工作。我被分布式系统所吸引,但日常工作中接触不到,所以我的导师,孙林,建议我在空闲时间为开源的分布式系统做贡献。我开始对k8s感兴趣,再也没有回头。

我主要在Kubernetes测试、存储和发布特别兴趣组内工作。我最为人所知的代码贡献是在Saad Ali的带领下实现了插件管理。插件管理器是一个管理插件注册/注销的控制器。它给Kubelet插件注册在注册插件(如容器存储接口或设备插件)失败场景下,添加了重试和指数退避逻辑。

2019年1月,我成为k8s的会员,并于2019年7月作为开源贡献和开发倡导者加入IBM开放技术组,目前我正在为Knative,一个基于Kubernetes的无服务器负载部署和管理平台,做贡献。

现在Kubernetes非常欢迎贡献者,如果你想跟着我的足迹,在空闲时间开始贡献,继续阅读。

开始为Kubernetes做贡献需要的技能

任意的版本控制系统(如git,svn)

K8s的源代码托管在Github,了解如何使用Git或者其它版本控制系统是非常重要的。首先,使自己熟悉这些常见命令

Golang

我有C/C++的使用背景,但在开始前我并不了解Golang。如果你熟悉面向对象编程,Golang应该相当容易上手。我建议在学习K8s代码库的同时学习Go。我的同事黄伟向我介绍Ultimate Go编程系列,它极大地帮助了我。

其它要求

在你的提交可以被合并到K8s代码库之前,必须签署贡献者许可协议(CLA)。还要注意社区准则、编码准则、如何设置你的开发环境以及其它Kubernetes Github代码库中的“开始贡献之前”描述的事。

如何选取你的第一个Kubernetes问题

在Kubernetes中找事做的首要的方法是查看开放问题列表,你可以用标签,如好的第一个问题,需要帮组,过滤问题列表,这些标签表明这个问题对新手非常友好。偶尔问题会被打上错误标签,也许问题的技术难度被低估了,并被错误的标记为好的第一个问题。所以一个“好的第一个问题”比你预料的更复杂也不必惊讶。


第二个找事做的方法是搜索代码库里的“TODO”。这里有上百个低优先级的改善。学习代码库和从某人的“TODO”列表移除某一项是非常好的学习方法-双赢。

如何处理问题

阅读任何与之相关的问题或拉取请求(PRs)来帮助你理解上下文和问题本身。如果某个问题描述不清楚,在投入时间之前,确保联系问题的创建者以获得更清晰的理解。如果它是一个错误,验证你是否能复现错误。请注意这可能会花费很多时间,我花了很多时间去设置环境以尝试复现错误。

一旦你有解决方案的想法,在拉取请求之前最好在Slack上联系问题的创建者,验证你的方法。如果在一周之内没有收到反馈,直接发起拉取请求这样他可以对具体方案做评论。

起初我非常困惑就一个问题发起讨论之后,需要多快提交PR。因为我不得不在全职工作以外的时间为K8s工作。我还在思考这会如何影响我的工作-生活平衡。在浏览了问题和其它拉取请求后,我发现我需要在两周内提供PR或者更新问题的状态。在我看来,如果你有一个初始的、没做测试的实现,也可以提交初步的PR,这样可以尽快得到是否步入正轨的反馈。

在开发你的方案的时,确保添加了单元测试或集成测试以验证错误已修复或者特性和预期的一样。K8s使用名为Prow的持续集成/持续开发(CI/CD)系统,它会为有 /ok-to-test 标签的PR运行所有的单元和集成测试。CI任务不会自动执行如果你不是Kubernetes项目的成员。这种情况下,我建议你先本地测试,然后在相关的特别兴趣组Slack频道找Kubernetes Github组织成员去你的PR评论 /ok-to-test。

如何加入Kubernetes社区

对于每天的交流,Kubernetes Slack非常适合直接和其他贡献者联系并请教问题。我建议你加入自己最感兴趣的特别兴趣组(如客户端、存储、测试等)频道。

KubeCons是与其他贡献者面对面交流的好地方。20192020年9月在北美有一次,3/4月在欧洲有一次,5月在亚洲有一次。 我强烈推荐有抱负的新手和经验丰富的贡献者参与下面的两项活动:

  • Kubernetes贡献者峰会:在KubeCon正式开始的前一天,一整天活动都是免费的。既有为新人也有为贡献者准备的聚焦于学习和开发的工作坊。
  • 交流和辅导环节:在这里,你可以和许多包括Kubernetes在内的CNCF项目中资深的开源人士会面。你将和其他两位结对探讨技术和社区问题,甚至可以就选取的问题做结对编程。

其他贡献方式

除了贡献代码,还有许多其它的贡献方式。审查代码很重要,因为这可以帮助审查者和维护者减轻负担并提供多样的观点。也是学习K8s代码库的最佳方法之一。

你还可以加入发布小组作为角色的影子,为Kubernetes发布流程做贡献。访问角色手册学习更多发布团队中的不同角色。我曾作为测试基础架构的影子领导两个版本发布直到我们自动化了整个流程,并取消了这个角色。

成为一个影子教会我很多,包括CI/CD自动化和一个高度可视化的、影响全世界公司的产品背后的项目管理。发布团队的持续贡献以自动化任务和消除所有角色的手动任务来达到更好的CI/CD给我留下了特别深刻的印象。

如果你对成为一个影子感兴趣,查看正式的申请流程

如果你在空余时间参与K8s,一个需要注意的问题是:每周有发布团队会议,但是不要求影子所有的会议都参加。会议通常在美国太平洋时区的工作时间进行,持续半小时。幸运地是我的工作很灵活足以让我每周预定2~3次会议室参加发布团队的会议。

如果你有全职工作,如何管理时间

每周设定用于贡献K8s的小时数非常有帮助,因为非常容易陷入开发活动中。当你工作和生活变得忙的时候,暂时停止对K8s的贡献也非常重要。k8s开发社区的宕机时间通常和一个发布剪裁的代码冻结期一致。
对你来说,这是短暂休息的好时机,因为在这期间其它贡献者基本不会参与贡献。你不太可能得到PR或者Slack消息的回复。

让你的团队和经理了解你的新爱好是很好的事,因为分享你的知识可能会有所帮助。如果你的团队或者公司使用Kubernetes(或者任何容器技术),会因为你了解K8s的原理而受益。如果不,与你的团队分享Kubernetes中工业界的趋势、软件工程设计模式和架构设计决策也是非常棒的。考虑举办这些话题的每月讲座,介绍你在kubeCon或其它会议中学到的内容。

总结

为K8s做贡献是我最有意义的经历之一,编程以前只是一份工作,但是现在它也是一个爱好。如果你工作不是特别苛刻,我强烈建议你试一试。

资源