1 一次性 Job(计算 π)
文件:job-pi.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
restartPolicy: Never
containers:
- name: pi
image: docker.io/library/alpine
imagePullPolicy: Never
command: ["sh", "-c", "echo 'scale=2000; 4*a(1)' | bc -l | tail -1"]
运行并查看:
kubectl apply -f job-pi.yaml
kubectl get job pi -w
# NAME COMPLETIONS DURATION AGE
# pi 0/1 10s 10s
# pi 0/1 11s 11s
# pi 0/1 12s 12s
# pi 1/1 12s 12s
kubectl logs -l job-name=pi
# 086583264599581339047802759008
2 故意让它失败,看 BackoffLimit
文件:job-fail.yaml(把正确命令改成错误命令)
apiVersion: batch/v1
kind: Job
metadata:
name: fail
spec:
backoffLimit: 4 # 最多重试 4 次
template:
spec:
restartPolicy: Never
containers:
- name: err
image: docker.io/library/alpine
imagePullPolicy: Never
command: ["sh", "-c", "exit 1"]
kubectl apply -f job-fail.yaml
kubectl describe job fail | grep -A 5 Events
Events 里会看到 BackoffLimitExceeded 且 Pod 被新建 4 次后停止。
3 并行 Job(5 个工人同时跑)
文件:job-parallel.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: worker
spec:
parallelism: 5 # 同时 5 个 Pod
completions: 5 # 总共要完成 5 个
template:
spec:
restartPolicy: Never
containers:
- name: w
image: docker.io/library/alpine
imagePullPolicy: Never
command: ["sh", "-c", "echo Worker $JOB_COMPLETION_INDEX; sleep 10"]
你会看到 5 个 Pod 同时 Running,全部完成后 Job 状态变成 Complete。
4 CronJob:每 2 分钟跑一次,只留最近 3 次
文件:cronjob-hello.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/2 * * * *" # 2 分钟一次
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: hello
image: docker.io/library/alpine
imagePullPolicy: Never
command: ["sh", "-c", "echo Hello from CronJob $(date)"]
successfulJobsHistoryLimit: 3 # 只保留 3 次成功历史
failedJobsHistoryLimit: 1 # 失败历史只留 1 次
kubectl apply -f cronjob-hello.yaml