| 备注 | 修改日期 | 修改人 |
| 创建版本 | 2026-01-21 20:50:15[当前版本] | 文艺范儿 |
Job是 Kubernetes 中用于 管理一次性或批量任务 的控制器,确保指定的任务(Pod)成功完成指定次数。与 Deployment(管理长期运行的服务)不同,Job关注的是 任务的成功执行,而非持续运行。
job核心字段
| 字段 | 作用 | 示例 |
|---|---|---|
|
任务需要成功完成的 Pod 总数(串行时为 1) |
|
|
同时运行的 Pod 数量(并行度) |
|
|
Pod 重启策略( |
|
|
任务失败后的最大重试次数(默认 6) |
|
|
任务的最长运行时间(超时则终止) |
|
非并行 Job特点
completions: 1(默认),parallelism: 1(默认)。# 1. 创建一个 Job 运行 Python 数据处理脚本:
# data-processing-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: data-processing-job
spec:
template:
spec:
restartPolicy: OnFailure # 失败时重启 Pod
containers:
- name: processor
image: harbor.wyasw.com/library/python:3.9-slim
command: ["python", "/scripts/process_data.py"]
volumeMounts:
- name: script-volume
mountPath: /scripts
volumes:
- name: script-volume
configMap:
name: data-processing-script # 挂载包含脚本的 ConfigMap
backoffLimit: 3 # 最多重试 3 次
# 2. 创建 ConfigMap 存储脚本:
# data-processing-script-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: data-processing-script
data:
process_data.py: |
import time
print("开始处理数据...")
time.sleep(30) # 模拟处理耗时
print("数据处理完成!")
# 模拟偶尔失败(测试重试机制)
if time.time() % 2 == 0:
exit(1) # 失败时退出码为非 0
# 3. 应用配置:
kubectl apply -f data-processing-script-configmap.yaml
kubectl apply -f data-processing-job.yaml
# 4. 查看 Job 状态:
kubectl get jobs data-processing-job
kubectl logs job/data-processing-job # 查看 Pod 日志
并行 Job(固定 completions)特点
completions > 1,parallelism >= 1。# 1. 需要并行处理 10 张图片,每次最多 3 个并发:
# image-processing-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: image-processing-parallel-job
spec:
completions: 10 # 需要 10 个任务成功完成
parallelism: 3 # 最多 3 个并发
template:
spec:
restartPolicy: OnFailure
containers:
- name: image-processor
image: harbor.wyasw.com/library/alpine:3.20.2
command: ["sh", "-c", "echo '处理图片 $JOB_COMPLETION_INDEX'; sleep 10; exit 0"]
env:
- name: JOB_COMPLETION_INDEX
valueFrom:
fieldRef:
fieldPath: metadata.annotations['batch.kubernetes.io/job-completion-index']
backoffLimit: 2
# 2. 应用配置
kubectl apply -f image-processing-job.yaml
# 3.查看
kubectl get jobs image-processing-parallel-job
kubectl logs job/image-processing-parallel-job
# 关键点:
JOB_COMPLETION_INDEX:每个 Pod 的唯一索引(0 到 completions-1),可用于区分任务。
当 3 个 Pod 成功完成后,Job 会再创建 3 个,直到 10 个全部完成。
并行 Job特点
completions不设置(默认为 1),parallelism > 1。# 1. 前置准备,需要先部署 Redis 并推送 URL 到队列:
# 部署 Redis
kubectl create deployment redis --image=harbor.wyasw.com/library/redis:alpine
kubectl expose deployment redis --port=6379 --name=redis-service
# 推送任务到队列
kubectl run -it --rm --image=harbor.wyasw.com/library/redis:alpine redis-client -- redis-cli -h redis-service LPUSH urls "http://wyasw.com/page1"
kubectl run -it --rm --image=harbor.wyasw.com/library/redis:alpine redis-client -- redis-cli -h redis-service LPUSH urls "http://wyasw.com/page2"
# 2. 多个 Pod 从 Redis 队列中获取 URL 并爬取:
# crawler-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: distributed-crawler-job
spec:
parallelism: 5 # 5 个并发爬虫
template:
spec:
restartPolicy: OnFailure
containers:
- name: crawler
image: harbor.wyasw.com/library/redis:alpine
command: ["sh", "-c"]
args:
- |
apt-get update && apt-get install -y curl
while true; do
url=$(redis-cli LPOP urls)
if [ -z "$url" ]; then
echo "队列为空,爬虫退出"
exit 0
fi
echo "爬取: $url"
curl -s "$url" > /dev/null || exit 1 # 爬取失败则重启 Pod
done
env:
- name: REDIS_HOST
value: "redis-service" # 集群内的 Redis Service
# 3. 应用配置
kubectl apply -f crawler-job.yaml
# 4.查看
kubectl get jobs distributed-crawler-job
kubectl logs job/distributed-crawler-job