Kubernetes pod在获得超过请求量的内存后是否提供内存



我正试图了解K8S POD内存分配的行为,到目前为止,我在互联网上阅读的材料没有运气。

我的问题是,如果我有一个定义了以下内存值的POD模板

Limits:
cpu:     2
memory:  8Gi
Requests:
cpu:     500m
memory:  2Gi

假设我的应用程序突然需要更多的内存,POD分配4Gi(从2Gi初始内存)来完成任务。在任务完成后,POD是否会将获得的额外2Gi返回给底层操作系统并再次成为2GiPOD,或者之后它会作为具有4Gi内存的POD运行?

我的应用程序是在Apache Tomcat上运行的Java应用程序,具有为6Gi定义的最大堆。

Kubernetes资源请求基本上有三次生效:

  1. 当新pod被初始调度时,资源请求(仅)用于寻找具有足够空间的节点。请求总数必须小于节点的物理大小。不考虑限制和实际利用率。

  2. 如果进程分配内存,并且这会使其总利用率超过pod的限制,则分配将失败。

  3. 如果节点内存不足,Kubernetes将检查该节点上的pod,并退出实际使用最多超过其请求的pod。

假设您有一个具有16 GiB内存的节点。你在replicas: 8的部署中运行这个特定的pod;它们都可以放在节点上,为了方便讨论,我们假设Kubernetes把它们都放在那里。无论pod在做什么,第9个pod都不适合节点,因为内存请求将超过物理内存。

如果您的pod继续并分配了总共4gb的内存,那么只要物理系统有足够的内存就可以。但是,如果节点内存耗尽,Kubernetes将看到这个pod使用了比请求多2gib的内存;这可能导致pod被驱逐(销毁并重新创建,可能在不同的节点上)。

如果进程确实将内存返回给操作系统,这将显示在"实际利用率"中。度规的一部分;由于它的使用量现在将少于它的请求,因此如果节点内存耗尽,它被驱逐的危险就会降低。(但是,许多垃圾收集系统会尽可能地保留操作系统内存并重用它;看到GC释放回内存给OS吗?)

最新更新