Kubernetes内存限制:在同一个pod上有和没有内存限制的容器



我有两个容器在我的pod (PodA)

第一个容器(C1)具有以下限制

Limits:                                                                                                                                                                                                
cpu:     2                                                                                                                                                                                           
memory:  1Gi                                                                                                                                                                                         Requests:                                                                                        
cpu:     100m                                                                                  
memory:  128Mi

第二个容器(C2)没有指定的请求/限制

我有以下问题

  1. 从我看到的kubectl describe nodes,PodA的内存/cpu请求/限制与C1的相同。对吗?
  2. C2的内存/cpu限制是什么?是无界的吗?受PodA的限制(例如C1的限制)?
  3. #2 ->如果C2请求超过1Gi的内存会发生什么?容器会耗尽内存,导致整个pod崩溃吗?或者只要节点有空闲内存,它就能够抓取更多内存?

我试着谷歌,但我看到的所有例子中,有些地方的资源限制设置为两个容器

Kubernetes根据你是否添加了请求和限制将你的pod放在服务质量类中。

如果pod中的所有容器都设置了限制,则pod属于Guaranteed类。

如果pod中至少有一个容器设置了请求(或限制),则该pod属于Burstable类。

如果没有为所有容器设置请求或限制,则pods属于Best Effort类。

在您的示例中,您的pod属于Burstable类,因为C2没有设置限制。


这些请求和限制在两个上下文中使用-调度和资源耗尽。

调度

在调度过程中,考虑请求根据可用资源选择节点。limits可以过度提交,并且不考虑调度决策。

资源耗尽

您可以在两个资源上指定请求和本地限制——cpu和内存

CPU是一种可压缩资源,也就是说,如果需要,内核可以通过分配更少的CPU时间来限制进程的CPU使用。因此,如果其他进程空闲,则允许一个进程使用尽可能多的CPU。如果另一个进程需要cpu,操作系统可以为使用更多cpu的进程限制cpu时间。未使用的cpu时间将按请求的比例分配。如果您不希望这种无限制的cpu使用行为,也就是说,您希望您的容器不超过某个阈值,您可以设置限制。

内存不是可压缩资源。一旦分配给进程,内核就不能重新获得内存。因此,如果设置了限制,如果进程试图使用超过限制的资源,它就会被OOM杀死。如果没有设置限制,进程可以分配任何它想要的内存,但是如果内存耗尽,恢复一些空闲内存的唯一方法是终止进程。这就是QoS类发挥作用的地方。BestEffort类容器将是第一个被OOM杀死的。接下来,Burstable类容器将在任何Guaranteed类容器被杀死之前被杀死。在容器具有相同QoS类的情况下,与其请求相比,使用较高内存百分比的容器将被OOM杀死。


从kubectl描述节点中我可以看到,PodA的内存/cpu请求/限制与C1中的相同。对吗?

是的

C2的内存/cpu限制是什么?是无界的吗?限于PodA的极限(例如C1的极限)?

CPU作为可压缩资源对于所有容器都是无界的(如果指定了限制,则达到限制)。当具有请求集的其他容器需要更多cpu时间时,C2将受到限制。

#2 ->如果C2请求超过1Gi的内存会发生什么?容器会耗尽内存,导致整个pod崩溃吗?或者只要节点有空闲内存,它就能够抓取更多内存?

它可以抓取任意多的内存。但是,如果节点没有更多的空闲内存可以分配给其他进程,它将是第一个被OOM杀死的节点。

最新更新