【问题标题】:Cron job as program or native k8s way作为程序或原生 k8s 方式的 Cron 作业
【发布时间】:2019-09-06 23:54:55
【问题描述】:

我需要在 K8S 创建一个 Cron 作业。
有些作业每分钟运行一次,其中一些每 5 分钟运行一次 (24/7)

此作业需要对某些组件运行休息调用(获取),并且 检查可用性,如果有问题(发布)其他系统的休息呼叫

为了处理这个任务,我目前看到了两种方法

  1. 创建 k8s cronjob - 这是 native k8s CRD 并为此使用 shell scripthttps://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/

PROS 正在使用 K8S 原生方式来处理此类问题

缺点 - 很难调试,记录调试等

  1. 创建 k8s 作业/cronjob - 执行运行 Golang 程序,该程序将使用以下库作为 cronjob

优点 - 调试、记录等,https://github.com/robfig/cron

缺点 - 创建一些抽象......

任何建议,如果我需要完全控制这些工作,建议使用哪种方法更好

【问题讨论】:

  • CONS - very hard to debug, logs debug etc - 在这种情况下,内部带有 cron 计时器的普通 k8s pod 如何帮助调试?它将是同一个容器,只是每个作业运行一个容器。
  • @MaxLobur - 我在谈论本地调试,go code vs shell script
  • 如果您正在运行 K8S cronjob,它会在每次调用作业时创建一个 pod,因此很容易调试。您没有在容器内运行这些 cronjobs 有什么原因吗?您可以使用生命周期挂钩,因此您不必更改 Dockerfile。
  • 所以调试应该是 k8s cron 工作的优点。您编写的代码只执行一次任务并退出 - 易于调试。如果您自己实现 cron 计时器,则每次调试时都需要将其分开。
  • @cookiedough - 我想创建一个 k8s cronjob/job,它执行一个运行一些 API 调用的 go 程序。这不是一个好方法?我不想为每个调用创建一个 pod ....

标签: go kubernetes cron


【解决方案1】:

我会分几个步骤来解决这个问题。

首先,编写执行 REST 调用、检查结果、可能发布警报并退出的程序。你可以用你喜欢的任何语言或工具包编写这个程序。如果您对 Go 感到满意,那就太好了;我可能会自己选择 Python;它可以作为 shell 脚本,但可能比许多替代方案更尴尬。 完全独立于 Kubernetes 构建此程序。尽可能多地对其进行测试,以说服自己它可以满足您的需求。

一旦您使 REST 轮询程序工作,然后才将其构建到 Docker 映像中;将其推送到注册表;并创建一个按计划运行的CronJob Kubernetes 资源。

鉴于您对任务的描述,我不会编写专门的程序来复制 Kubernetes 的内置计划任务运行程序。你可以;我会以与上述相同的方式开发它,但使用 Deployment 而不是 CronJob;但可能 CronJob 路径更简单、更可靠。

【讨论】:

  • 非常感谢!这是他们要走的路。一个问题,我需要为我的 go 应用程序保留 kubeconfig ,因为我不希望它可见并且只能由我的程序访问,我应该如何处理它,是否有开源或方法可以帮助解决这个问题问题?
猜你喜欢
  • 2010-11-19
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多