• Job 和 DaemonSet


    一、Job

    1Job 背景问题

    K8s 里,最小的调度单元是 Pod,如果直接通过 Pod 来运行任务进程,会产生以下几种问题:

    如何保证 Pod 内进程正确的结束?

    如何保证进程运行失败后重试?

    如何管理多个任务,且任务之间有依赖关系?

    如何并行地运行任务,并管理任务的队列大小?

    2Job:管理任务的控制器

    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

    1DaemonSet 背景问题

    如何保证每个节点都运行一个pod?

    如果新节点加入集群,如何感知并部署对应的Pod?

    如果有节点退出,如何删除对应的Pod?

    如果Pod状态异常,如何监控并恢复Pod的状态 ?

    2DaemonSet 功能:

    保证集群内每一个(或者一些)节点都运行一组相同的 Pod;

    跟踪集群节点状态,保证新加入的节点自动创建对应的 Pod;

    跟踪集群节点状态,保证移除的节点删除对应的 Pod;

    跟踪 Pod 状态,保证每个节点 Pod 处于运行状态。

    3、DaemonSet 语法:

    (1) 查看 DaemonSet 状态:

    创建完 DaemonSet 之后,我们可以使用 kubectl get DaemonSet(DaemonSet 缩写为 ds)

    (2) 更新 DaemonSet:

    DaemonSet 有两种更新策略:一个是 RollingUpdate,另一个是 OnDelete

  • 相关阅读:
    关于数据库优化你知道多少?
    python 第五章
    【JAVA】关于抽象类的概念
    【VSCode】Windows环境下,VSCode 搭建 cmake 编译环境(通过配置文件配置)
    我们来用Unity做一个局域网游戏(下)
    计算机网络-网络文件共享协议
    python3:print()打印. 2023-11-18
    【毕业设计】深度学习人脸表情识别系统 - python
    通关GO语言03 控制结构:if、for、witch 逻辑语句的那些事儿
    kafka学习(七):消息队列与JMS
  • 原文地址:https://blog.csdn.net/weixin_61428407/article/details/136196389