智能
助手
最大化  清空记录 停止  历史记录
翻译选中文本
选中一段文本后进行翻译
名词解释
选中一段文本后进行名词解释
知识图谱生成
通过图谱展示知识信息
登录用户在知识浏览页面可用
答案生成
AI自动回答一个问答功能中的问题
登录用户在问答浏览页面,且问题开放回答中可用
知识摘要
自动为当前知识生成摘要
知识浏览页面可用
知识问答
针对当前知识进行智能问答
知识浏览面可用
   30  
查询码: 00000235
6.8.9 job(Job)**管理一次性或批量任务** 案例
作者: 文艺范儿 于 2026年01月21日 发布在分类 / Docker & K8S / K8S基础 ,于 2026年01月21日 编辑
K8S

6.8.9 job(Job)管理一次性或批量任务 案例

简介

Job是 Kubernetes 中用于 管理一次性或批量任务 的控制器,确保指定的任务(Pod)成功完成指定次数。与 Deployment(管理长期运行的服务)不同,Job关注的是 任务的成功执行,而非持续运行。

  • 核心作用
    • 自动创建 Pod 执行任务(如数据处理、备份、报表生成)。
    • 监控任务状态,失败时自动重试,直到任务成功完成或达到重试上限。
    • 支持串行、并行、定时等多种任务执行模式。
  • 适用场景
    • 批处理任务(ETL、数据清洗)。
    • 定时任务(每日报表、日志归档)。
    • 一次性任务(数据库迁移、应用初始

job核心字段

字段 作用 示例

spec.completions

任务需要成功完成的 Pod 总数(串行时为 1)

completions: 5(需 5 个 Pod 成功完成)

spec.parallelism

同时运行的 Pod 数量(并行度)

parallelism: 3(最多 3 个 Pod 同时运行)

spec.restartPolicy

Pod 重启策略(OnFailure/Never

restartPolicy: OnFailure(失败时重启 Pod)

spec.backoffLimit

任务失败后的最大重试次数(默认 6)

backoffLimit: 3(最多重试 3 次)

spec.activeDeadlineSeconds

任务的最长运行时间(超时则终止)

activeDeadlineSeconds: 3600(1 小时内未完成则失败)

案例1:数据处理脚本(类型 1:非并行 Job(默认))

非并行 Job特点

  • completions: 1(默认),parallelism: 1(默认)。
  • 一次只运行一个 Pod,直到成功完成。
# 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 日志

案例2:批量图片处理(类型 2:并行 Job(固定 completions))

并行 Job(固定 completions)特点

  • completions > 1parallelism >= 1
  • 创建多个 Pod 并行执行,直到指定数量的 Pod 成功完成。
# 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 个全部完成。

案例3:分布式爬虫(类型 3:并行 Job(带 work queue))

并行 Job特点

  • completions不设置(默认为 1),parallelism > 1
  • Pod 从队列中获取任务并执行,直到队列为空且所有 Pod 退出。
# 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

案例4:每日mysql数据库备份(类型 4:CronJob(定时任务))以后学习了secret和configmap和pvc再进行回顾

笔记
0人参与


 历史版本

备注 修改日期 修改人
创建版本 2026-01-21 20:50:15[当前版本] 文艺范儿

  目录
    文艺知识分享平台 -V 5.2.5 -wcp