Java Kubernetes(minikube)吊舱OOMKilled的节点中显然还有大量内存

Java Kubernetes(minikube)吊舱OOMKilled的节点中显然还有大量内存,java,memory,kubernetes,minikube,Java,Memory,Kubernetes,Minikube,我用的是minikube,从 minikube start --memory 8192 用于节点的8Gb RAM。 我正在分配有资源限制的吊舱 resources: limits: memory: 256Mi requests: memory: 256Mi 因此,每个节点有256Mb的RAM,我假设在达到8Gb内存限制之前会有32个pod,但问题是,每当我到达要部署的第8个pod时,第9个pod将永远不会运行,因为它总是被OOM

我用的是minikube,从

minikube start --memory 8192
用于节点的8Gb RAM。 我正在分配有资源限制的吊舱

    resources:
      limits:
        memory: 256Mi
      requests:
        memory: 256Mi
因此,每个节点有256Mb的RAM,我假设在达到8Gb内存限制之前会有32个pod,但问题是,每当我到达要部署的第8个pod时,第9个pod将永远不会运行,因为它总是被OOMKilled

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

我错过了什么?为什么豆荚中显然还有这么多空闲的可分配内存


提前感谢

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

请求是对pod在节点上调度所需的可分配资源量的要求。这些将不会导致OOM,它们将导致pod无法安排

另一方面,限制是给定pod的硬限制。吊舱将在该高度加盖。所以,即使你有16GB的可用内存,但有256MB的限制,一旦你的pod达到这个级别,它将经历OOM杀死

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


eg:我有一个内存为1gb的节点,其中有两个吊舱。Pod1的内存限制为0.5gb。现在节点可用内存将为0.5gb。另一个Pod2没有限制。Pod2能否超过0.5gb内存??换句话说,Pod2可以使用分配给Pod1的内存吗??