2、核心概念:Kubernetes Job、CronJob、Operator模式、自定义资源定义(CRD)
在基于 Kubernetes 编排数据库迁移异步任务之前,必须理解四个核心构建块:Job(一次性任务)、CronJob(定时任务)、Operator 模式(领域自动化)和 CRD(自定义资源定义)。它们共同构成了从“执行一次迁移”到“声明式管理迁移生命周期”的能力阶梯。
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,而是具备结构化字段和状态的自定义对象。
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 四者协同:从任务到编排
在数据库迁移实践中,这四个概念形成清晰的层次关系:
- CRD 定义迁移的“是什么”(What)—— 数据结构与期望状态。
- Operator 实现迁移的“怎么做”(How)—— 调谐逻辑与自动化决策。
- Job 提供迁移的“执行体”(Execute)—— 一次性的迁移容器运行。
- CronJob 提供迁移的“节奏”(When)—— 定时触发增量同步。