k8s动手任务5:玩转Job vs CronJob

39 阅读1分钟

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