你会遇到只想运行一个完成工作(work)后就终止的任务(task)的清况。

4.5.1 介绍Job资源

Job资源允许你运行一种pod,该pod在内部进程成功结束时,不重启容器。一旦任务完成,pod 就被认为处于Completed状态,并退出READY状态。

Job 资源在创建时会立即运行pod。

在发生节点故障时,该节点上由Job管理的pod将按照ReplicaSet的pod的方式,被重新调度到其他节点。如果进程本身异常退出(进程返回错误退出码),可以将Job配置为重新启动容器。

图 4.10 显示了如果一个Job 所创建的 pod, 在最初被调度节点上异常退出后,被重新调度到一个新节点上的情况。 该图还显示了托管的 pod (未重新调度)和由ReplicaSet 管理的 pod (被重新调度)。

image.png

4.5.2 定义Job资源

实验:YAML定义了 一个Job类型的资源,它将运行luksa/batch-job镜像,该镜像调用一个运行sleep 120秒的进程,然后退出。
image.png
restartPolicy:指定在容器中运行的进程结束时,Kubernetes是否让容器重启。它的值有:
Always:默认值,总是重启容器;(不应该使用)
OnFailure:进程本身异常退出(进程返回错误退出码)时,重启容器;
Never:从不重启容器;

该Job的label selector 与 pod template的关系:(自动创建)
image.png

  1. cd /root/k8s/
  2. cat >exporter.yaml <<'EOF'
  3. apiVersion: batch/v1
  4. kind: Job
  5. metadata:
  6. name: batch-job
  7. spec:
  8. template:
  9. metadata:
  10. labels:
  11. app: batch-job
  12. spec:
  13. restartPolicy: OnFailure
  14. containers:
  15. - name: main
  16. image: luksa/batch-job
  17. EOF
  18. kubectl create -f exporter.yaml

4.5.3 看Job运行一个pod

kubectl create之后,查看jobs和pod资源
image.png

两分钟之后任务完成,pod将处于 Completed 状态:
image.png

完成之后pod未被删除的原因是允许你查阅其日志:
image.png

pod可以被直接删除,或者在删除创建它的Job时被删除。
image.png

4.5.4 在Job中运行多个pod实例

作业可以配置为创建多个pod实例, 并以并行或串行方式运行它们 。 这是通过在Job配置中设置 completions 和parallelism 属性来完成的。

顺序运行Job pod

设置completions,让Job 运行多次。
image.png
Job将一个接一个地运行五个pod。它最初创建一个pod, 当pod的容器运行完成时,它创建第二个pod, 以此类推,直到五个pod成功完成。如果其中一个pod 发生故障,Job会创建一个新的pod, 所以Job总共可能创建超过五个的pod。

并行运行Job pod

不必一个接一个地运行单个Job pod, 也可以让该Job并行运行多个pod。通过配置completions和parallelism属性。
image.png
image.png

Job的伸缩(scaling)

在 Job 运行时更改 Job 的 parallelism 属性:
image.png
#由于你将 parallelism 从 2 增加到 3, 另一个 pod 立即启动, 因此现在有三个 pod 在运行。

4.5.5 限制Job pod完成任务的时间

通过配置pod template 中的 spec.activeDeadlineSeconds 属性,可以限制 pod的时间。如果 pod 运行时间超过此时间, 系统将尝试终止 pod, 并将 Job 标记为失败。

通过配置pod template 中的 spec.backoffLimit 属性,可以设置Job在被标记为失败可以重试的次数。如果没有明确指定,则默认为6.