在Kubernetes集群中部署容器时将忽略“限制”属性

时间:2018-09-14 22:55:39

标签: kubernetes google-cloud-platform google-kubernetes-engine

我正在使用此YAML片段在Google Kubernetes Engine中部署一个容器:

    spec:
      containers:
      - name: service
        image: registry/service-go:latest
        resources:
          requests:
           memory: "20Mi"
           cpu: "20m"
          limits:
           memory: "100Mi"
           cpu: "50m"

但是它持续消耗120m。 为什么“ limits”属性会被忽略?其他所有功能均正常运行。如果我要求200m,则保留200m,但限制一直被忽略。

enter image description here

我的Kubernetes版本是1.10.7-gke.1

我只有默认的名称空间,并且在执行时

  

kubectl描述默认名称空间

Name:         default
Labels:       <none>
Annotations:  <none>
Status:       Active

No resource quota.

Resource Limits
 Type       Resource  Min  Max  Default Request  Default Limit  Max Limit/Request Ratio
 ----       --------  ---  ---  ---------------  -------------  -----------------------
 Container  cpu       -    -    100m             -              -

1 个答案:

答案 0 :(得分:2)

考虑资源请求

google cloud控制台运行良好,我认为您的pod中有多个容器,这就是原因。上面显示的值是在截断的YAML文件中声明的资源请求的总和。您可以使用kubectl轻松地进行验证。

首先验证您的广告连播中的容器数。

kubectl describe pod service-85cc4df46d-t6wc9

然后,通过kubectl查看节点的描述,您应该具有与控制台所说的相同的信息。

kubectl describe node gke-default-pool-abcdefgh...

资源请求和限制之间有什么区别?

您可以将群集想象为一个大方框。这是您可分配资源的总数。当您将Pod放入大盒子中时,Kubernetes会检查是否存在用于请求的Pod资源的空白空间(小盒子适合大盒子吗?)。如果有足够的可用空间,它将在您选择的节点上安排您的工作量。

调度程序不考虑资源限制。所有这些都在CGroups的内核级别完成。目的是限制工作负载,使其占用计划的节点上的所有CPU或内存。

如果您的资源请求==资源限制,那么工作负载将无法逃避它们的“负担”,并且将无法使用它们旁边的可用CPU /内存。换句话说,可以保证您的资源可用于广告连播。

但是,如果限制大于您的请求,这称为过量使用资源。您打赌,同一节点上的所有工作负载不会同时完全加载(通常是这种情况)。

我建议不要过度使用内存资源,不要让Pod在内存方面逃脱“盒子”,这会导致OOMKilling。