3. Operator 模式基础:概念、CRD、Controller 与 Reconcile 循环
Operator 是 Kubernetes 生态中实现“应用感知”自动运维的核心模式。它将运维人员对特定应用的管理知识(扩缩容、备份、升级、故障恢复)编码为软件,以扩展 Kubernetes 控制面的方式持续运行。理解 Operator 的底层模式是后续实现租户隔离复核的前提。
3.1 Operator 核心概念
Operator 本质上是 特定领域的控制器,它通过监听自定义资源(CR)的变化,驱动系统当前状态(Current State)向用户期望状态(Desired State)收敛。其核心价值在于:
- 领域知识代码化:将人工运维手册(Runbook)转化为自动化逻辑。
- 声明式管理:用户只需声明“想要什么”,Operator 负责“如何实现”。
- 无状态控制面:Operator 本身通常无状态,状态全部存储在 Kubernetes API 中。
3.2 CRD 与 Controller:Operator 的两大支柱
Operator 由两个核心组件构成:自定义资源定义(CRD)和自定义控制器(Controller)。二者通过 Kubernetes API 进行交互。
| 组件 | 角色 | 存储位置 | 生命周期 |
|---|---|---|---|
| CRD | 定义新的资源类型(如 RedisCluster)及其结构(Schema) |
etcd(通过 API Server) | 集群级,安装后长期存在 |
| Controller | 监听 CR 实例的变化,执行调谐逻辑(Reconcile) | Pod 内运行(无状态) | 随 Deployment 启动/停止 |
CRD 定义了“数据模型”,Controller 定义了“处理逻辑”。用户通过 kubectl apply 创建 CR 实例时,API Server 将其存入 etcd,Controller 通过 Watch 机制感知变化并触发调谐。
3.3 Reconcile 循环:Operator 的心脏
Reconcile(调谐)循环是 Controller 的核心执行逻辑。它不是一个持续运行的进程,而是一个事件驱动的循环:每当 CR 发生变化、关联资源发生变化或发生周期性重同步时,Reconcile 函数被触发。
标准 Reconcile 循环包含以下步骤:
- 读取期望状态:从 CR 实例中获取用户声明的期望值(如副本数、版本号)。
- 读取当前状态:查询集群中实际运行的子资源(如 Pod、Service、PVC)。
- 差异比较:对比期望状态与当前状态,生成操作列表(创建、更新、删除)。
- 执行调谐:通过 API Server 创建/更新/删除 Kubernetes 资源。
- 更新状态:将调谐结果写回 CR 的
status字段。 - 返回结果:返回
RequeueAfter或Done,决定是否立即再次入队。
3.4 Operator SDK 简介
Operator SDK 是 Red Hat 主导的开源框架,用于简化 Operator 的开发。它提供了脚手架、代码生成器和测试工具,让开发者专注于业务逻辑而非基础设施。
Operator SDK 支持三种开发语言/模式:
| 模式 | 语言 | 适用场景 | Reconcile 实现方式 |
|---|---|---|---|
| Go | Go | 生产级、高性能、复杂逻辑 | 原生 Reconcile 函数 + controller-runtime |
| Ansible | YAML/Playbook | 运维团队、快速原型、已有 Ansible 资产 | Ansible Runner 封装 Reconcile |
| Helm | Helm Chart | 简单应用打包、参数化部署 | Helm 安装/升级作为 Reconcile |
使用 Operator SDK(Go 模式)创建 Operator 的标准流程:
# 1. 初始化项目
operator-sdk init --domain=example.com --repo=github.com/example/redis-operator
# 2. 创建 API 和 Controller
operator-sdk create api --group=cache --version=v1 --kind=RedisCluster --resource=true --controller=true
# 3. 实现 Reconcile 逻辑(编辑 controllers/rediscluster_controller.go)
# 4. 生成 CRD 清单
make generate
make manifests
# 5. 构建并部署
make docker-build docker-push IMG=myregistry/redis-operator:latest
make deploy IMG=myregistry/redis-operator:latest
Reconcile 函数中,开发者需要手动添加租户身份提取、资源归属校验和跨租户操作拦截。后续章节将详细演示如何在 SDK 生成的代码中嵌入这些安全控制。
3.5 本章小结
Operator 模式通过 CRD 扩展 Kubernetes API,通过 Controller 中的 Reconcile 循环实现自动化运维。Operator SDK 降低了开发门槛,但默认实现不包含租户隔离能力。在后续课程中,我们将基于 Go 模式 Operator,在 Reconcile 循环的关键节点注入租户身份校验逻辑,构建安全的租户隔离复核机制。