我有两个容器在我的pod (PodA
)
第一个容器(C1
)具有以下限制
Limits:
cpu: 2
memory: 1Gi Requests:
cpu: 100m
memory: 128Mi
第二个容器(C2
)没有指定的请求/限制
我有以下问题
- 从我看到的
kubectl describe nodes
,PodA
的内存/cpu请求/限制与C1
的相同。对吗? - #2 ->如果
C2
请求超过1Gi的内存会发生什么?容器会耗尽内存,导致整个pod崩溃吗?或者只要节点有空闲内存,它就能够抓取更多内存?
C2
的内存/cpu限制是什么?是无界的吗?受PodA
的限制(例如C1
的限制)?我试着谷歌,但我看到的所有例子中,有些地方的资源限制设置为两个容器
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杀死的节点。