operator-sdk & kubebuilder
什么是 CRD?
k8s 想必对于程序员同学来讲,早已不是陌生人,越来越多公司已经拥抱 k8s。k8s 中的 service,deployment 等资源可以很好的帮助我们运维容器。说到这里,一个奇怪的想法诞生了,如果 k8s 中的自带资源不足以满足业务需求,需要定制开发资源怎么办?CRD(CustomResourceDefinition)应用而生。通过 CRD 可以使自定义资源像 k8s 中的自带资源一样,为业务提供服务。
operator-sdk kubebuilder 又是什么?
理想很丰满,现实很骨感,CRD 的开发是一件非常复杂的工作。除了业务逻辑外,还要做许多多余的事情,非常不方便。operator-sdk kubebuilder 就是为了解决这个问题存在的。这两个框架会搞定多余的工作,让开发人员专注于 CRD 的业务代码开发。
operator-sdk 由 CoreOS 开发和维护
kubebuilder 由 k8s SIG
一个是在 k8s 领域中表现非常积极的 CoreOS,一个是 k8s SIG(k8s 亲儿子),operator-sdk 和 kubebuilder 该如何选型呢?
operator-sdk & kubebuilder
看到标题,想必大家心里都有了答案。 那就是:选啥都行!原因是 operator-sdk 和 kubebuilder 正在进行深度的整合。下面为大家详细介绍一下两个框架整合的背景。
整合目标
将 kubebuilder 和 operator-sdk 围绕 kubebuilder 项目框架进行整合,将 operator-sdk 的 Go operator 功能酌情移至上游,并联手维护 kube-builder,以便 kubebuilder 和 operator-sdk 都能为基于 Go 的 operator 提供相同的项目结构和命令行界面。
背景
kubebuilder 和 operator-sdk 是类似的项目,旨在简化开发构建 kubernetes operator(或 controller)。这两个项目都广泛使用了 controller-runtime 和 controller-tools 项目,因此构建了类似的 Go 源文件和包结构。
动机
operator-sdk 和 kubebuilder 贡献者合作改进了它们共享的上游依赖,但是与脚手架 Go operator 相关的 operator-sdk 和 kubebuilder 之间依然存在着很大的重叠。这两个项目都有用于初始化新项目并添加新 APIs 和 controllers 的样板实现的命令。
整合 kubebuilder 和 operator-sdk 动机是,与其在 Go operator 的项目脚手架上进行的重复的工作,不如在基于一个实现一起开发,这可以加快两个框架的迭代进度,并可能导致更通用的解决方案。
整合计划
kubebuilder 和 operator-sdk 贡献者创建了一个GitHub项目,以跟踪对齐项目所需的工作。有三个主要主题。
kubebuilder 整合 operator-sdk 代码
operator-sdk 项目包含了 Go operator 开发人员可以使用的各种特性,无论特性是基于 kubebuilder 还是 operator-sdk。这些特性将在适当的时候整合到 kubebuilder、 controller-runtime 和 controller-tools 中。其中包括:
DynamicRESTMapper 可以使 operator 启动后动态自动地发现添加到集群的新 CRD
当资源的 metas.generation 字段已更改时,GenerationChangedPredicate 可以触发 recocile 事件
当构造默认基于 zap 的日志时,可以使用 flags helpers 提供更细粒度的配置
operator-sdk 贡献者计划开始在 kubebuilder(及相关项目)中进行与 Go operator 相关的代码的所有开发,并花费更多时间帮助 kubebuilder 贡献者维护这些项目。
远景
为了使 kubebuilder 更具可扩展性,社区一直在讨论一项建议,向 kubebuilder 添加扩展点以支持不同的 operator 模式。operator 模式的一个示例是使用现有库实例化 API 和控制器的插件模式。
更广泛地说,该想法是增加对基于可执行插件的扩展的支持,该扩展可以在将文件写入磁盘之前修改 kubebuilder 的脚手架,以便该项目(例如 Go 代码,kustomize 模板,项目 Makefile 和 Dockerfile)可以通过扩展自定义内容。
文档
即使其中很大一部分重叠,operator-sdk 和 kubebuilder 当前仍维护独立的文档。通过共同努力,operator-sdk 贡献者将基于 Go 的 operator 文档集成到 kubebuilder 文档中,并与 kubebuilder 贡献者一起保持文档的及时更新。
评论