kubernetes - Spring 启动调度程序为每个 pod 运行 cron 作业

标签 kubernetes cron kubernetes-pod kubernetes-cluster

当前设置
我们有 kubernetes 集群设置,其中包含 3 个运行 spring boot 应用程序的 kubernetes pod。我们每 12 小时运行一次作业,使用 Spring Boot 调度程序来获取一些数据并缓存它。(有队列设置,但我不会继续这些细节,因为我的查询是在我们进入队列之前的设置)
问题
因为我们有 3 个 pod 并且调度程序处于应用程序级别,所以我们对数据集进行了 3 次调用,每个 pod 获得响应,并且首先在缓存中处理的 pod 成为主节点,其他 2 个 pod 从该实例复制数据。
我认为这是一个问题,因为我们将增加作业数量以获得更多数据集,因此这将使调用次数成倍增加。
我不是来自 Devops 方面,而且我的知识有限,因此我需要社区的一些帮助
需要
有哪些选项可以改善这一点?我想分离出 Cron 计划只运行一次而不是每个 pod
1 - 我可以将 cronjob 保留在集群级别吗,我已经在 https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/ 中阅读了相关内容
这会解决问题吗?
2 - 我用谷歌搜索并发现另一个选项是运行一个 Cronjob,它将安排一项工作完成,这会有所帮助,但不确定它的真正含义。
提前感谢您抽出时间阅读它。

最佳答案

根据我对您问题的理解,您似乎有以下两个选择(至少)-

  • 如果您的 springboot 主应用程序中继续有调度逻辑,那么您可能想要探索类似 shedlock 的东西,它有助于确保您通过应用程序代码调度的作业通过外部锁提供程序(如 MySQL、Redis 等)仅执行一次。应用程序代码在多个节点上运行(或在您的情况下是 kubernetes pod)。
  • 如果您可以将特定于调度程序的应用程序代码分离到它自己的可执行进程中(即该代码可以在与主应用程序代码 pod 不同的一组 pod 中运行),那么您可以利用 kubernetes cronjob 来调度在内部创建 pod 的 kubernetes 作业和运行您的应用程序逻辑。这种方法的好处是您可以使用原生 kubernetes cronjob parameters like concurrency and few others 来确保作业在预定时间内通过单个 pod 仅运行一次。

  • 使用方法 (1),您可以将调度程序代码与主应用程序结合起来,并在同一个 Pod 中一起运行它们。
    使用方法 (2),您必须将您的代码(在调度程序中运行)与整个应用程序代码 containerize it into its own image 分开,然后使用这个引用 official guide examplekubernetes cronjob best practices(由我编写,但可以找到其他示例)的新图像配置 kubernetes cronjob 调度)。
    这两种方法都有自己的优点和缺点,因此您可以评估它们以最适合您的需求。

    关于kubernetes - Spring 启动调度程序为每个 pod 运行 cron 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64875458/

    相关文章:

    docker - 如何在Kubernetes中分离应用程序和数据同步实现?

    php - 在 PHP 中通过 SFTP 传输大文件

    amazon-web-services - 如何从 kubernetes 的前端调用 spring api

    Java 进程在 CRON 后仍保持 Activity 状态

    kubernetes - 即时编辑 Kubernetes pod

    kubernetes - 我们可以--pod-eviction-timeout = 300m吗?

    kubernetes - Azure Kubernetes - prometheus 作为 ISTIO 的一部分部署,但未显示部署?

    linux - 将我的k8s中的Pod日志重定向到具有Pod名称的文件

    kubernetes - 如何在 kubernetes GCE 上启用 https tls

    php - php 中的 cron 作业命中 100 多个动态 url 以缓存页面