2. Operator 基础回顾:Operator 模式、CRD、Controller、Reconciler 核心概念
在集群升级前验证 Operator 兼容性,首先需要理解 Operator 的底层运行机制。Operator 本质上是将运维知识编码为软件,通过 Kubernetes 原生 API 扩展实现自动化管理。本节回顾 Operator 模式的四大核心组件:Operator 模式、CRD(Custom Resource Definition)、Controller 与 Reconciler,为后续兼容性检查与资源迁移奠定理论基础。
2.1 Operator 模式:从人工运维到代码驱动
Operator 模式由 CoreOS 在 2016 年提出,其核心思想是将领域专家的运维经验(如备份、扩缩容、故障恢复)封装为 Kubernetes 原生应用。Operator 通过监听集群状态变化,自动执行运维操作,实现“声明式运维”。
| 对比维度 | 传统运维 | Operator 模式 |
|---|---|---|
| 状态管理 | 人工 SSH 登录、脚本执行 | 声明式 API + 自动调和 |
| 扩展性 | 依赖外部工具链 | 原生 CRD 扩展 API |
| 故障恢复 | 人工介入、Runbook 执行 | 自动 Reconciler 循环 |
| 版本升级 | 停机维护、手动迁移 | 滚动升级、原地升级 |
升级前关键检查点: 确认 Operator 的
ClusterServiceVersion(CSV)中声明的 minKubeVersion 是否低于目标集群版本。若 Operator 模式依赖的 API 版本(如 apiextensions.k8s.io/v1)在目标集群中已废弃,则必须提前迁移。
2.2 CRD:自定义资源的契约
CRD 是 Operator 与 Kubernetes API 之间的“数据契约”。它定义了自定义资源(CR)的结构、验证规则和存储版本。每个 CRD 包含以下关键字段:
- group/names/kind:资源的 API 组、名称和类型。
- versions:支持多个 API 版本(如
v1alpha1、v1),需指定storage版本。 - schema:OpenAPI v3 验证规则,控制字段类型与必填项。
- subresources:启用
/status和/scale子资源。
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: etcdclusters.etcd.database.coreos.com
spec:
group: etcd.database.coreos.com
names:
kind: EtcdCluster
plural: etcdclusters
versions:
- name: v1beta2
served: true
storage: false
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
size:
type: integer
minimum: 1
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
replicas:
type: integer
minimum: 3
subresources:
status: {}
升级风险提示: 若 CRD 的
storage 版本在目标集群中不再被支持(例如从 v1beta1 迁移到 v1),所有已存储的 CR 对象必须通过转换 Webhook 或手动迁移至新版本。否则,升级后 CR 将无法被读取,导致 Operator 失控。
2.3 Controller:事件驱动的状态机
Controller 是 Operator 的“大脑”,负责监听资源变化并触发调和逻辑。它通过 Informer 机制与 API Server 保持连接,将事件(Add/Update/Delete)推入工作队列。Controller 的核心工作流程如下:
- 监听:通过
cache.Informer监听 CR 及关联资源(如 Pod、Service)。 - 入队:将事件键(namespace/name)写入
workqueue.RateLimitingQueue。 - 消费:Worker Goroutine 从队列取出键,调用 Reconciler 逻辑。
- 重试:失败时按指数退避重新入队,直至成功或达到最大重试次数。
2.4 Reconciler:期望状态与实际状态的调和引擎
Reconciler 是 Controller 内部的核心函数,负责将集群实际状态调整为 CR 中声明的期望状态。每次调和循环执行以下步骤:
| 步骤 | 操作 | 常见失败场景 |
|---|---|---|
| 1. 读取 | 从 API Server 获取当前 CR 实例 | CRD 版本不匹配导致反序列化失败 |
| 2. 比对 | 对比期望状态(CR.Spec)与实际状态(集群资源) | 依赖的 Deployment API 版本在目标集群中已移除 |
| 3. 执行 | 创建/更新/删除子资源(如 StatefulSet、Service) | RBAC 权限不足或 API 组变更 |
| 4. 更新 | 将调和结果写入 CR.Status | Status Subresource 未启用或写入冲突 |
升级兼容性自测方法: 在测试集群中部署 Operator,手动创建 CR 并触发调和。观察 Reconciler 日志中是否出现
no matches for kind 或 the server could not find the requested resource 错误。这些错误直接表明 Operator 依赖的 API 版本在目标集群中已不可用。
2.5 核心组件关系总览
Operator 的四个核心组件形成闭环:CRD 定义数据模型,CR 存储用户期望,Controller 监听事件,Reconciler 执行调和。下图展示它们之间的协作关系:
2.6 升级兼容性关键结论
- CRD 版本:确保
apiextensions.k8s.io/v1在目标集群中可用(Kubernetes 1.16+ 默认支持,1.22 后移除v1beta1)。 - Controller 依赖:检查 Operator 使用的
k8s.io/api和k8s.io/client-go版本是否与目标集群的 API 兼容。 - Reconciler 逻辑:验证调和过程中创建的所有资源(如
apps/v1Deployment、v1Service)在目标集群中未被废弃。 - 存储版本迁移:若 CRD 的
storage版本在目标集群中不再被服务,需提前编写转换 Webhook 或使用kubectl convert迁移现有 CR。
最佳实践: 在升级前,使用
kubectl convert 命令测试 CR 的版本兼容性,并在测试集群中运行 Operator 的 E2E 测试套件,确保所有调和路径在目标 Kubernetes 版本上均能正常执行。