[CKAD] 掌握批处理作业:从一次性Job到周期性CronJob!

📑 目录

  1. Job: 有始有终的任务
  2. Job的核心参数:完成次数与并行度
  3. CronJob: 按时间表运行的批处理
  4. CKAD实战技巧:一行命令节省时间
  5. Hands-on: 实战练习题

概述:Kubernetes中的批处理(Batch)作业是什么? 🤔

运行在Kubernetes集群上的应用程序,根据其性质可以大致分为两类:

  1. 服务型 (Long-running): 像Web服务器、API服务器一样,24小时不间断运行,等待随时可能到来的用户请求的应用程序。(主要通过Deployment管理)
  2. 批处理型 (Batch): 为达成特定目的而运行,完成所有工作后会自行“成功终止(Completed)”的应用程序。

批处理作业简单来说就是“有明确开始和结束的一次性任务”。

  • 示例:
  • 每天凌晨3点执行的数据库备份
  • 分析堆积的大容量日志数据并生成结果报告
  • 在新版本发布前执行数据库模式迁移

Kubernetes提供了Job和CronJob这两种专用资源来稳定处理这类批处理任务。CKAD考试会考察你是否清楚地了解它们之间的区别和详细的配置方法。


##

##

1. Job: 有始有终的任务 🏁

如果说一般的Deployment是“24小时不间断运行的服务”,那么Job就是“完成任务后优雅终止的作业”。

  • 用途: 数据库迁移、批处理报告生成、图像处理等。
  • 核心: 属于Job的Pod在任务成功完成后会进入Completed状态并终止。

💡 基本YAML结构

apiVersion: batch/v1
kind: Job
metadata:
  name: pi-calculator
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never # Job中必须使用 Never 或 OnFailure
  backoffLimit: 4 # 失败时的最大重试次数

⚠️ 注意: Job的Pod模板中restartPolicy绝不能是Always。因为任务完成后必须终止!


2. Job的核心参数:完成次数与并行度 ⚙️

CKAD考试不仅要求你创建Job,还要求你让它成功特定次数或同时启动多个实例。

参数 说明
— —
completions 总共需要多少次Pod成功完成? (默认值 1)
parallelism 同时启动多少个Pod? (默认值 1)
activeDeadlineSeconds 如果作业超过此时间(秒),则强制终止。
backoffLimit 失败时重试次数。超过此限制则视为失败。

—

3. CronJob: 按时间表运行的批处理 ⏰

CronJob是一种资源,它像Linux的crontab一样,在指定时间周期性地创建Job。

💡 Cron调度语法 (Linux标准)

* * * * * (分 时 日 月 星期)

  • */5 * * * *: 每5分钟执行一次
  • 0 0 * * *: 每天午夜执行

💡 主要配置要点

  • concurrencyPolicy: 如果上一个任务未完成,而下一个任务时间已到,该怎么办?
  • Allow (默认值): 直接再次启动 (重复执行)
  • Forbid: 等待上一个任务完成,跳过本次执行
  • Replace: 终止上一个任务,启动新的任务
  • successfulJobsHistoryLimit: 决定保留多少个成功记录 (默认值 3)。

CronJob YAML编写示例

apiVersion: batch/v1
kind: CronJob
metadata:
  name: etcd-backup-cronjob
  namespace: kube-system # 系统管理资源,因此通常部署在 kube-system 中
spec:
  schedule: "0 3 * * * " # 每天凌晨 3:00 执行 (分 时 日 月 星期)
  concurrencyPolicy: Forbid # 如果上次备份未完成,则跳过本次运行 (防止数据冲突)
  successfulJobsHistoryLimit: 5 # 只保留最新的5个成功备份记录 (Job)
  failedJobsHistoryLimit: 2     # 只保留2个失败记录
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: etcd-backup
            image: busybox # 在实际环境中,使用包含 etcdctl 的镜像
            command:
            - /bin/sh
            - -c
            - echo "Starting etcd backup..."; date; echo "Backup to MetaKage completed!"
          restartPolicy: OnFailure # 仅在失败时重试

4. CKAD实战技巧:一行命令节省时间 ⏱️

考试是速度战!不要从头开始编写YAML。

1) 创建Job (命令式)

# 1. 创建一个基本 Job
kubectl create job my-job --image=busybox -- echo "Hello"

# 2. 导出为 YAML 并修改选项 (例如 completions)
kubectl create job complex-job --image=busybox --dry-run=client -o yaml > job.yaml

2) 创建CronJob

kubectl create cronjob my-cron --image=busybox --schedule="*/1 * * * *" -- echo "Time to work!"

5. Hands-on: 实战练习题 🛠️

请在终端中直接实现以下条件。

场景:

  1. 创建一个名为batch-ns的命名空间。
  2. 使用busybox镜像创建一个名为ping-job的Job。
  3. 此Job必须总共成功5次(completions),并同时运行2个实例(parallelism)。
  4. 执行命令是ping -c 3 google.com。
# 解答
kubectl create ns batch-ns
kubectl create job ping-job --image=busybox -n batch-ns --dry-run=client -o yaml -- ping -c 3 google.com > job.yaml

# 编辑 vi job.yaml
# 在 spec 下方直接添加 completions: 5, parallelism: 2

kubectl apply -f job.yaml
kubectl get pods -n batch-ns -w # 检查 Pod 是否以 2 个为一组启动和终止!

Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注