【问题标题】:Create a pod from a failing k8s CronJob从失败的 k8s CronJob 创建一个 pod
【发布时间】: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 的解决方案(我都使用了它们并且它们确实有效,但是由于我仍在开发该功能,所以我不得不重置几次)

  1. 我将 k8s YAML 文件上的命令更改为 tail -f,然后在新容器上更新 Helm 存储库和 exec。解决问题并恢复。
  2. 将作业复制到 Helm 存储库外部目录中的新 Pod YAML 文件,并使用 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 createkubectl run 没有合适的选项。

标签: kubernetes kubernetes-helm


【解决方案1】:

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

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

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

出于兴趣也尝试过(逻辑是从cronjob运行命令,然后继续执行指定命令),但没有成功:

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

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 2021-12-08
    • 2020-11-06
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多