背景
我们公司最近计划将产品迁移到 Kubernetes 环境。 为了更好地管理和自动化我们的应用程序,我们决定使用 Kubernetes Operator。 本系列博客将记录我们学习和开发 Operator 的过程,希望能帮助更多的人入门 Operator 开发。
目标读者
- 对 Kubernetes 有一定了解的开发人员和运维人员
- 希望使用 Operator 自动化管理应用程序的人员
- 对 Go 语言有基本了解的人员
准备工作
在开始之前,你需要准备以下环境:
Go 语言环境 (>= 1.23): Operator 通常使用 Go 语言开发,你需要安装 Go 语言环境。 建议使用 Go 1.21 或更高版本。 可以从 https://go.dev/dl/ 下载安装包。 安装完成后,请配置好
GOPATH
和PATH
环境变量。Kubernetes 集群: 你需要一个可用的 Kubernetes 集群来部署和测试 Operator。 可以使用 Minikube、Kind 或其他的 Kubernetes 发行版。
kubectl 命令行工具:
kubectl
是 Kubernetes 的命令行工具,用于与 Kubernetes 集群交互。 请确保你已经安装并配置了kubectl
, 并且能够连接到你的 Kubernetes 集群。Kubebuilder (>= 3.0): Kubebuilder 是一个用于快速构建 Kubernetes Operator 的框架。 使用 Kubebuilder 可以简化Operator 的开发流程,并生成一些必要的代码框架。 可以使用以下命令安装 Kubebuilder:
|
|
请确保
$HOME/go/bin
目录在你的PATH
环境变量中。 可以运行kubebuilder version
命令来验证 Kubebuilder 是否安装成功。
- Docker (可选): 如果你需要构建 Operator 的 Docker 镜像,你需要安装 Docker。
我的环境是 MacOS(arm64) + Orbstack
什么是 Operator?
简单来说,Operator 是 Kubernetes 的扩展,它利用自定义资源(Custom Resources, CRs)来自动化管理应用程序。Operator 允许我们像管理 Kubernetes 内置资源一样管理复杂的应用程序,例如数据库、消息队列等。
为什么选择 Operator?
Operator 提供了一种声明式的方式来管理应用程序的生命周期,包括部署、升级、备份、恢复等。它可以简化运维流程,提高自动化程度,并确保应用程序的状态符合预期。
我们的第一个 Operator:Hello World
这个 Operator 将监听一个名为 HelloWorld
的自定义资源,并在 Kubernetes 中创建一个 Pod,该 Pod 运行一个简单的 “Hello World” 应用程序。
1. 初始化 Kubebuilder 项目
首先,我们需要使用 Kubebuilder 创建一个新的项目。 在你的 GOPATH
目录下创建一个新的目录,例如 hello-world-operator
,然后进入该目录,运行以下命令
|
|
这个命令会创建一个新的 Kubebuilder 项目,并生成一些必要的文件和目录。
2. 创建自定义资源(Custom Resource Definition, CRD)
接下来,我们需要定义 HelloWorld
资源的结构。 运行以下命令
|
|
这个命令会创建一个新的 API 定义,包括 api/v1alpha1/helloworld_types.go
和 controllers/helloworld_controller.go
两个文件。
编辑 api/v1alpha1/helloworld_types.go
文件,修改 HelloWorldSpec
的定义,添加 name
和 message
字段:
|
|
3. 实现 Reconcile 逻辑
编辑 controllers/helloworld_controller.go
文件,实现 Reconcile
函数, 创建一个 Pod,该 Pod 运行一个 busybox
镜像,并输出 HelloWorld
资源中定义的 message
。
|
|
4. 安装 CRD 到 Kubernetes 集群
运行以下命令安装 CRD 到 Kubernetes 集群:
|
|
5. 运行 Operator
运行以下命令在本地运行 Operator:
|
|
6. 创建 HelloWorld 资源
创建一个名为 my-hello-world.yaml
的文件,内容如下:
|
|
使用 kubectl apply -f my-hello-world.yaml
创建资源。
7. 验证
使用 kubectl get pods
命令查看是否创建了名为 my-hello-world-pod
的 Pod。 使用 kubectl logs my-hello-world-pod
查看 Pod 的日志,确认是否输出了 “Hello World from Operator!"。
总结
恭喜你完成了第一个 Operator! 虽然这个 Operator 非常简单,但它展示了 Operator 的基本原理:监听自定义资源,并根据资源的状态来管理 Kubernetes 资源。 在接下来的系列中,我们将深入探讨 Operator 的更多高级特性。
敬请期待下一篇博客!