2、核心概念:Kubernetes Job、CronJob、Operator模式、自定义资源定义(CRD)

在基于 Kubernetes 编排数据库迁移异步任务之前,必须理解四个核心构建块:Job(一次性任务)、CronJob(定时任务)、Operator 模式(领域自动化)和 CRD(自定义资源定义)。它们共同构成了从“执行一次迁移”到“声明式管理迁移生命周期”的能力阶梯。

Kubernetes 数据库迁移核心概念关系 基础执行层 声明式自动化层 Job 一次性迁移执行 CronJob 定时迁移调度 CRD 自定义资源定义 Operator 自动化控制器 基础执行层说明 • Job:保证 Pod 运行到完成, 失败自动重试,适合一次性迁移。 • CronJob:基于 Cron 表达式, 定期创建 Job,适合定期数据 同步或增量迁移。 声明式自动化层说明 • CRD:扩展 K8s API,定义 Migration 自定义资源。 • Operator:监听 CRD 实例, 自动编排 Job/CronJob 执行 迁移任务,实现“声明式”管理。

2.1 Kubernetes Job:一次性迁移执行单元

Job 是 Kubernetes 中最基础的任务执行原语,保证指定数量的 Pod 成功运行到完成。对于数据库迁移,Job 天然适合执行一次性的 Schema 变更、全量数据导出或导入操作。

特性 说明 迁移场景
运行至完成 Pod 退出码为 0 时标记成功 全量数据迁移完成确认
自动重试 支持 backoffLimit 控制重试次数 网络抖动导致迁移中断
并行执行 支持 completions 和 parallelism 分库分表并行迁移
TTL 清理 ttlSecondsAfterFinished 自动清理 迁移完成后释放资源
实践要点:数据库迁移 Job 应设置合理的 backoffLimit(建议 3-5 次)和 activeDeadlineSeconds(防止迁移卡死)。使用 Init Container 做前置检查,确保目标数据库可达。

Job 迁移示例 YAML

apiVersion: batch/v1
kind: Job
metadata:
  name: db-migration-full
spec:
  backoffLimit: 3
  activeDeadlineSeconds: 3600
  template:
    spec:
      containers:
      - name: migration
        image: my-registry/migration-tool:v1.2
        env:
        - name: SOURCE_DSN
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: source-dsn
        - name: TARGET_DSN
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: target-dsn
        command: ["/bin/migrate", "--full"]
      restartPolicy: Never

2.2 CronJob:定时迁移与增量同步

CronJob 在 Job 之上增加了时间调度能力,使用标准的 Cron 表达式定义执行周期。在数据库迁移场景中,CronJob 主要用于增量数据同步、定期校验和定时清理。

CronJob 特性 迁移用途 注意事项
定时触发 每小时增量同步 迁移时间窗口避开业务高峰
并发策略 Forbid(禁止并发) 防止多个迁移任务冲突
历史保留 保留最近 3 次成功记录 便于回滚和审计
暂停调度 suspend 字段控制启停 迁移窗口期暂停自动同步
最佳实践:增量迁移 CronJob 建议设置 concurrencyPolicy: Forbid,避免前一次迁移未完成时再次触发。使用 startingDeadlineSeconds 处理调度延迟场景。

CronJob 增量同步示例

apiVersion: batch/v1
kind: CronJob
metadata:
  name: db-incremental-sync
spec:
  schedule: "*/30 * * * *"
  concurrencyPolicy: Forbid
  startingDeadlineSeconds: 120
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: sync
            image: my-registry/sync-tool:v1.2
            env:
            - name: LAST_SYNC_TIME
              valueFrom:
                configMapKeyRef:
                  name: sync-config
                  key: last-sync-time
            command: ["/bin/sync", "--incremental"]
          restartPolicy: Never

2.3 自定义资源定义(CRD):扩展 K8s API

CRD 允许在 Kubernetes 集群中定义新的资源类型,将数据库迁移抽象为 Migration 或 DataSync 等一等公民资源。通过 CRD,迁移任务不再是零散的 Job,而是具备结构化字段和状态的自定义对象。

自定义资源 Migration 结构 Migration 资源实例 spec 迁移声明(期望状态) status 迁移状态(实际状态) metadata 名称、标签、注解 sourceDB targetDB phase completionTime

CRD 定义示例

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: migrations.db-migration.example.com
spec:
  group: db-migration.example.com
  names:
    kind: Migration
    plural: migrations
    singular: migration
    shortNames:
    - mig
  scope: Namespaced
  versions:
  - name: v1
    served: true
    storage: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            type: object
            properties:
              sourceDB:
                type: string
              targetDB:
                type: string
              migrationType:
                type: string
                enum: ["full", "incremental"]
              tableList:
                type: array
                items:
                  type: string
          status:
            type: object
            properties:
              phase:
                type: string
                enum: ["Pending", "Running", "Completed", "Failed"]
              startTime:
                type: string
                format: date-time
              completionTime:
                type: string
                format: date-time

2.4 Operator 模式:迁移自动化的大脑

Operator 是连接 CRD 和实际执行逻辑的控制器。它持续监听自定义资源的变化,将声明式配置转化为具体的 Job、CronJob、Service 等 Kubernetes 原生资源。在数据库迁移场景中,Operator 负责解析 Migration 资源,自动创建迁移 Job,监控执行状态,并更新资源状态。

Operator 组件 职责 迁移场景对应
Reconciler 调谐循环,对比期望状态与实际状态 检查迁移是否完成,失败则重试
Controller 监听 CRD 事件(Add/Update/Delete) 创建/更新/清理迁移 Job
Finalizer 资源删除前的清理逻辑 迁移完成后的临时表清理
Leader Election 高可用部署,避免重复调谐 生产环境多副本部署
关键设计原则:Operator 应遵循“最终一致性”设计,不依赖一次性成功。迁移过程中可能发生 Pod 重启、网络分区等故障,Operator 必须能从中间状态恢复并继续执行。

Operator 调谐循环伪代码

// Reconciler 核心逻辑
func (r *MigrationReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    // 1. 获取 Migration 资源
    migration := &dbmigrationv1.Migration{}
    r.Get(ctx, req.NamespacedName, migration)

    // 2. 根据 phase 执行不同逻辑
    switch migration.Status.Phase {
    case "":
        // 新创建的资源,启动全量迁移
        r.startFullMigration(ctx, migration)
    case "Running":
        // 检查关联 Job 状态
        jobStatus := r.checkJobStatus(ctx, migration)
        if jobStatus == "Completed" {
            r.updatePhase(ctx, migration, "Completed")
        } else if jobStatus == "Failed" {
            r.handleRetry(ctx, migration)
        }
    case "Completed":
        // 清理资源
        r.cleanupResources(ctx, migration)
    }

    return ctrl.Result{RequeueAfter: 30 * time.Second}, nil
}

2.5 四者协同:从任务到编排

在数据库迁移实践中,这四个概念形成清晰的层次关系:

  1. CRD 定义迁移的“是什么”(What)—— 数据结构与期望状态。
  2. Operator 实现迁移的“怎么做”(How)—— 调谐逻辑与自动化决策。
  3. Job 提供迁移的“执行体”(Execute)—— 一次性的迁移容器运行。
  4. CronJob 提供迁移的“节奏”(When)—— 定时触发增量同步。