【发布时间】:2022-01-28 01:14:02
【问题描述】:
我有一个 CronJob,它每 10 分钟运行一次并执行一些命令。
由于某种原因它失败了,我想 exec 对其进行调查和修复(我需要运行 1 次命令来修复共享卷*)。
问题是当我尝试运行 exec 时出现此错误,这是预期的:
error: cannot exec into a container in a completed pod; current phase is Failed
我想从作业定义创建一个新 pod 并在其上运行自定义命令(例如 tail -f),以便它运行时不会崩溃,我可以 exec 进入它来调查和解决问题。
我一直在努力做到这一点,并且只找到了 2 个似乎都有点 hacky 的解决方案(我都使用了它们并且它们确实有效,但是由于我仍在开发该功能,所以我不得不重置几次)
- 我将 k8s YAML 文件上的命令更改为
tail -f,然后在新容器上更新 Helm 存储库和exec。解决问题并恢复。 - 将作业复制到 Helm 存储库外部目录中的新
PodYAML 文件,并使用tail -f。使用kubectl apply -f命令创建它。然后我可以在上面exec,做我需要做的事情并删除 pod。
第一个问题是我更改了 Helm 存储库。第二种需要对代码进行一些复制和改编,但还不错。
我想要的是一个可以运行的kubectl 命令来执行此操作。有点像如何从 CronJob 创建作业:
kubectl create job --from=cronjob/myjob myjob-manual
如果我可以这样做来创建一个 pod,或者使用一个永远不会完成的命令(如 tail -f)创建一个作业,那将解决我的问题。
*我需要运行的命令是将一些 TOTP 凭据作为 1 次任务传递以登录服务。然后,保持登录状态的 cookie 将存在于共享卷上,因此我不必再这样做了。我不想将 TOTP 主密钥作为秘密传递并添加逻辑来解释它。所以最简单的解决方案是设置这个服务,偶尔我 exec 进入 pod 并再次使用 TOTP 值登录。
还有一个注意事项。这是针对个人项目和我自己使用的工具。这不是我提供给其他人的关键服务,所以我不介意偶尔出现问题并且我需要进行干预。
【问题讨论】:
-
你能发布 cronjob yaml 吗?通常它应该有工作规范,工作规范应该有你可以使用的 pod 规范..
-
@DanielM,是的,这就是我目前正在做的事情(请参阅问题中的选项 2)它有效,但我希望会有某种内置命令我想念无需提取 pod 规范即可执行此操作。
-
解决它的另一个选项可能是添加一个 sidecar 容器,您可以在其中执行并检查 pod 内部发生了什么。至于建议的解决方案,我认为没有一个命令。 kubectl create 和 kubectl run 没有合适的选项。
标签: kubernetes kubernetes-helm