1. k8s 中数据库备份的 CronJob 与快照
在 Kubernetes 中如何用 CronJob 与快照实现数据库备份?
- CronJob 的定时调度与 Job 生命周期
- 快照(VolumeSnapshot)与逻辑备份
- 与 Operator 对比
CronJob 是 Kubernetes 原生定时任务,按 Cron 表达式在指定时间创建 Job 执行备份。数据库备份在 k8s 中主要有两种方式:1)逻辑备份:通过 CronJob 运行 mysqldump/pg_dump 等工具,将数据导出为文件,上传到对象存储(如 S3);2)快照备份:通过 VolumeSnapshot(由 CSI 提供)对数据库的 PV 做时间点存储快照,快速且具备一致性。CronJob 的实现:定义带备份脚本的 Pod 模板,调度到指定时间执行,Job 完成后可自动清理(historyLimit)。用 CronJob 做备份简单直接,但"裸 CronJob"缺乏状态管理——无法感知备份成功与否、无法做重试/告警/保留策略,也难以与数据库状态(如 lock table、一致性)协调。因此生产实践常由 Operator 在 CronJob 之上封装或直接用 Operator 的备份 CR,以获得状态机、重试与告警。快照备份适合"快速、低侵入"的备份,CronJob 适合逻辑导出与上传。
CronJob 提供"定时触发",快照提供"快速一致性捕获"。裸 CronJob 的局限是无状态与缺乏语义,Operator 用 Backup CR 封装后获得状态机、重试与保留策略,是更完善的方案。
apiVersion: batch/v1
kind: CronJob
metadata:
name: mysql-backup
spec:
schedule: "0 2 * * *"
successfulJobsHistoryLimit: 3
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: backup
image: mysql:8.0
command: ["/bin/sh", "-c"]
args:
- mysqldump --all-databases | gzip | aws s3 cp - s3://backups/db-$(date +%F).sql.gz