首页 > 解决方案 > 我的 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。

标签: kubernetesyamlcontainers

解决方案


当 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

推荐阅读