2. Kubernetes Operator 概念解析
在进入多集群自动化部署之前,必须先理解 Operator 的本质。Operator 不是一段简单的脚本,而是一种将运维知识编码为软件的 Kubernetes 原生扩展模式。本节从模式定义、与 Controller 的关系、开发工具链和生命周期四个维度拆解 Operator 的核心概念。
2.1 Operator 模式定义
Operator 模式由 CoreOS 在 2016 年提出,其核心思想是:利用 Kubernetes 的自定义资源(CRD)和控制器(Controller),将特定应用或组件的整个生命周期管理逻辑封装为一个可自动运行的程序。这个程序被称为 Operator。
Operator 模式包含三个核心要素:
- 自定义资源定义(CRD):扩展 Kubernetes API,定义应用特有的配置模型(如 RedisCluster、MySQLCluster)。
- 自定义控制器(Controller):监听 CRD 实例的变化,执行调谐循环(Reconciliation Loop),确保实际状态与期望状态一致。
- 运维知识编码:将备份、扩缩容、升级、故障恢复等人工运维操作,以代码形式固化在控制器中。
2.2 Operator 与 Controller 的关系
很多初学者混淆 Operator 和 Controller。实际上,Operator 是 Controller 的一种特殊形式,但二者在抽象层次和职责范围上有明显区别。
| 对比维度 | Kubernetes Controller | Operator |
|---|---|---|
| 管理对象 | 内置资源(Deployment、Service、Job 等) | 自定义资源(CRD 实例) |
| 逻辑复杂度 | 通用、简单(如确保副本数) | 领域特定、复杂(含备份、升级、故障恢复) |
| 运维知识 | 无领域知识 | 深度编码领域运维知识 |
| 扩展方式 | 内置,无需额外安装 | 通过 CRD + 自定义控制器扩展 |
| 典型例子 | kube-controller-manager 中的 ReplicaSetController | etcd-operator、prometheus-operator |
2.3 Operator SDK 简介
手动编写 Operator 涉及大量样板代码:CRD 定义、控制器框架、调谐循环、RBAC 配置等。Operator SDK 是 Red Hat 主导的开源工具,旨在简化 Operator 的开发、测试和打包流程。目前主流版本基于 controller-runtime 库,支持 Go、Ansible、Helm 三种语言/方式。
| SDK 类型 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|
| Go 类型 | 复杂业务逻辑、高性能要求 | 完全控制调谐逻辑,类型安全 | 开发周期长,需要 Go 语言基础 |
| Ansible 类型 | 已有 Ansible Playbook 的运维团队 | 快速将现有自动化迁移为 Operator | 调谐性能受限,调试较困难 |
| Helm 类型 | 已有 Helm Chart 的简单应用 | 开发最快,适合无状态应用 | 无法处理复杂状态和故障恢复 |
Operator SDK 的核心工作流程:
- 初始化项目:
operator-sdk init --domain=example.com --repo=github.com/example/my-operator - 创建 API:
operator-sdk create api --group=cache --version=v1alpha1 --kind=MyApp --resource=true --controller=true - 定义 CRD 结构:在
api/目录下编辑 Spec 和 Status 字段。 - 实现调谐逻辑:在
controllers/目录下编写Reconcile方法。 - 测试:使用
make test运行单元测试,make install部署 CRD 到集群。 - 构建与部署:
make docker-build docker-push IMG=myregistry/my-operator:latest,然后make deploy。
kubebuilder 项目。如果你使用最新版本,建议直接使用 kubebuilder init 命令,其底层依赖与 Operator SDK 一致。本课程示例兼容两种工具链。
2.4 Operator 生命周期管理
Operator 本身也是一个运行在 Kubernetes 上的应用,其生命周期包括安装、升级、扩缩容、健康检查、日志收集、卸载等环节。OLM(Operator Lifecycle Manager)是 Kubernetes 社区推荐的 Operator 生命周期管理框架。
OLM 引入几个关键概念:
| 概念 | 说明 | 类比 |
|---|---|---|
| CatalogSource | Operator 的元数据仓库,类似应用商店 | apt 源 / yum 源 |
| Subscription | 定义用户订阅某个 Operator 及其更新频道 | 订阅杂志 |
| OperatorGroup | 指定 Operator 的目标命名空间范围 | 权限范围 |
| ClusterServiceVersion (CSV) | 描述 Operator 的版本、依赖、部署方式 | RPM 包的 spec |
| InstallPlan | 自动生成的安装/升级计划 | apt install 的执行计划 |
Operator 的典型生命周期流程:
- 发现:用户通过
kubectl get catalogsource查看可用 Operator。 - 订阅:创建 Subscription 资源,指定要安装的 Operator 和更新频道(stable、alpha 等)。
- 安装:OLM 自动解析依赖,生成 InstallPlan,用户批准后执行安装。
- 运行:Operator 以 Deployment 形式运行在集群中,开始管理 CRD 实例。
- 升级:当 CatalogSource 中有新版本时,Subscription 自动触发升级流程。
- 卸载:删除 Subscription 和 CSV,OLM 清理 Operator 及其相关资源。
对于不依赖 OLM 的简单场景,也可以直接通过 kubectl apply 部署 Operator 的 YAML 清单(包含 Deployment、ServiceAccount、RBAC、CRD 等)。这种方式更轻量,但缺少自动升级和依赖管理能力。本课程后续实战将同时覆盖裸部署和OLM 部署两种方式,以适应不同规模的多集群环境。