生命周期挂钩因错误 137 而失败

Lifecycle hooks failing with error 137

我正在启动 Jobs,我正在尝试使用生命周期挂钩在启动时启动一个脚本,在容器关闭时启动另一个脚本。

我也在指定资源限制,它们看起来像这样:

resources:
    required:
        memory: 1Gi
        cpu: 1
    limits:
        memory: 1Gi
        cpu: 1

我的集群目前有 4 个节点,每个节点有 1 个 CPU 和 4 GB RAM,并且在 EC2 机器上是 运行。

postStart 脚本目前非常简单,如下所示:

export SOME_VAR=some_value
node someScript.js

Node 脚本所做的唯一事情就是更新数据库中的值,因此这不是一项特别密集的任务。

启动作业后,会发生以下事件:

如您所见,postStart 挂钩失败并出现错误 137,并且没有给出任何错误消息。

非常欢迎和感谢任何解决此问题的帮助。

编辑 1

由于第一个答案指出了为厨师执行的命令可能未正确构建的事实,我认为重要的是说我使用 API Kubernetes 通过 kubectl proxy.

这是我指定 lifecycle 指令的方式:

"lifecycle": {
    "postStart": {
        "exec": {
            "command": [
                "/bin/sh",
                "postStart.sh"
             ]
        }
    },
    "preStop": {
        "exec": {
            "command": [
                "/bin/sh",
                "preStop.sh"
            ]
        }
    }
}

我认为这可以按照预期的方式转换为 YAML;如果我在这方面有误,请纠正我。

你有 2 个问题,所以你得到 2 个答案:-)

问题 1:cpu 要求太高

您的 pod 指定了 cpu: 1 的要求 - 这意味着 1 cpu 核心。您的节点总共有 1 cpu 个核心,但已经有 运行 个 pods,例如 kube-proxy。因此 none 其中有一个完整的内核可用于您的应用程序,因此调度失败。

错误信息No nodes are available that match all of the predicates: Insufficient cpu (4), PodToleratesNodeTaints (1)表示:

  • 目前无法安排
  • 在所有节点中,有 4 个没有足够的 cpu 来安排此 pod。
    • 您可以通过执行 kubectl describe node nameofyournode 来验证这一点,并查看输出的 Allocatable:Allocated resources: 部分。在 Non-terminated Pods: 中,您会看到它占用了您的一些 cpu,可能是一个 kube-proxy pod。
  • 在所有节点中,1个节点有taint that is not tolerated个pod(这是我想象中的master)

解决方案是降低对 pod 的要求(500mi 表示 500 毫核,或 0.5 个核):

resources:
  required:
    memory: 1Gi
    cpu: 500mi
  limits:
    memory: 1Gi
    cpu: 500mi

...或调整您的机器大小,使它们有 2 个核心而不是 1 个。

问题 2:错误 post启动命令

现在最奇怪的是,不知怎的,最后 pod 确实被安排了,但后来被杀死了。代码 126 表示 Command invoked cannot execute,因此 postStart: 命令可能无效。您没有 post 完整的 yaml 文件,但从错误消息看来您指定了类似以下内容:

lifecycle:
  postStart:
    exec:
      command: ["/bin/sh postStart.sh"]

请检查是否是这种情况。如果是这样,那是不正确的。您需要将每个参数分隔成 command 数组中的不同元素,如下所示:

lifecycle:
  postStart:
    exec:
      command: ["/bin/sh", "postStart.sh"]

或者,确保 postStart.sh 在容器镜像中被标记为可执行,并在第一行 (#!/bin/bash) 中指定一个 shell shebang。如果这样做,您可以像这样定义 postStart 挂钩:

lifecycle:
  postStart:
    exec:
      command: ["/path/to/postStart.sh"]