3. Operator 模式基础:概念、CRD、Controller 与 Reconcile 循环

Operator 是 Kubernetes 生态中实现“应用感知”自动运维的核心模式。它将运维人员对特定应用的管理知识(扩缩容、备份、升级、故障恢复)编码为软件,以扩展 Kubernetes 控制面的方式持续运行。理解 Operator 的底层模式是后续实现租户隔离复核的前提。

3.1 Operator 核心概念

Operator 本质上是 特定领域的控制器,它通过监听自定义资源(CR)的变化,驱动系统当前状态(Current State)向用户期望状态(Desired State)收敛。其核心价值在于:

  • 领域知识代码化:将人工运维手册(Runbook)转化为自动化逻辑。
  • 声明式管理:用户只需声明“想要什么”,Operator 负责“如何实现”。
  • 无状态控制面:Operator 本身通常无状态,状态全部存储在 Kubernetes API 中。
关键区别: Operator 与普通 Controller 的最大不同在于它管理的是有状态应用(如数据库、消息队列),而 Deployment Controller 管理的是无状态应用。

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 机制感知变化并触发调谐。

CRD 与 Controller 交互架构 用户 kubectl apply API Server 存储 CR 实例 etcd 持久化存储 自定义 Controller Reconcile 循环 创建/更新子资源

3.3 Reconcile 循环:Operator 的心脏

Reconcile(调谐)循环是 Controller 的核心执行逻辑。它不是一个持续运行的进程,而是一个事件驱动的循环:每当 CR 发生变化、关联资源发生变化或发生周期性重同步时,Reconcile 函数被触发。

标准 Reconcile 循环包含以下步骤:

  1. 读取期望状态:从 CR 实例中获取用户声明的期望值(如副本数、版本号)。
  2. 读取当前状态:查询集群中实际运行的子资源(如 Pod、Service、PVC)。
  3. 差异比较:对比期望状态与当前状态,生成操作列表(创建、更新、删除)。
  4. 执行调谐:通过 API Server 创建/更新/删除 Kubernetes 资源。
  5. 更新状态:将调谐结果写回 CR 的 status 字段。
  6. 返回结果:返回 RequeueAfter 或 Done,决定是否立即再次入队。
租户隔离复核切入点: Reconcile 循环中读取 CR 和创建子资源时,是注入租户身份校验的最佳位置。我们可以在步骤 1 和步骤 4 之间插入“租户权限验证”逻辑,确保 Operator 不会跨租户操作资源。
Reconcile 循环标准流程 事件触发(CR 变化) 读取期望状态(CR Spec) 读取当前状态(子资源) 差异比较(Diff) 执行调谐(Create/Update/Delete) 更新 CR Status 租户隔离复核点 在步骤 2 与步骤 5 之间插入租户身份 校验与资源归属检查

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
租户隔离复核注意事项: 使用 Operator SDK 生成的脚手架默认不包含租户隔离逻辑。在 Reconcile 函数中,开发者需要手动添加租户身份提取、资源归属校验和跨租户操作拦截。后续章节将详细演示如何在 SDK 生成的代码中嵌入这些安全控制。

3.5 本章小结

Operator 模式通过 CRD 扩展 Kubernetes API,通过 Controller 中的 Reconcile 循环实现自动化运维。Operator SDK 降低了开发门槛,但默认实现不包含租户隔离能力。在后续课程中,我们将基于 Go 模式 Operator,在 Reconcile 循环的关键节点注入租户身份校验逻辑,构建安全的租户隔离复核机制。