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 的核心工作流程如下:

  1. 监听:通过 cache.Informer 监听 CR 及关联资源(如 Pod、Service)。
  2. 入队:将事件键(namespace/name)写入 workqueue.RateLimitingQueue。
  3. 消费:Worker Goroutine 从队列取出键,调用 Reconciler 逻辑。
  4. 重试:失败时按指数退避重新入队,直至成功或达到最大重试次数。
Controller 事件驱动工作流 API Server Informer Work Queue Worker Reconciler 状态更新回写 API Server(Status Subresource) 升级前需确认 Controller 使用的 client-go 版本与目标集群 API 兼容

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 执行调和。下图展示它们之间的协作关系:

Operator 核心组件协作架构 用户 / 管理员 CRD 定义资源结构 CR 实例 声明期望状态 Controller 事件监听与调度 Reconciler 状态调和逻辑 子资源 Pod / Service / PVC 状态回写 升级前需验证:CRD 存储版本 → Controller 依赖 API → Reconciler 创建的子资源 API 版本,三者均需与目标集群兼容

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/v1 Deployment、v1 Service)在目标集群中未被废弃。
  • 存储版本迁移:若 CRD 的 storage 版本在目标集群中不再被服务,需提前编写转换 Webhook 或使用 kubectl convert 迁移现有 CR。
最佳实践: 在升级前,使用 kubectl convert 命令测试 CR 的版本兼容性,并在测试集群中运行 Operator 的 E2E 测试套件,确保所有调和路径在目标 Kubernetes 版本上均能正常执行。