跳转至

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 * * * *

周期性输出字符

周期性输出字符

  1. 编写 YAML 文件

cronjob.yml
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
2. 应用 YAML 文件创建 job

[root@k8smaster001 1]# kubectl apply -f cronjob.yml 
cronjob.batch/hello created
3. 验证

查看 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