CronJob介绍 ¶
什么是 CronJob
- 类似于Linux系统的crontab,在指定的时间周期运行相关的任务
- 时间格式:分时日月周
.spec.schedule 字段是必需的。该字段的值遵循 Cron 语法:
# ┌───────────── 分钟 (0 - 59)
# │ ┌───────────── 小时 (0 - 23)
# │ │ ┌───────────── 月的某天 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 周的某天 (0 - 6)(周日到周六)
# │ │ │ │ │ 或者是 sun,mon,tue,web,thu,fri,sat
# │ │ │ │ │
# │ │ │ │ │
# * * * * *
## 周期性输出字符
输入 描述 相当于
@yearly (或 @annually) 每年 1 月 1 日的午夜运行一次 0 0 1 1 *
@monthly 每月第一天的午夜运行一次 0 0 1 * *
@weekly 每周的周日午夜运行一次 0 0 * * 0
@daily (或 @midnight) 每天午夜运行一次 0 0 * * *
@hourly 每小时的开始一次 0 * * * *
周期性输出字符 ¶
周期性输出字符
- 编写 YAML 文件
cronjob.yml
2. 应用 YAML 文件创建 job
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
[root@k8smaster001 1]# kubectl apply -f cronjob.yml
cronjob.batch/hello created
查看 cronjob 资源
[root@k8smaster001 1]# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello * * * * * False 0 <none> 12s
查看 pod 资源
[root@k8smaster001 1]# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-28529808-lmb5j 0/1 Completed 0 26s
查看 cronjob pod 日志
[root@k8smaster001 1]# kubectl logs hello-28529808-lmb5j
Sat Mar 30 08:48:00 UTC 2024
Hello from the Kubernetes cluster
周期性备份 MySQL 数据库 ¶
通过Job控制器创建应用备份MySQL数据库
1. 周期性备份 MySQL 数据库
1. 编写数据库文件 00_mysql.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-test
namespace: default
spec:
ports:
- port: 3306
name: mysql
clusterIP: None
selector:
app: mysql-dump
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: db
namespace: default
spec:
selector:
matchLabels:
app: mysql-dump
serviceName: "mysql-test"
template:
metadata:
labels:
app: mysql-dump
spec:
nodeName: k8sworker001
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "111111"
ports:
- containerPort: 3306
volumeMounts:
- mountPath: "/var/lib/mysql"
name: mysql-data
volumes:
- name: mysql-data
hostPath:
path: /opt/mysqldata
2. 查看调用过程
[root@k8smaster001 1]# kubectl describe pod
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Pulling 2m38s kubelet Pulling image "mysql:5.7"
Normal Pulled 74s kubelet Successfully pulled image "mysql:5.7" in 1m24.279s (1m24.279s including waiting)
Normal Created 74s kubelet Created container mysql
Normal Started 74s kubelet Started container mysql
3. 查看结果
[root@k8smaster001 1]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE
db-0 1/1 Running 0 7s 10.244.87.227 k8sworker001
2. 创建用于 Cronjob 控制器类型资源清单文件
1. 编写 Job 文件 02_cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: mysql-dump
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
nodeName: k8sworker001
containers:
- name: c1
image: mysql:5.7
command: ["/bin/sh","-c","mysqldump --host=mysql-test -uroot -p111111 --databases mysql > /root/mysql`date +%Y%m%d%H%M`.sql"]
volumeMounts:
- name: mysql-data
mountPath: "/root"
restartPolicy: Never
volumes:
- name: mysql-data
hostPath:
path: /opt/mysqldump
2. 应用 YAML 文件创建 cronjob
[root@k8smaster001 1]# kubectl apply -f 02_cronjob.yaml
cronjob.batch/mysql-dump created
3. 查看 cronjob 资源
[root@k8smaster001 1]# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
mysql-dump */1 * * * * False 0 15s 2m28s
4. 查看 pod 资源
[root@k8smaster001 1]# kubectl get pod
NAME READY STATUS RESTARTS AGE
db-0 1/1 Running 0 3m13s
mysql-dump-28529823-pc5dh 0/1 Completed 0 2m51s
mysql-dump-28529824-l976t 0/1 Completed 0 111s
mysql-dump-28529825-p64nm 0/1 Completed 0 51s
5. 查看 cronjob 生成的 备份文件
[root@k8sworker001 mysqldump]# pwd
/opt/mysqldump
[root@k8sworker001 mysqldump]# ls
mysql202403300903.sql mysql202403300904.sql mysql202403300905.sql mysql202403300906.sql