1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

在 Kubernetes 里,集群管理员就像个超级管家,可以用调度任务搞定集群的维护工作,轻松又省心。其他用户也能创建调度任务,给自己的应用做常规维护,很方便呢。

job

作业(job)

咱来说说作业,这就好比是一次性的任务,比如打扫房间,干完就完事儿了。在 Kubernetes 里,作业就是指定执行一次的任务,简单明了。

创建一个Job,这个Job只有一个任务,完成后即可退出,就是hello lixiaohui的字符串输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat > job.yml <<EOF
apiVersion: batch/v1
kind: Job
metadata:
name: hello-lixiaohui-job
spec:
template:
spec:
containers:
- name: pi
image: registry.ocp4.example.com:8443/openshift/origin-cli:4.12
imagePullPolicy: IfNotPresent
command: ["sh", "-c", "echo hello lixiaohui"]
restartPolicy: Never
backoffLimit: 4
EOF

看一下任务运行的结果

1
2
3
[student@workstation ~]$ oc get job
NAME COMPLETIONS DURATION AGE
hello-lixiaohui-job 1/1 12s 5m15s

从日志中看,输出了一次内容就标记为完成了

1
2
3
4
5
6
7
[student@workstation ~]$ oc create -f job.yml
[student@workstation ~]$ oc get pod
NAME READY STATUS RESTARTS AGE
hello-lixiaohui-job-fqh4t 0/1 Completed 0 16s

[student@workstation ~]$ oc logs hello-lixiaohui-job-fqh4t
hello lixiaohui

Cron Job

Cron 作业(cronjob)

再看看 Cron 作业,这可有意思了,它就像是个超级闹钟,能按照设定的时间表定期执行任务。比如,每周一早上自动清理垃圾,或者每天晚上自动备份数据。当 Cron 作业到了该执行的时间,Kubernetes 就会自动创建一个作业资源,就像闹钟响了,提醒你该干活了。这些作业是根据 Cron 作业定义里的模板来创建的,就像按照菜谱做饭一样,保证每次执行都是一样的标准。

集群管理员可以使用调度任务来自动执行集群中的维护任务。​其他用户可以创建调度任务以进行常规应用维护。​

cron 作业资源包括描述任务和调度的作业模板,Kubernetes cron 作业的调度规范衍生自 Linux cron 作业中的规范,我们来看看Linux里的cron知识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[student@workstation ~]$ cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

以下是 cron 作业规范的几个示例:

调度规范描述
​ 0 ​ 0 * * *每天午夜运行指定的任务
​ 0 ​ 0 * * 7每周日运行指定的任务
​ 0 ​ * * * *每小时运行指定的任务
*/4 * * * *每四分钟运行指定的任务

我们来创建一个crontjob

这个cronjob每分钟会输出一句话

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cat > cronjob.yml <<EOF
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjobtest
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: registry.ocp4.example.com:8443/openshift/origin-cli:4.12
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello lixiaohui again
restartPolicy: OnFailure
EOF
1
[student@workstation ~]$ oc create -f cronjob.yml

这个不会那么快的看到结果,因为要到1分钟后,它才会运行

1
2
3
[student@workstation ~]$ oc get cronjobs.batch
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjobtest */1 * * * * False 0 <none> 18s

再看的时候,已经有了上一次的调度时间,并可以看到pod正常运行

1
2
3
4
5
6
7
8
9
10
11
[student@workstation ~]$ oc get cronjobs.batch
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjobtest */1 * * * * False 0 12s 63s

[student@workstation ~]$ oc get pod
NAME READY STATUS RESTARTS AGE
cronjobtest-28914331-r7rdz 0/1 Completed 0 16s

[student@workstation ~]$ oc logs cronjobtest-28914331-r7rdz
Sun Dec 22 09:31:01 UTC 2024
Hello lixiaohui again