Kubernetes 内存限制:同一 Pod 上有或没有内存限制的容器

Pat*_*ouk 1 memory kubernetes docker-container kubernetes-pod

我的 Pod 中有两个容器 ( PodA)

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

Limits:                                                                                                                                                                                                
  cpu:     2                                                                                                                                                                                           
  memory:  1Gi                                                                                                                                                                                         Requests:                                                                                        
  cpu:     100m                                                                                  
  memory:  128Mi
Run Code Online (Sandbox Code Playgroud)

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

我有以下问题

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

我尝试用谷歌搜索,但我看到的所有示例都为两个容器设置了资源限制

Sha*_*k V 8

Kubernetes根据您是否添加了请求和限制将您的 Pod 置于服务质量类别中。

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

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

如果没有为所有容器设置请求或限制,则 Pod 属于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 杀死的节点。