从零实现一个operator(0)-前期准备
operator基本概念
在官方给出的解释中,operator是K8S用来对定制资源进行管理的组件,它遵守控制器理念。控制器理念是指个非终止回路,用于调节系统状态。
看到以上解释,肯定还是不明白什么是operator,operator这个词是从机器人技术和自动化领域借用过来的,举个例子来说下,假设你有一个非常高级的空调,可以调节室内温度,你希望室内温度在26度左右,这是你的期望值。而控制器换句话说operator,可以保证当前温度就是你的期望状态。
回到K8S本身,K8S本身就有很多这种控制器,举个例子,deployment就是一个典型的控制器:
1 |
|
这里我们只关心replicas,这是我的一个期望状态,我希望有3个Pod被创建同时在运行。Deployment会创建一个 replicasets, replicasets会帮助我们创建3个Pod。这里先不关心细节。也就说控制器会按照期望值去创建Pod数量。
通过前面的铺垫可以清楚的知道operator是什么了,可以简单粗暴地认为operator=resource+controller,resource就是deployment,replicasets,pod等等。controller就是deployment controller。
K8S中虽然有各种各样的controller,但是肯定也会有K8S不支持的,去修改源码难度太大,并且会造成高耦合。所以K8S提供了CRD(CustomResourceDefinitions)。有了这个我们就可以实现自己的operator了。
demo设计
这里我们设计一个redis operator,这一块像ucloud和ot-redis-operator都是有现成的,一般情况下,可以根据这些去做二次开发,但是因为是从零开始,所以这里就自己造轮子。redis有单机模式(Standalone),集群模式(Cluster),哨兵模式(Sentinel),主从模式(Replication);为了方便,先实现单机模式。
开发工具
- 手动实现
- operator SDK
- kubebuilder
手动实现
手动实现的好处是可以帮助我们更加深入的了解Operator工作原理,但是会增加开发和维护成本。并且会有大量的重复。
operator SDK
Operator SDK 是一个由 CoreOS(现在是 Red Hat 的一部分)提供的开发框架,用于简化 Kubernetes Operator 的创建过程。它主要关注于快速开发、测试和迭代 Operator。Operator SDK 提供了三种主要的 Operator 类型:Go、Ansible 和 Helm。其中,Go 类型的 Operator 是 SDK 的核心。
特点:
- 代码生成: 提供了命令行工具,可以轻松生成 Operator 所需的代码模板,包括 Custom Resource Definitions(CRD)和 Controller 的基本结构。
- 快速开发: 提供了一系列的库和工具,帮助开发者迅速搭建 Operator,减少重复性工作。
- 内置测试框架: 集成了测试框架,方便进行单元测试和集成测试。
- 支持多版本: 支持 Go 版本的 Operator,可以用于创建不同版本的 CRD。
优势:
- 快速开发: 提供了一些开发 Operator 所需的基础设施,可以加速开发过程。
- 代码生成: 自动生成大部分模板代码,减少了重复性劳动。
- 集成测试: 内置了测试框架,支持容易进行集成测试。
劣势:
- 定制性差: 相对于手动实现,可能定制性较差,不够灵活。
- 学习成本: 学习使用 SDK 的一些概念和工具可能需要一些时间
kubebuilder
Kubebuilder 是另一个强大的 Operator 开发框架,构建在 controller-runtime 和 controller-tools 之上,提供了更高级的特性。
特点:
- 强大的框架: Kubebuilder 提供了一个强大的框架,使开发者能够创建和管理 Kubernetes Operator,同时提供高级的特性。
- 代码生成: 类似于 Operator SDK,Kubebuilder 提供了代码生成工具,帮助生成 CRD、Controller 和一些基础代码。
- 支持多版本: 支持定义多个 API 版本,方便进行迭代和演进。
- 控制器运行时: 使用 controller-runtime 库,提供了用于编写控制器的核心运行时框架。
优势:
- 强大的框架: Kubebuilder 是一个基于 controller-runtime 和 controller-tools 的强大框架,提供了一些高级特性。
- 代码生成: 类似于 Operator SDK,提供了代码生成工具,减少了开发工作量。
- 支持多种 API 版本: 支持定义多个 API 版本,方便进行迭代和演进。
劣势:
- 学习成本: 学习 Kubebuilder 框架可能相对较复杂,需要一些时间来掌握。
Kubebuilder 适用于对 Operator 需求较为复杂、需要高级特性的项目。它提供了强大的框架和工具,支持构建复杂的 Operator。
总结
这里我们先使用kubebuilder来实现redis operator,之后再根据kubebuilder去自己实现一套控制器相关代码。