一、Job
1 、Job 背景问题
K8s 里,最小的调度单元是 Pod,如果直接通过 Pod 来运行任务进程,会产生以下几种问题:
① 如何保证 Pod 内进程正确的结束?
② 如何保证进程运行失败后重试?
③ 如何管理多个任务,且任务之间有依赖关系?
④ 如何并行地运行任务,并管理任务的队列大小?
2 、 Job :管理任务的控制器
Kubernetes 的 Job 为我们提供了什么功能:
① 创建一个或多个Pod确保指定数量的Pod可以成功地运行终止;
② 跟踪Pod状态,根据配置及时重试失败的 Pod;
③ 确定依赖关系,保证上一个任务运行完毕后再运行下一个任务;
④ 控制任务并行度,并根据配置确保Pod 队列大小。
3 、Job 解读:
(1) Job 语法:
① metadata 里面的 name 指定这个 Job 的名称,spec.template 是 pod 的 spec。
② restartPolicy 重启策略:
在 Job 里面可以设置 Never、OnFailure、Always 这三种重试策略。
Never 表示不会重启 Pod,即使 Pod 失败也不会重启。
OnFailure 表示只有在 Pod 失败时才会重启。
Always 表示无论何时,都会尝试重启 Pod,即使它已经成功运行。
③ backoffLimit 重试次数限制:
Job 在运行的时候不可能去无限的重试,需要一个参数来控制重试的次数。backoffLimit 就是来保证一个 Job 到底能重试多少次。
(2) 查看 Job 状态:
Job 创建完成之后,可以通过 kubectl get jobs 这个命令,查看当前 job 的运行状态。
(3) 查看 Pod:
通过 Job 创建出来的 Pod 比普通的 Pod 多了一个 ownerReferences,用来声明此 pod 是归哪个上一层 controller 来管理。可以通过 pod 返查到它的控制器是谁,同时也能根据 Job 来查一下它下属有哪些 Pod。
(4) 并行 Job:
Job 控制器可以并行出 n 个 Pod 去快速地执行,同时设置并行度。
主要看两个参数:一个是 completions,一个是 parallelism。
第一个参数是用来指定 Pod 队列执行次数。可以把它认为是这个 Job 指定的可以运行的总次数。比如这里设置成 8,即这个任务一共会被执行 8 次。
第二个参数代表这个并行执行的个数。所谓并行执行的次数,就是一个管道或者缓冲器中缓冲队列的大小,把它设置成 2,就是说这个 Job 要执行 8 次,每次并行 2 个 Pod,这样的话,一共会执行 4 个批次。
(5) Cronjob :
CronJob,也叫定时运行 Job。它可以设计一个时间决定 Job 在几点几分执行。
① schedule:这个字段主要设置时间格式。
② startingDeadlineSeconds:每次运行 Job 的时候,它最长可以等多长时间,如果超过时间,CronJob 就会停止这个 Job。
③ concurrencyPolicy:是否允许并行运行。如果这个 policy 设置为 true 的话,不管前面的 Job 是否运行完成,下一个 Job 都会去执行;如果是 false,它就会等上一个 Job 运行完成之后才会运行下一个。
④ JobsHistoryLimit:每一次 CronJob 运行完之后,它都会遗留上一个 Job 的运行历史、查看时间。可以根据需要设置历史存留数,一般可以设置默认 10 个或 100 个。
二、DaemonSet
1 、DaemonSet 背景问题
如何保证每个节点都运行一个pod?
如果新节点加入集群,如何感知并部署对应的Pod?
如果有节点退出,如何删除对应的Pod?
如果Pod状态异常,如何监控并恢复Pod的状态 ?
2 、DaemonSet 功能:
保证集群内每一个(或者一些)节点都运行一组相同的 Pod;
跟踪集群节点状态,保证新加入的节点自动创建对应的 Pod;
跟踪集群节点状态,保证移除的节点删除对应的 Pod;
跟踪 Pod 状态,保证每个节点 Pod 处于运行状态。
3 、DaemonSet 语法:
(1) 查看 DaemonSet 状态:
创建完 DaemonSet 之后,我们可以使用 kubectl get DaemonSet(DaemonSet 缩写为 ds)
(2) 更新 DaemonSet:
DaemonSet 有两种更新策略:一个是 RollingUpdate ,另一个是 OnDelete。