使用 Kubernetes CronJob 调度备份脚本是最稳妥原生方案,通过容器化脚本、显式指定 kubectl 路径、挂载 kubeconfig、定时导出资源 YAML 并归档,配合日志记录、失败重试与外部同步实现可靠备份闭环。

直接用 Kubernetes 的 CronJob 调度备份脚本,是最稳妥、最原生的方式。它不依赖宿主机 crond,能统一纳管、权限可控、日志可查,也避免了环境变量缺失、kubectl 命令找不到等常见问题。
写一个专注备份的 Shell 脚本
脚本核心任务是:遍历命名空间,导出指定资源(如 Deployment、Service、ConfigMap、Secret 等)为 YAML 文件,并按时间戳归档。关键点包括:
- 显式指定 kubectl 路径(如
/usr/local/bin/kubectl),避免 PATH 不一致导致命令失败 - 用
kubectl config use-context或--kubeconfig参数确保连接正确集群 - 所有输出重定向到日志文件,同时用
date打时间戳,方便排查 - 创建带日期的子目录(如
/backup/20260613-170502),防止覆盖 - 对 Secret 等敏感资源,可加
--include-uninitialized或跳过导出(因 base64 内容本身已加密,导出 YAML 仍含明文)
打包成容器镜像运行
把脚本和 kubectl 打进轻量镜像(如 alpine:latest 或 debian:slim),确保运行环境干净可控:
- Dockerfile 中明确安装 kubectl(推荐用二进制方式,避免 apt/yum 版本滞后)
- 将脚本 COPY 进镜像并设为可执行:
RUN chmod +x /usr/local/bin/k8s-backup.sh - 镜像启动时直接执行脚本,不依赖 shell 登录态
- 挂载空目录(
emptyDir)或持久卷(如 NFS、S3 兼容存储)用于存放备份文件
用 CronJob 定义定时调度
这是 Kubernetes 原生方案,比在节点上配 crontab 更可靠:
-
schedule字段写标准 cron 表达式,例如"0 2 * * *表示每天凌晨 2 点执行 -
jobTemplate.spec.template.spec.containers中指定你的备份镜像,并传入必要参数(如命名空间列表、备份路径) - 通过
volumeMounts和volumes挂载 kubeconfig 文件(建议存为 ConfigMap 或 Secret) - 设置
restartPolicy: OnFailure,保证失败时重试;用concurrencyPolicy: Forbid防止上次未完成就触发下一轮 - 可选:配置
ttlSecondsAfterFinished自动清理已完成 Job,避免堆积
验证与日常维护
上线后不能只“设完就忘”,需建立基本闭环:
- 用
kubectl get cronjob,cj查看状态,kubectl get job --watch观察最近一次 Job 是否成功 - 进 Pod 日志:
kubectl logs -l job/<job-name></job-name>检查输出和错误 - 定期抽查备份目录,确认 YAML 文件存在、格式合法(可用
kubectl apply --dry-run=client -f xxx.yaml测试解析) - 备份文件建议同步到外部存储(如 S3、MinIO、NFS),并在 CronJob 中调用
aws s3 sync或rclone完成归档


















