生命周期挂钩失败,错误137

时间:2018-04-06 15:29:46

标签: amazon-web-services docker kubernetes devops lifecycle

我正在启动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脚本唯一能做的就是更新数据库上的值,因此这不是一项特别密集的任务。

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

Kubectl Events

正如您所见,postStart挂钩失败并显示错误137,并且未提供错误消息。

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

编辑1

由于第一个答案指出了为厨师执行的命令可能无法正确构建,我认为重要的是说我使用API​​ Kubernetes通过kubectl proxy发布的作业来构建作业。

这就是我指定lifecycle说明的方式:

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

我认为这可以转化为YAML的方式;如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:1)

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

问题1:cpu要求太高

你的pod指定cpu: 1的要求 - 这意味着1个cpu核心。你的节点总共有1个cpu核心,但是已经运行了一些pod,比如kube-proxy。因此,他们都没有为您的应用程序提供完整的核心,因此调度失败。

错误消息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不是tolerated的pod(这是我想象的主人)

解决方案是降低您的pod的要求(500mi表示500毫微克或0.5核心):

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

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

问题2:错误的postStart命令

现在最令人好奇的是,不知怎的,最后这个吊舱确实安排了,但此后被杀了。代码126表示Command invoked cannot execute,因此postStart:命令可能无效。您没有发布完整的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"]