特别鸣谢:
k8s cronjob之mysql定时备份_愺艮搥豩的技术博客_51CTO博客
[kubernetes]-使用cronjob定时备份mysql_k8s mysql备份_爷来辣的博客-优快云博客
什么是 CronJobs?
根据Kubernetes 文档,一个 CronJob 对象就像一个 crontab 或 cron 表文件的一行。当您专注于软件开发的其他方面时,它会在后台以 Cron 格式运行预定的 Kubernetes 作业。
下图演示了 CronJob 流程:
如您所见,需要一个复杂的机制来提供一个简单的 cron 功能。Kubernetes 至少需要三个不同的对象(CronJob、Job 和 Pod)来完成 cron 任务。这个实现是有意的。该设计遵循 Kubernetes 的核心原则,即在循环中响应集群中的变化和执行自适应操作。
如图所示,流程如下:
- 用户应用包含两条主要信息的 CronJob 清单:何时执行和做什么。(您可以在下面看到示例配置。)
- 主要逻辑在CronJob 控制器中作为
kube-controller-manager
. 默认情况下,它每十秒检查一次是否应该运行 CronJob。 - 当控制器找到要执行的 CronJob 时(意味着当前时间与通过 cron 语法指定的时间匹配),它将创建另一个名为 Job 的对象。每个作业都跟踪一个特定的调用并包含从 CronJob 继承的关于要做什么的信息。
- Kubernetes 检测到新的 Job 对象后,会立即尝试执行。它将根据 CronJob 通过 Job in 传递下来的配置来安排新 Pod 的创建
jobTemplate
。当 Pod 运行时,它将执行您的 cron 任务。
创建mysql_cronjob
apiVersion: batch/v1
kind: CronJob
metadata:
namespace: default
name: mysql-full-backup-job
spec:
concurrencyPolicy: Allow
#backoffLimit: 6 # 指定job失败后进行重试的次数,默认值是6
failedJobsHistoryLimit: 10 #保留执行失败的历史记录次数,默认值是1。
schedule: "0 1 * * *" # 和linux的crontab规则一样
successfulJobsHistoryLimit: 14 #保留执行成功的历史记录次数,默认值是3。
jobTemplate:
metadata:
spec:
template:
metadata:
spec:
restartPolicy: Never
containers:
- command:
- /bin/sh
- -c
- /var/lib/mysql/script/mysql_bak.sh
image: mysql:8.0.29-debian
imagePullPolicy: IfNotPresent
name: cronjob
volumeMounts:
- mountPath: /var/lib/mysql/script
name: mysql-script
- mountPath: /var/lib/mysql/backup
name: mysql-backup
volumes:
- name: mysql-script
persistentVolumeClaim:
claimName: mysql-config
- name: mysql-backup
persistentVolumeClaim:
claimName: mysql-backup-pvc
创建mysql备份脚本
#!/bin/bash
#
DB_NAME=""
DB_USER=""
DB_PASS=""
DB_HOST=""
DB_PORT=""
DB_BAK_PATH=""
mysqldump -h${DB_HOST} -u${DB_USER} -p${DB_PASS} -P${DB_PORT} ${DB_NAME} > ${DB_BAK_PATH}/${DB_NAME}_`date "+%Y-%m-%d"`.sql
cd ${DB_BAK_PATH}
tar zcf ${DB_NAME}_`date "+%Y-%m-%d"`.sql.tar.gz ${DB_NAME}_`date "+%Y-%m-%d"`.sql
rm -f ${DB_BAK_PATH}/${DB_NAME}_`date "+%Y-%m-%d"`.sql
#cp ${DB_BAK_PATH}/${DB_NAME}_`date "+%Y-%m-%d"`.sql.tar.gz /tmp/ossfs/db_backup/${DB_NAME}_sql_bak/
find ${DB_BAK_PATH}/ -mtime +3 -name "*.tar.gz" -exec rm -rf {} \;
查看计划任务
[root@daliangang deploy]# kubectl get cj -w
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
mysql-full-backup-job 0 1 * * * False 0 <none> 6m19s