kubernetes - 我的 pod 获得 OOM-killed 状态,但没有被杀死。为什么?
问题描述
我已经使用带有资源请求和限制的 YAML 文件(apiVersion:batch/v1beta1)配置了一个 CronJob,该 pod 已成功实例化并一直工作到自然结束,但是当终止时,我看到它标记为 OOMKilled。
我的 pod 正在使用 Docker 容器,该容器以调用一些 Java 工具(如 maven)的 bash 脚本开始。我尝试像这样设置 MAVEN_OPTS 和 JAVAOPTS:
env:
- name: JAVA_OPTS
value: "-Xms256M -Xmx1280M"
- name: MAVEN_OPTS
value: "-Xms256M -Xmx1280M"
这些值低于 YAML 中配置的限制值。
我预计 pod 会以完整状态停止,因为我的 ENTRY_POINT bash 脚本的最后一个回显显示在 pod 的日志中,但我得到了 OOMKilled。
解决方案
当 Container 指定了资源请求时,调度程序可以更好地决定将 Pod 放置在哪些节点上。但请记住:计算资源(CPU/内存)是为容器配置的,而不是为 Pod 配置的。
如果 Pod 容器被 OOM 杀死,则该 Pod 不会被驱逐。底层容器由kubelet
基于它的RestartPolicy
.
您的容器被 OOMKill 终止并不意味着 pod 处于某种Completed/Error
状态(除非您使用的是RestartPolicy: Never
)。
如果你kubectl describe
在你的 pod 上执行 a ,容器将处于Running
状态,但你可以在Last State
. 此外,您可以检查它重新启动了多少次:
State: Running
Started: Wed, 27 Feb 2019 10:29:09 +0000
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Started: Wed, 27 Feb 2019 06:27:39 +0000
Finished: Wed, 27 Feb 2019 10:29:08 +0000
Restart Count: 5
推荐阅读
- java - 如何解决 Apache common codec no such method found error in java spring-boot application
- mysql - How to verify if all the queries inside a test.sql file are executed successfully through shell script?
- python-3.x - 如果任何 Datanode 驱动器(存储)失败,如何在 Hadoop 集群中检测
- python - 无法使用节点读取python中的文件
- node.js - “超自然现象”!要求和导入异步工作
- .htaccess - 如何在没有 IIS 的情况下将 .htaccess 转换为 web.config
- react-native - 如何使用反应原生路由器通量在反应原生中保存组件的历史记录
- reactjs - 仅应在新元素上调用使用数组作为依赖项的 useEffect 中的数据
- css - CSS Content 属性在 safari 上不起作用
- android - 如何在连接到 MS SQL 的 ListView 的每一行中添加单击侦听器(按钮)?