如何仅在单个 openshift pod 上 运行 计划任务?

How to run a scheduled task on a single openshift pod only?

故事:在我的 java 代码中,我有一些 ScheduledFuture,我需要每天在特定时间 运行(例如 15:00) ,我唯一可用的东西是数据库,我当前的应用程序和具有多个 pods 的 openshift。我无法将此代码移出我的应用程序,必须 运行 从那里移走。

问题:ScheduledFuture 适用于每个 pod,但我每天只需要 运行 一次。我有一些想法,但我不知道如何实现。

想法 #1: 将环境变量设置为特定的 pod,然后我将能够检查此变量是否存在(及其值),读取它并在需要时 运行 安排任务。我知道我有徘徊 pods 的风险,但最好不要 运行 计划任务,而不是多次 运行 它。

想法 #2: 以某种方式确定一个 leader pod,这对我来说似乎是个坏主意,因为它总是有“裂脑”问题。

想法 #3(有点跑题): 通过数据库创建我自己的同步算法。公平地说,这对我来说是最简单的方法,因为我是一名程序员而不是 SRE。我知道这不是最好的。

想法 #4(有点跑题): 只需使用石英计划库。我个人不太喜欢那样,更喜欢前两个想法中的一个(如果我能够实现它们的话),但目前这似乎是我唯一有效的选择。

更新。也许你有其他建议或警告我永远不应该那样做?

您可以使用 openshift 创建 cron 作业 https://docs.openshift.com/container-platform/4.7/nodes/jobs/nodes-nodes-jobs.html 并让此作业触发您应用程序中的某个端点,该端点将调用您的逻辑。

我建议使用现成的解决方案。把这些事情做好,尤其是涵盖所有可能的极端情况。可靠性,很难。如果您不想使用石英,我至少建议使用数据库支持的解决方案。例如,Postgres 有 SELECT ... FOR UPDATE SKIP LOCKED; (scroll down to the section "The Locking Clause") 可用于实现一次性调度。