从失败的k8s CronJob创建一个pod



我有一个CronJob,它每10分钟运行一次,并执行一些命令。

由于某种原因,它失败了,我想exec对它进行调查并修复它(我需要运行一个1次命令来修复共享卷*(。

问题是,当我尝试运行exec时,我会收到这个错误,这是意料之中的:

error: cannot exec into a container in a completed pod; current phase is Failed

我想从作业定义中创建一个新的pod,并在其上运行一个自定义命令(例如tail -f(,这样它就可以在不崩溃的情况下运行,并且我可以将exec放入其中来调查和修复问题。

我一直在努力做到这一点,只找到了两个解决方案,这两个方案似乎都有点棘手(我都用过,它们确实有效,但由于我仍在开发该功能,我不得不重置几次(

  1. 我将k8s YAML文件上的命令更改为tail -f,然后更新新容器上的Helm repo和exec。修复问题并恢复
  2. 使用tail -f将作业复制到Helm repo外部目录中的新PodYAML文件中。使用kubectl apply -f命令创建它。然后我可以在上面exec,做我需要的事情并删除pod

第一个问题是我更改了Helm回购。第二种需要对代码进行一些复制和调整,但也不算太糟。

我想要的是一个可以运行的kubectl命令。有点像如何从CronJob:创建作业

kubectl create job --from=cronjob/myjob myjob-manual

如果我可以这样做来创建一个pod,或者用一个永远不会完成的命令创建一个作业(比如tail -f(,这将解决我的问题。

*我需要运行的命令是将一些TOTP凭据作为登录服务的一次性任务进行传递。保持登录的cookie将存在于共享卷上,因此我不必再这样做了。我也不想把TOTP主密钥作为秘密传递,并添加逻辑来解释它。因此,最简单的解决方案是设置此服务,并偶尔将exec放入pod,然后再次使用TOTP值登录。

还有一个注意事项。这是一个个人项目,也是我自己使用的工具。这不是我向其他人提供的关键服务,所以我不介意偶尔出现问题,我需要干预。

深入研究这个问题,您的选项2是最可行的解决方案

添加sidecar容器-这与选项1相同,但更困难/更耗时。

如注释中所述,没有从job/cronjob直接创建命令式pod的选项。可以检查kubectl:的可用选项

  • kubectl create
  • kubectl run

出于兴趣也进行了尝试(逻辑是从cronjob运行命令,然后使用指定的命令继续(,但没有成功:

$ kubectl create job --from=cronjob/test-cronjob manual-job -- tail -f
error: cannot specify --from and command

相关内容

  • 没有找到相关文章

最新更新