环境说明


1. Operator 是什么

Kubernetes Operator 是一种封装、部署和管理 Kubernetes 应用的方法。

如欲了解更多细节,请阅读:

简单来讲:

常用的 Operator 开发框架:

下面介绍如何使用 kubebuilder 开发 Operator。

说明:

  1. kubebuilder book:https://book.kubebuilder.io/quick-start.html
  2. kubebuilder Github:https://github.com/kubernetes-sigs/kubebuilder

2. 安装 kubebuilder


3. 创建测试项目


4. 初始化项目

当看到如下输出时,表明初始化成功:

说明:

  1. config/default/kustomization.yaml 中的 namespace 字段用于为所有资源添加命名空间。在这里它是 kubebuilder-operator-demo-system

5. 创建 API

创建成功后,项目结构如下:

说明:

  1. apiVersion 为 testapp.timd.cn/v1
  2. kind 为 Redis

6. 创建测试 CRD

api/v1/redis_types.goRedisSpec 结构体的定义改为:

创建 test/redis.yaml 文件,其内容为:

安装:

如果通过在线脚本下载 kustomize 失败,可以使用代理;或自己下载 kustomize,然后放到 bin/ 目录下

查看刚刚创建的 CRD:


7. 在本地运行

controllers/redis_controller.goReconcile() 方法的定义改为:

注意:

  1. 导入 fmt 包

在一个窗口运行:

在另一个窗口运行:

查看第一个窗口的日志;用 kubectl 查看刚刚创建的 CR:


8. 添加验证

CRD 通过在 validation 区域使用 OpenAPI v3 模式的方式支持声明式验证(declarative validation)。

通常,验证标记(validation markers)被附加到字段或类型,如果定义复杂验证,必须重用验证,或必须验证切片元素,最好定义新类型来描述验证。

比如:

如欲了解更多关于验证的细节,请查看 https://book.kubebuilder.io/reference/markers/crd-validation.html

api/v1/redis_types.goRedisSpec 的定义修改为:

安装:

查看 CRD:

可以看到类似下面的输出:

测试验证:

可以看到类似下面的错误:


9. 添加 Webhook

9.1. 创建 Webhook:

api/v1/redis_webhook.goValidateCreate() 方法的定义修改为:

注意:

  1. 导入 errors 包
9.2. 安装 cert-manager

下载页面在:https://github.com/cert-manager/cert-manager/releases

执行如下命令安装:

查看 Pod,确认启动成功:

注意:

  1. 需要为 dockerd 配置代理或 registry-mirrors,否则拉取镜像可能会失败
9.3. 修改配置文件

config/default/kustomization.yaml 中:

config/manager/manager.yaml 中的如下两行:

之间插入:


10. 在 Kubernetes 集群外运行 Operator

  1. 获取 Temp 目录,比如在 macOS 上是环境变量 TMPDIR 的值

  2. 创建保存证书的目录

  3. 获取 tls.crt

  4. 获取 tls.key

  5. 获取 ca.crt

  6. 运行

  7. 测试

    • 将 test/redis.yaml 中 .spec.port 的值修改为 6379
    • 执行 kubectl apply -f test/redis.yaml,然后观察日志
    • 执行 kubectl get redis 查看创建的 CR

11. 将 Operator 部署到 Kubernetes 集群

将前面测试过程中创建的 CR、CRD 清理掉:

  • kubectl delete -f test/redis.yaml
  • make uninstall

然后重新安装:

  • make install
  • kubectl get crd redis.testapp.timd.cn

我使用的镜像仓库是免费的腾讯云镜像仓库个人版(https://console.cloud.tencent.com/tcr/repository)。

在开发机上,通过如下命令登陆腾讯云镜像仓库:

在 Kubernetes 集群的每个 node 上:

注意:

  1. 因为部署时,从 gcr.io 拉取镜像,因此需要为 dockerd 设置代理或 registry-mirrors;也可以先从别的镜像源拉取,再打标签
11.1. 构建镜像
11.2. 部署

通过如下命令查看部署状态:

通过如下命令查看 Pod 输出的日志(注意替换 Pod 的名称):

创建 CR,同时观察 Pod 的输出:

多改几次 .spec.port 的值,观察输出。


参考文档

  1. kubebuilder 实战之七:Webhook