我正在启动乔布斯,我试图使用生命周期挂钩在开始时启动一个脚本,在容器关闭时启动另一个脚本。
我还指定了资源限制,它们如下所示:
resources:
required:
memory: 1Gi
cpu: 1
limits:
memory: 1Gi
cpu: 1我的集群目前有4节点,每个有一个CPU和4GB内存,并且运行在EC2机器上。
postStart脚本目前非常简单,如下所示:
export SOME_VAR=some_value
node someScript.jsNode脚本所做的唯一事情就是更新数据库上的值,所以它不是一个特别密集的任务。
启动作业后,会发生下列事件:

如您所见,postStart钩子在出现错误137时会失败,并且不会给出错误消息。
解决这一问题的任何帮助都是受到高度欢迎和赞赏的。
编辑1
由于第一个答案指出,为厨师执行的命令可能没有正确构建,所以我认为重要的是,我使用通过kubectl proxy发布的API来构建作业。
我是这样指定lifecycle指令的:
"lifecycle": {
"postStart": {
"exec": {
"command": [
"/bin/sh",
"postStart.sh"
]
}
},
"preStop": {
"exec": {
"command": [
"/bin/sh",
"preStop.sh"
]
}
}
}我认为这是翻译成YAML的方式,它应该;请纠正我,如果我是错误的。
发布于 2018-04-09 16:07:18
你有两个问题,所以你得到了两个答案:-)
问题1: cpu要求过高
您指定了cpu: 1的要求-这意味着1 cpu核心。您的节点总共有一个cpu核心,但是已经在运行一些豆荚,比如kube。因此,它们都没有一个完整的内核可供您的应用程序使用,因此调度失败。
错误消息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荚。
解决方案是降低对吊舱的要求(500mi是指500毫升,或0.5内核):
resources:
required:
memory: 1Gi
cpu: 500mi
limits:
memory: 1Gi
cpu: 500mi..。或者调整你的机器的大小,这样它们就有两个核心而不是一个。
问题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)中指定一个外壳。如果这样做,您可以像这样定义postStart钩子:
lifecycle:
postStart:
exec:
command: ["/path/to/postStart.sh"]https://stackoverflow.com/questions/49696247
复制相似问题