【问题标题】:How to create a cron job in a Kubernetes deployed app without duplicates?如何在 Kubernetes 部署的应用程序中创建不重复的 cron 作业?
【发布时间】:2022-06-27 16:19:12
【问题描述】:

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

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

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

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

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

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

能否请您给我任何指示,我可能会找到解决方案?

我在 Digital Ocean 上使用托管 Kubernetes 集群:

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

【问题讨论】:

  • 您使用的是哪个版本的 Kubernetes,您是如何设置集群的?您是否使用裸机安装或某些云提供商?重现您的问题很重要。
  • @Mykola 我更新了我的问题以包含有关集群及其版本的信息。
  • 你能添加你的 Pod 配置文件吗?对于通过 IP 进行的外部连接,您可以使用NodePortLoadbalancerIngress 服务,但我认为这不是一个好主意。如果要连接到节点 CLI,请使用 kubectl execcommannd。

标签: kubernetes cron


【解决方案1】:

在想了很久的解决方案之后,我找到了它。 解决方案是将作业调度到一个中心位置。这就像构建一个公开端点以创建作业的作业 Web 服务一样简单。在此服务上创建作业的后端实例还将在请求中提供回调端点,作业 Web 服务将在执行日期/时间调用该端点。在我的例子中,端点链接回调用后端服务器,该服务器承载要执行的逻辑。让作业服务直接执行逻辑会相当繁琐,因为作业中涉及很多依赖项。我在工作服务中保留了一个单独的数据库,只是为了存储有关呼叫谁以及如何呼叫的信息。解决崩溃后启动问题变得微不足道,因为作业 Web 服务只有一个实例,并且它可以在从数据库中检索到作业后正常重新创建作业,以防服务崩溃。 p>

不要忘记照顾失败的工作。如果由于某种原因无法访问您的后端以进行回调,则必须有一些协调机制来防止此故障被忽视。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2022-12-13
    • 2020-06-11
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2020-04-06
    相关资源
    最近更新 更多