当前位置: 首页 > 知识库问答 >
问题:

Kubernetes CronJob只运行相同的作业,即使其他作业在每个节点有限数量的pod中等待

程沛
2023-03-14

我想知道kubernetesCron工作在有多个等待作业时是如何选择要运行的作业的。它不是FIFO,而是LIFO?

这是我的实验设置。

  • Kubernetes服务器版本1.21.5
  • kubernetes集群中的1个节点
  • 通过将<code>ResourceQuota</code>设置为命名空间,限制每个节点3个pod

我安排了9个< code > cron jobs (< code > cron job 1 ..< code>cronjob9)。每项工作如下:

    < li >需要130秒(仅睡眠) < li> 日程:*/2 * * * * < li> 并发策略:禁止 < li> 开始读数秒数:3000 < Li > < code > successfulJobsHistoryLimit:0 < Li > < code > failed jobshistorylimit:1

这是结果。

  • 首先,3个Cron乔布斯,说job1job2job3,变成运行状态。哪3个看起来是随机的。
  • 由于每个工作需要130秒才能完成,因此下一个计划时间到了。
  • job1job2job3完成后,启动相同的任务job1job2job3
  • job4-job9永远不会执行。

使现代化

  • 我的群集只有一个节点。
    • Kubernetes on Docker Desktop for Mac

    命名空间.yaml

    apiVersion: v1
    kind: Namespace
    metadata:
      name: cron-job-ns
    

    资源_配额.yaml

    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: limit-number-of-pods
      namespace: cron-job-ns
    spec:
      hard:
        count/pods: "3"
    

共有2个答案

刘英彦
2023-03-14

正如你们所回答的,它在库伯内特斯调度程序的范围内。

特别是对于同类型等待pod的优先级,就像在这个实验中一样,它与库伯内特斯调度器中的队列有关。

队列实现既不是FIFO也不是LIFO。

等待的Pod似乎在三个队列之间来回切换,activeQ、podBackoffQ和un调度ableQ取决于超时时间。

超时时间与CronJob新调度的Pod之间的关系决定了要执行的下一个Pod。

苏鸿卓
2023-03-14

我已经发布了社区维基的回答来总结这个话题。

我想知道kubernetes cron作业在有多个等待作业的情况下,是如何选择要运行的作业的,不是FIFO,而是LIFO?

用户rkosegi好在评论中提到:

这既不是后进先出,也不是先进先出。这要复杂得多。

用户webel d添加了解释:

正如@rkosegi所提到的,这可能与Kubernetes调度程序有关,而不是与CronJobs和Jobs有关。当CronJob根据其时间表启动时,所有作业都会创建一个Pod。然后,调度器决定哪个挂起的Pod被调度到节点,从而可以运行。

如果您想确切了解其工作原理,请参阅以下文档:

Kubernetes调度器使用工作队列作业进行精细并行处理

 类似资料:
  • 我们有一个项目,其中我们有几个Jenkins作业:一种类型的作业运行交付(a), 一个只进行编译和单元测试的程序(B) 和 运行集成测试、静态代码分析等(C)的人。 我们在四个 Jenkins 节点(主节点三个从节点)上运行,我们的作业是声明性管道作业的混合,并在 Jenkins 作业中手动单击。 我们一次只想为每个节点运行一个集成测试构建。然而,我们希望运行尽可能多的交付(A)和代码质量(B)构

  • 问题内容: 我有一大堆具有相同标签的节点。我希望能够在Jenkins中运行一个作业,该作业在具有相同标签的 所有 节点上执行并同时执行。 我看到了在詹金斯中使用矩阵配置选项的建议,但我只能想到一个轴(标签组)。当我尝试运行该作业时,似乎它只执行一次而不是300次(该标签组中的每个节点1次)。 我的另一条轴应该是什么?还是…有一些插件可以做到这一点?我曾经尝试过NodeLabel参数插件,然后选择“

  • 当前设置 null 问题 因为我们有3个pod,并且调度程序处于应用程序级别,所以我们对数据集进行3次调用,每个pod都得到响应,并且首先在缓存中处理的pod成为主服务器,其他2个pod复制来自该实例的数据。 我认为这是一个问题,因为我们将增加获取更多数据集的作业数量,因此这将成倍增加调用的数量。 null null null 2-我谷歌了,发现其他的选择是运行一个Cronjob,这将安排一个工作

  • 在表中,默认情况下传递和作业参数。当我使用REST endpoint launcher方法触发作业时,我没有看到这些参数在默认情况下被传递。 并且在每个作业运行中传递这两个参数的相同值。和。正如所料,它给出了以下异常。 我的问题是: 当我使用命令行触发作业时,为什么默认情况下传递此和作业参数? ,为什么每次运行作业时传递的两个参数的值都是一样的?即使我正在使用 方法是如何创建差异的?

  • 我有一个kubernetes集群,有4个节点。我部署了一个pod作为部署,有8个副本。当我部署这个时,kubernetes有时会在node1中安排4个吊舱,其余的4个吊舱安排在node2中。在这种情况下,node3和node4没有运行此容器(但其他容器在那里运行) 我确实理解Pod亲和力和反亲和力,他们有Pod反亲和力的ZooWatch示例,这很好。这将确保没有2个pod会部署在同一个节点上。 这

  • 不幸的是,我有一个工作是对RAM中的数据进行操作,但没有同步设置。我能看到的最简单的解决方案是让一个作业在所有节点上运行而不进行协调,就像使用一样。 是否有方法将作业配置为在LocalDataSourceJobStore下的所有节点上运行? 精确的定时并不重要,但作业必须每30分钟在每个节点上运行一次