在 Kubernetes 部署的应用程序中创建一个没有重复的 cron 作业

Create a cron job in a Kubernetes deployed app without duplicates

我正在尝试为 运行 Kubernetes 部署的应用程序中的 cron 作业找到解决方案,而不会出现不需要的重复项。为了给您一些背景信息,我将描述我的场景:

我想安排在指定日期执行一次的作业。更精确:创建这样的工作可以随时发生,其执行日期只有到那时才知道。需要完成的工作总是相同的,但需要参数化。 我的应用程序 运行ning 在 Kubernetes 集群中,我不能假设它只会同时 运行ning 一个实例。因此,由于我所有的应用程序实例都会产生它,因此创建上述作业将导致多次执行。但是,我想保证一个作业在整个集群中只有 运行s once.

我试图找到多个作业问题的解决方案运行ning:

-> 这在我的情况下是不可能的,因为重复的作业可能 运行 在其他机器上!

-> 我无法使用此功能,因为我必须从我的应用程序内部动态创建 cron 作业。我无法从该集群内的 pod 运行ning 更改集群配置。也许有办法,但在我看来,必须有比让应用程序访问它 运行 正在进入的集群更好的解决方案。

能否请您指点一下我可能找到解决方案的方向?

我在 Digital Ocean:

上使用托管 Kubernetes 集群

客户端版本:v1.22.4, 服务器版本:v1.21.5

想了很久的办法终于找到了。 解决方案是将作业的调度集中到一个地方。它就像构建一个公开端点以创建作业的作业 Web 服务一样简单。在此服务上创建作业的后端实例还将在请求中提供回调端点,作业 Web 服务将在执行时调用该回调端点 date/time。在我的案例中,端点链接回调用后端服务器,该服务器承载要执行的逻辑。让作业服务直接执行逻辑会相当繁琐,因为作业中涉及很多依赖项。我在我的工作服务中保留了一个单独的数据库,只是为了存储有关给谁打电话以及如何打电话的信息。解决 崩溃后启动 问题变得微不足道,因为只有一个作业 Web 服务实例,它可以 re-create 从数据库中检索作业后正常 re-create 作业,以防万一服务崩溃。

不要忘记处理失败的作业。如果您的后端由于某种原因无法访问以进行回调,则必须有一些协调机制可以防止这种失败被忽视。

我想补充一点:如果您还想水平扩展作业服务,您可以在非常相似的问题中再次 运行。但是,如果您考虑在该服务中要完成的实际工作是什么,您就会意识到它非常轻量级。我不确定水平缩放是否曾经是一项要求,因为它只在指定时间执行请求并且不执行繁重的工作。