我有一个CronJob,它每10分钟运行一次,并执行一些命令。
由于某种原因,它失败了,我想exec
对它进行调查并修复它(我需要运行一个1次命令来修复共享卷*(。
问题是,当我尝试运行exec
时,我会收到这个错误,这是意料之中的:
error: cannot exec into a container in a completed pod; current phase is Failed
我想从作业定义中创建一个新的pod,并在其上运行一个自定义命令(例如tail -f
(,这样它就可以在不崩溃的情况下运行,并且我可以将exec
放入其中来调查和修复问题。
我一直在努力做到这一点,只找到了两个解决方案,这两个方案似乎都有点棘手(我都用过,它们确实有效,但由于我仍在开发该功能,我不得不重置几次(
- 我将k8s YAML文件上的命令更改为
tail -f
,然后更新新容器上的Helm repo和exec
。修复问题并恢复 - 使用
tail -f
将作业复制到Helm repo外部目录中的新Pod
YAML文件中。使用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