我正试图了解K8S POD内存分配的行为,到目前为止,我在互联网上阅读的材料没有运气。
我的问题是,如果我有一个定义了以下内存值的POD模板
Limits:
cpu: 2
memory: 8Gi
Requests:
cpu: 500m
memory: 2Gi
假设我的应用程序突然需要更多的内存,POD分配4Gi
(从2Gi
初始内存)来完成任务。在任务完成后,POD是否会将获得的额外2Gi
返回给底层操作系统并再次成为2Gi
POD,或者之后它会作为具有4Gi
内存的POD运行?
我的应用程序是在Apache Tomcat上运行的Java应用程序,具有为6Gi
定义的最大堆。
Kubernetes资源请求基本上有三次生效:
-
当新pod被初始调度时,资源请求(仅)用于寻找具有足够空间的节点。请求总数必须小于节点的物理大小。不考虑限制和实际利用率。
-
如果进程分配内存,并且这会使其总利用率超过pod的限制,则分配将失败。
-
如果节点内存不足,Kubernetes将检查该节点上的pod,并退出实际使用最多超过其请求的pod。
假设您有一个具有16 GiB内存的节点。你在replicas: 8
的部署中运行这个特定的pod;它们都可以放在节点上,为了方便讨论,我们假设Kubernetes把它们都放在那里。无论pod在做什么,第9个pod都不适合节点,因为内存请求将超过物理内存。
如果您的pod继续并分配了总共4gb的内存,那么只要物理系统有足够的内存就可以。但是,如果节点内存耗尽,Kubernetes将看到这个pod使用了比请求多2gib的内存;这可能导致pod被驱逐(销毁并重新创建,可能在不同的节点上)。
如果进程确实将内存返回给操作系统,这将显示在"实际利用率"中。度规的一部分;由于它的使用量现在将少于它的请求,因此如果节点内存耗尽,它被驱逐的危险就会降低。(但是,许多垃圾收集系统会尽可能地保留操作系统内存并重用它;看到。GC释放回内存给OS吗?)