我正在启动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,并且未提供错误消息。
非常欢迎和赞赏任何解决此问题的帮助。
由于第一个答案指出了为厨师执行的命令可能无法正确构建,我认为重要的是说我使用API Kubernetes通过kubectl proxy
发布的作业来构建作业。
这就是我指定lifecycle
说明的方式:
"lifecycle": {
"postStart": {
"exec": {
"command": [
"/bin/sh",
"postStart.sh"
]
}
},
"preStop": {
"exec": {
"command": [
"/bin/sh",
"preStop.sh"
]
}
}
}
我认为这可以转化为YAML的方式;如果我错了,请纠正我。
答案 0 :(得分:1)
你有2个问题,所以你得到2个答案: - )
你的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)
表示:
kubectl describe node nameofyournode
来验证这一点,然后查看输出的Allocatable:
和Allocated resources:
部分。在Non-terminated Pods:
中,你会看到它占用了你的一些cpu,可能是一个kube-proxy pod。解决方案是降低您的pod的要求(500mi
表示500毫微克或0.5核心):
resources:
required:
memory: 1Gi
cpu: 500mi
limits:
memory: 1Gi
cpu: 500mi
...或者调整机器大小,使它们有2个内核而不是1个。
现在最令人好奇的是,不知怎的,最后这个吊舱确实安排了,但此后被杀了。代码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"]