8

当前设置

我们有 3 个运行 spring boot 应用程序的 kubernetes pod 的 kubernetes 集群设置。我们使用 Spring Boot 调度程序每 12 小时运行一次作业以获取一些数据并缓存它。(有队列设置,但我不会继续这些细节,因为我的查询是在我们进入队列之前进行设置)

问题

因为我们有 3 个 pod 并且调度程序处于应用程序级别,所以我们对数据集进行了 3 次调用,每个 pod 获得响应,并且在缓存中处理的 pod 首先成为主节点,其他 2 个 pod 从该实例复制数据。

我认为这是一个问题,因为我们将增加作业数量以获得更多数据集,因此这将成倍增加调用次数。

我不是 Devops 方面的人,并且对 azure 的了解有限,因此我需要社区的一些帮助

需要

有哪些方法可以改善这一点?我想将 Cron 计划分开运行一次,而不是为每个 pod 1 运行 - 我可以将 cronjob 保持在集群级别吗,我在这里阅读过它https://kubernetes.io/docs/concepts/workloads/controllers/cron-工作/ 这会解决问题吗?

2 - 我用谷歌搜索并发现其他选项是运行一个 Cronjob,它将安排一个工作完成,这会有所帮助,但不确定它的真正含义。

提前感谢您抽出时间阅读。

4

1 回答 1

6

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

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

使用方法 (1),您可以将调度程序代码与您的主应用程序结合起来,并在同一个 pod 中一起运行它们。

使用方法(2),您必须将您的代码(在调度程序中运行)与整个应用程序代码分开,将其容器化为自己的镜像,然后使用此新镜像配置 kubernetes cronjob 调度,参考官方指南示例kubernetes cronjob best实践由我撰写,但可以找到其他示例)。

这两种方法都有各自的优点和缺点,因此您可以评估它们以最适合您的需求。

于 2020-11-26T21:23:18.147 回答