📑 目录
- Job: 有始有终的任务
- Job的核心参数:完成次数与并行度
- CronJob: 按时间表运行的批处理
- CKAD实战技巧:一行命令节省时间
- Hands-on: 实战练习题
概述:Kubernetes中的批处理(Batch)作业是什么? 🤔
运行在Kubernetes集群上的应用程序,根据其性质可以大致分为两类:
- 服务型 (Long-running): 像Web服务器、API服务器一样,24小时不间断运行,等待随时可能到来的用户请求的应用程序。(主要通过Deployment管理)
- 批处理型 (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: 实战练习题 🛠️
请在终端中直接实现以下条件。
场景:
- 创建一个名为batch-ns的命名空间。
- 使用busybox镜像创建一个名为ping-job的Job。
- 此Job必须总共成功5次(completions),并同时运行2个实例(parallelism)。
- 执行命令是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 个为一组启动和终止!
发表回复