K8S CronJob 基础示例
2022-04-09
有的时候需要单独运行某个程序后直接退出,可以用 job 来实现:
apiVersion: batch/v1
kind: Job
metadata:
name: get-pi
spec:
template:
spec:
containers:
- name: get-pi
image: debian:stable-slim
command: ["sh", "-c", "sleep 10 && echo '3.1415926'"]
restartPolicy: Never
backoffLimit: 4
activeDeadlineSeconds: 60
上面的代码启动了一个 job,在休眠 10 秒钟后打印 pi 的值。
>>> k logs jobs/get-pi
3.1415926
>>> k get jobs
NAME COMPLETIONS DURATION AGE
get-pi 1/1 22s 23s
可以看看这个 job 具体的定义:
>>> k describe jobs/get-pi
Name: get-pi
Namespace: default
Selector: controller-uid=2b9b1153-3f51-44ae-8771-5b29fab2db11
Labels: controller-uid=2b9b1153-3f51-44ae-8771-5b29fab2db11
job-name=get-pi
...
每当创建 job 的时候,k8s 就会自动给该 job 赋予唯一的 label,同时将 selector 改为 label 的值。确保 controller 只会执行这一个 job。
另一些时候需要定时执行 job,可以使用 cronjob,下面是每分钟打印一次 pi 的例子:
apiVersion: batch/v1
kind: CronJob
metadata:
name: get-pi
spec:
schedule: "*/1 * * * *"
concurrencyPolicy: Forbid
startingDeadlineSeconds: 200
jobTemplate:
spec:
template:
spec:
containers:
- name: get-pi
image: debian:stable-slim
command: ["sh", "-c", "sleep 10 && echo '3.1415926'"]
restartPolicy: OnFailure
backoffLimit: 4
activeDeadlineSeconds: 60
parallelism: 2
completions: 4
然后创建该 cronjob:
>>> k get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
get-pi */1 * * * * False 1 30s 4m21s
>>> k get pods
NAME READY STATUS RESTARTS AGE
cqhttp-0 1/1 Running 0 164m
cqhttp-1 1/1 Running 0 164m
cqhttp-2 1/1 Running 0 163m
get-pi-28040284-7zs6w 0/1 Completed 0 3m14s
get-pi-28040284-cvq9c 0/1 Completed 0 3m32s
get-pi-28040284-ll4n9 0/1 Completed 0 3m32s
>>> k logs get-pi-28040284-7zs6w
3.1415926
Very nice!