霸气黑土 發表於 2025-5-30 16:39:00

K8s新手系列之Job资源

<h2 id="概述">概述</h2>
<p>官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/job/</p>
<p>Job 表示一次性任务,运行完成后就会停止。</p>
<p>Job 会创建一个或者多个 Pod,并将继续重试 Pod 的执行,直到指定数量的 Pod 成功终止。 随着 Pod 成功结束,Job 跟踪记录成功完成的 Pod 个数。 当数量达到指定的成功个数阈值时,任务(即 Job)结束。 删除 Job 的操作会清除所创建的全部 Pod。 挂起 Job 的操作会删除 Job 的所有活跃 Pod,直到 Job 被再次恢复执行。</p>
<p>Job,主要用于负责批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)任务。Job特点如下:</p>
<ul>
<li>当Job创建的pod执行成功结束时,Job将记录成功结束的pod数量</li>
<li>当成功结束的pod达到指定的数量时,Job将完成执行</li>
<li>说白了就是一次性任务,Pod运行结束后,就终止运行。</li>
</ul>
<h2 id="job的核心特性">Job的核心特性</h2>
<h3 id="任务导向">任务导向</h3>
<ul>
<li>确保一个或多个 Pod 成功执行指定任务,任务完成后 Pod 自动终止。</li>
<li>适用于需要确定性结果的场景(如数据备份、报表生成)。</li>
</ul>
<h3 id="多种完成策略">多种完成策略</h3>
<ul>
<li>单 Pod 任务:创建单个 Pod 执行任务,成功即结束(默认策略)。</li>
<li>并行任务:支持并行运行多个 Pod,可通过参数配置完成任务的 Pod 数量(如 completions 指定总成功次数,parallelism 指定并行度)。</li>
</ul>
<h3 id="故障处理">故障处理</h3>
<ul>
<li>自动重试失败的 Pod(可通过 backoffLimit 设置最大重试次数,默认 6 次)。</li>
<li>任务成功完成后,Pod 不会重启。</li>
</ul>
<h2 id="job的资源清单文件">Job的资源清单文件</h2>
<pre><code>apiVersion: batch/v1
kind: Job
metadata:
name: data-processing-job# Job名称,需符合K8s命名规范
namespace: default         # 命名空间
labels:
    app: data-processor
    env: production
annotations:
    description: "并行处理数据的批处理任务"
spec:
completions: 10            # 任务需要成功完成的总次数(默认为1)
parallelism: 3             # 并行运行的Pod数量(默认为1)
backoffLimit: 4            # 失败Pod的重试次数上限(默认为6)
activeDeadlineSeconds: 3600 # 任务的最大运行时间(秒),超时则终止
ttlSecondsAfterFinished: 86400 # 任务完成后保留资源的时间(秒),需K8s 1.12+
manualSelector: false      # 是否允许手动管理Pod(默认为false)
selector:
    matchLabels:
      job-name: data-processing-job # Pod标签选择器
template:
    metadata:
      labels:
      job-name: data-processing-job # Pod标签,需与selector匹配
    spec:
      restartPolicy: Never# 容器失败时的重启策略:Never或OnFailure
      containers:
      - name: data-processor
      image: my-data-processor:v1.2.3# 替换为实际镜像
</code></pre>
<h2 id="job实战案例">Job实战案例</h2>
<pre><code># cat job-1.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi-job
spec:
template:
    spec:
      containers:
      - name: pi
      image: perl
      command: ["perl","-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
backoffLimit: 4

# 查看job
# kubectl get jobs -o wide
NAME   COMPLETIONS   DURATION   AGE   CONTAINERS   IMAGES   SELECTOR
pi-job   1/1         3m2s       6m28s   pi         perl   controller-uid=9dcb16bf-aa3b-4e50-b711-df2f3e68795b

# 查看详细信息
# kubectl describe job pi-job
Name:             pi-job
Namespace:      default
Selector:         controller-uid=9dcb16bf-aa3b-4e50-b711-df2f3e68795b
Labels:         controller-uid=9dcb16bf-aa3b-4e50-b711-df2f3e68795b
                  job-name=pi-job
Annotations:      batch.kubernetes.io/job-tracking:
Parallelism:      1
Completions:      1
Completion Mode:NonIndexed
Start Time:       Fri, 30 May 2025 16:30:56 +0800
Completed At:   Fri, 30 May 2025 16:33:58 +0800
Duration:         3m2s
Pods Statuses:    0 Active (0 Ready) / 1 Succeeded / 0 Failed
Pod Template:
Labels:controller-uid=9dcb16bf-aa3b-4e50-b711-df2f3e68795b
         job-name=pi-job
Containers:
   pi:
    Image:      perl
    Port:       &lt;none&gt;
    Host Port:&lt;none&gt;
    Command:
      perl
      -Mbignum=bpi
      -wle
      print bpi(2000)
    Environment:&lt;none&gt;
    Mounts:       &lt;none&gt;
Volumes:      &lt;none&gt;
Events:
Type    Reason            Age    From            Message
----    ------            ----   ----            -------
NormalSuccessfulCreate7m   job-controllerCreated pod: pi-job-ldm8x
NormalCompleted         3m58sjob-controllerJob completed
</code></pre>
<p>查看一下pod,当pod执行完之后,状态是Completed</p>
<pre><code># kubectl get po
NAME         READY   STATUS      RESTARTS   AGE
pi-job-ldm8x   0/1   Completed   0          7m40s
</code></pre>


</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:huangSir-devops,转载请注明原文链接:https://www.cnblogs.com/huangSir-devops/p/18904493,微信Vac6666666,欢迎交流</p><br><br>
来源:https://www.cnblogs.com/huangSir-devops/p/18904493
頁: [1]
查看完整版本: K8s新手系列之Job资源