生命周期挂钩因错误 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"]
我正在启动 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"]