【问题标题】:Which Kubernetes Object manages Job and CronJob workloads?哪个 Kubernetes 对象管理 Job 和 CronJob 工作负载?
【发布时间】:2021-09-04 19:20:14
【问题描述】:
所有作业和 CronJobs 最终都作为 Pod 运行。除了独立的 pod 之外,其他 pod 由部署/副本管理。但是对于 Job 和 CronJob,我看不到任何部署或 ReplicaSet,尽管 job/cronjob pod 具有与 RS 托管 POD 相同的命名法,例如 [deployment.replicaset-name]-XXX。
谁来管理这些工作负载?
【问题讨论】:
标签:
kubernetes
deployment
jobs
replicaset
kubernetes-cronjob
【解决方案1】:
哪个 Kubernetes 对象管理 Job 和 CronJob 工作负载?
让我从Cronjob开始:
CronJob 在重复的计划中创建 Jobs。
考虑到,cronjob 是一个相对较新的功能。它从 1.21 版(稳定版)开始可用。
更进一步:
Job 创建一个或多个 Pod,并将继续重试执行 Pod,直到指定数量的 Pod 成功终止。当 pod 成功完成时,作业会跟踪成功完成。当达到指定的成功完成次数时,任务(即 Job)就完成了。删除作业将清理它创建的 Pod。暂停 Job 将删除其活动 Pod,直到 Job 再次恢复。
这都是Job Controller管理的,Jonas提到的很好。
但是,如果您使用的是专用解决方案,例如GKE,你可以得到additional information:
在 GKE 中,Job 是表示有限任务的控制器对象。 Jobs 与其他控制器对象的不同之处在于,Jobs 在任务运行到完成时对其进行管理,而不是管理正在进行的所需状态(例如正在运行的 Pod 的总数)。
在 GKE 中,有两种类型的作业:
-
非并行作业:只创建一个 Pod 的作业(如果 Pod 终止不成功会重新创建),并在 Pod 终止成功时完成。
-
具有完成计数的并行作业:当一定数量的 Pod 成功终止时完成的作业。您可以使用
completions 字段指定所需的完成次数。
另见:
【解决方案2】:
Kubernetes 作业可能会失败,并且可能会安排一个新的 Pod 来运行该作业。这是由Job Controller 管理的:
Job 控制器是 Kubernetes 内置控制器的一个示例。内置控制器通过与集群 API 服务器交互来管理状态。
Job 是一种 Kubernetes 资源,它运行一个 Pod,或者可能是多个 Pod,以执行一项任务然后停止。
(一旦调度,Pod 对象就会成为 kubelet 所需状态的一部分)。
当 Job 控制器看到一个新任务时,它会确保在集群中的某个位置,一组 Node 上的 kubelet 正在运行正确数量的 Pod 来完成工作。 Job 控制器本身不运行任何 Pod 或容器。相反,Job 控制器告诉 API 服务器创建或删除 Pod。控制平面中的其他组件根据新信息进行操作(有新的 Pod 需要调度和运行),最终工作完成。