Kubernetes (minikube) pod OOM 在 Node 中明显留有大量内存的情况下被杀死

2022-09-01 14:02:07

我正在使用minikube,从它开始

minikube start --memory 8192

对于节点的 8Gb 内存。我正在分配具有资源约束的 Pod

    resources:
      limits:
        memory: 256Mi
      requests:
        memory: 256Mi

因此,每个节点的RAM为256Mb,我假设,在达到8Gb内存限制之前,这将为我提供32个pod,但问题是,每当我到达要部署的第8个pod时,第9个Pod永远不会运行,因为它不断被OOM杀死。

对于上下文,每个 pod 都是一个 Java 应用程序,其中包含一个 frolvlad/alpine-oraclejdk8:slim Docker 容器,使用 -Xmx512m -Xms128m 运行(即使 JVM 确实使用完整的 512Mb 而不是 256Mb,我仍然远远没有达到 8Gb 上限的 16 pod 限制)。

我在这里错过了什么?为什么 Pod 被 OOM 杀死时,显然还剩下这么多的可用可分配内存?

提前致谢


答案 1

您必须了解请求和限制的工作方式。

请求是节点上所需的可分配资源量的要求,以便 Pod 在其上进行调度。这些不会导致 OOM,它们会导致 pod 无法调度。

另一方面,限制是给定 pod 的硬限制。Pod 将在此级别受到限制。因此,即使您有16GB的可用RAM,但其上限为256MiB,一旦您的pod达到此级别,它就会经历OOM杀戮。

如果需要,只能定义请求。然后,您的 Pod 将能够增长到全节点容量,而不会受到限制。

https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/


答案 2