从零实现一个operator(0)-前期准备

operator基本概念

在官方给出的解释中,operator是K8S用来对定制资源进行管理的组件,它遵守控制器理念。控制器理念是指个非终止回路,用于调节系统状态。

看到以上解释,肯定还是不明白什么是operator,operator这个词是从机器人技术和自动化领域借用过来的,举个例子来说下,假设你有一个非常高级的空调,可以调节室内温度,你希望室内温度在26度左右,这是你的期望值。而控制器换句话说operator,可以保证当前温度就是你的期望状态。

回到K8S本身,K8S本身就有很多这种控制器,举个例子,deployment就是一个典型的控制器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

这里我们只关心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 的核心。

特点:

  1. 代码生成: 提供了命令行工具,可以轻松生成 Operator 所需的代码模板,包括 Custom Resource Definitions(CRD)和 Controller 的基本结构。
  2. 快速开发: 提供了一系列的库和工具,帮助开发者迅速搭建 Operator,减少重复性工作。
  3. 内置测试框架: 集成了测试框架,方便进行单元测试和集成测试。
  4. 支持多版本: 支持 Go 版本的 Operator,可以用于创建不同版本的 CRD。

优势:

  1. 快速开发: 提供了一些开发 Operator 所需的基础设施,可以加速开发过程。
  2. 代码生成: 自动生成大部分模板代码,减少了重复性劳动。
  3. 集成测试: 内置了测试框架,支持容易进行集成测试。

劣势:

  1. 定制性差: 相对于手动实现,可能定制性较差,不够灵活。
  2. 学习成本: 学习使用 SDK 的一些概念和工具可能需要一些时间

kubebuilder

Kubebuilder 是另一个强大的 Operator 开发框架,构建在 controller-runtime 和 controller-tools 之上,提供了更高级的特性。

特点:

  1. 强大的框架: Kubebuilder 提供了一个强大的框架,使开发者能够创建和管理 Kubernetes Operator,同时提供高级的特性。
  2. 代码生成: 类似于 Operator SDK,Kubebuilder 提供了代码生成工具,帮助生成 CRD、Controller 和一些基础代码。
  3. 支持多版本: 支持定义多个 API 版本,方便进行迭代和演进。
  4. 控制器运行时: 使用 controller-runtime 库,提供了用于编写控制器的核心运行时框架。

优势:

  1. 强大的框架: Kubebuilder 是一个基于 controller-runtime 和 controller-tools 的强大框架,提供了一些高级特性。
  2. 代码生成: 类似于 Operator SDK,提供了代码生成工具,减少了开发工作量。
  3. 支持多种 API 版本: 支持定义多个 API 版本,方便进行迭代和演进。

劣势:

  1. 学习成本: 学习 Kubebuilder 框架可能相对较复杂,需要一些时间来掌握。

Kubebuilder 适用于对 Operator 需求较为复杂、需要高级特性的项目。它提供了强大的框架和工具,支持构建复杂的 Operator。

总结

这里我们先使用kubebuilder来实现redis operator,之后再根据kubebuilder去自己实现一套控制器相关代码。

参考链接


从零实现一个operator(0)-前期准备
http://example.com/2024/01/11/从零实现一个operator-0-前期准备/
Author
John Doe
Posted on
January 11, 2024
Licensed under