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

如何在Kubernetes部署的应用程序中创建cron作业而不重复?

马飞
2023-03-14

我试图找到一个解决方案,在Kubernetes部署的应用程序中运行cron作业,而不会出现不必要的重复。让我描述一下我的场景,给你一点背景。

我想安排在指定日期执行一次的作业。更准确地说:创建这样一个作业可以在任何时候发生,它的执行日期只有在那个时候才知道。需要做的工作总是一样的,但是需要参数化。

我的应用程序在库伯内特斯集群中运行,我不能假设在任何时候都只有一个实例在运行。因此,创建所述作业将导致它的多次执行,因为我的所有应用程序实例都会生成它。但是,我想保证一个作业在整个集群中只运行一次。

我试图为这个问题找到解决方案,并得出了以下想法。

> < li>

创建本地文件,并在开始新作业时检查它是否已经存在。如果有,取消作业。

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

利用库伯内特斯Cron工作API。

我不能使用这个特性,因为我必须从我的应用程序内部动态创建cron作业。我无法从群集内运行的pod更改群集配置。也许有一种方法,但在我看来,除了让应用程序访问它正在运行的集群之外,还必须有更好的解决方案。

请你给我指点一下,让我找到解决办法,好吗?

我在数字海洋上使用托管的 Kubernetes 集群(客户端版本:v1.22.4,服务器版本:v1.21.5)。

共有1个答案

岳华灿
2023-03-14

在考虑了很长时间的解决方案后,我找到了它。

解决方案是将作业调度到一个中心位置。这与构建一个公开endpoint以创建作业的作业web服务一样简单。在该服务上创建作业的后端实例还将在请求中提供回调endpoint,作业web服务将在执行日期和时间调用该回调endpoint。

在我的例子中,endpoint链接回调用的后端服务器,后者携带要执行的逻辑。让作业服务直接执行逻辑是相当乏味的,因为作业中涉及到许多依赖关系。我在我的工作服务中保留了一个单独的数据库,只是为了存储关于给谁打电话以及如何打电话的信息。解决崩溃后启动的问题变得很简单,因为只有一个job web服务实例,在服务崩溃的情况下,它可以在从数据库中检索到作业后正常地重新创建作业。

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

我想补充一点:如果您还想水平扩展作业服务,您会再次遇到非常相似的问题。然而,如果您考虑在该服务中要做的实际工作是什么,您会意识到它是非常轻量级的。我不确定水平伸缩是否是一个需求,因为它只是在指定的时间执行请求,而不是执行繁重的工作。

 类似资料:
  • 我不熟悉使用cron job。我甚至不知道怎么写。我试着在网上搜索,但还是不太懂。我想创建一个cron作业,它每分钟都会执行我的代码。我正在使用PHP创建它。它不起作用。 示例 run.php(每分钟都会执行的代码) cron.php 假设这两个文件在同一个文件夹中。 是我做错的代码吗?如果有问题,请告诉我如何解决。

  • Cron作业中的内容似乎没有被执行,或者在保存日志时有问题。让我给你介绍一下我的档案: 克龙塔卜 我没有使用Ubuntu:20.04,而是使用image和安装python的附加层。我不能和你分享这张照片,因为这是私人照片。 仅供参考,我可以直接从正在运行的docker(docker中的-it模式;/bin/bash)运行以下命令:python/bin/wrapper.py>/var/log/som

  • 在job.yaml下面用于创建作业。未创建初始化容器。 [root@app]#kubectl版本客户端版本:version.info{Major:“1”,Minor:“15”,GitVersion:“v1.15.5”,GitCommit:“”,GitTreeState:“Clean”,BuildDate:“2019-10-15T19:16:51Z”,GoVersion:“Go1.12.10”,编译

  • 问题内容: 我希望能够以编程方式添加新的cron作业,最佳方法是什么? 从我的研究来看,我似乎可以转储当前的crontab,然后附加一个新的crontab,然后将其重新管道到crontab中: 有没有更好的办法? 问题答案: 对我来说一直很好。 您应该考虑一个稍微复杂的脚本,它可以完成三件事。 附加crontab行;确保它不存在。当它已经存在时添加是不好的。 删除crontab行。也许只有警告,如

  • 我似乎找不到任何关于如何在我的IBM Social Business SmartCloud站点中注册/部署应用程序的文档。这是在他们的云服务器上,而不是我自己的本地主机上。 我使用IBM SmartCloud Engage演示帐户订阅创建了一个Admin AppDeveloper用户帐户。我基本上是在尝试将HelloWorld iWidget添加到某个应用程序菜单中,但找不到注册/添加的位置,因此