如果Kubernetes Pod超出其cpu资源的“限制”,会发生什么?

时间:2019-08-22 11:16:51

标签: kubernetes

NAME                      CPU(cores)   MEMORY(bytes)   
apache-757ddfbc75-khhfw   10m          61Mi

4 个答案:

答案 0 :(得分:0)

文档:https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#how-pods-with-resource-limits-are-run

“可能会或可能不会允许容器长时间超过其CPU限制。但是,不会因过度使用CPU而杀死它。”

将不允许容器使用超过平均限制的CPU,其他容器将受到保护,以防止CPU使用率过高。

答案 1 :(得分:0)

从头开始

创建Pod时,Kubernetes调度程序选择一个要在其上运行Pod的节点。每个节点对于每种资源类型都有最大容量:它可以为Pod提供的CPU和内存量。调度程序确保对于每种资源类型,已调度容器的资源请求总数小于节点的容量。请注意,尽管节点上的实际内存或CPU资源使用率非常低,但是如果容量检查失败,调度程序仍会拒绝将Pod放置在节点上。这样可以防止以后资源使用量增加时(例如,在请求率的每日峰值期间)节点上的资源短缺。

要为容器指定CPU请求,请在“容器”资源清单中包含 resources:requests 字段。要指定CPU限制,请包含resources:limits。

CPU请求和限制与容器相关联,但是将Pod视为具有CPU请求和限制很有用。对Pod的CPU请求是对Pod中所有容器的CPU请求的总和。同样,Pod的CPU限制是Pod中所有容器的CPU限制的总和。

Pod调度基于请求。仅当节点具有足够的可用CPU资源来满足Pod CPU请求时,才能将Pod安排在该节点上运行。

在pod的配置文件下面,容器请求100个CPU,这可能超出了群集中任何节点的容量。

apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo
  namespace: cpu-test
spec:
  containers:
  - name: cpu-demo-ctr-2
    image: vish/stress
    resources:
      limits:
        cpu: "100"
      requests:
        cpu: "100"
    args:
    - -cpus
    - "2"

创建pod后,您将获得类似的输出:

enter image description here

这表明由于节点上CPU资源不足而无法调度容器。

总体文档:kubernetes-resourcesmanaging-resources

答案 2 :(得分:0)

k8s文档参考:

  

可能会或可能不会允许容器在很长一段时间内超过其CPU限制。但是,它不会因CPU使用率过高而被杀死。

在大多数情况下,什么都不会发生。 CPU的使用非常灵活。

答案 3 :(得分:0)

似乎出现了节流(这不是官方文档中写的):

Kubernetes使用内核限制来实现CPU限制。如果应用程序超出限制,则会受到限制(又称为更少的CPU周期)。另一方面,内存请求和限制的实现方式有所不同,因此更易于检测。您只需检查Pod的上次重启状态是否为OOMKilled。

https://medium.com/omio-engineering/cpu-limits-and-aggressive-throttling-in-kubernetes-c5b20bd8a718#:~:text=Kubernetes%20uses%20kernel%20throttling%20to,last%20restart%20status%20is%20OOMKilled