zoukankan      html  css  js  c++  java
  • 配置Pods和containers--为Containers和Pods分配内存资源

    指定内存请求和内存限制

    要为容器指定内存请求,在容器的资源清单中使用resources:requests字段。要指定内存限制,使用resources:limits。

    memory-request-limit.yaml
     1 apiVersion: v1
     2 kind: Pod
     3 metadata:
     4   name: memory-demo
     5   namespace: mem-example
     6 spec:
     7   containers:
     8   - name: memory-demo-ctr
     9     image: polinux/stress
    10     resources:
    11       limits:
    12         memory: "200Mi"
    13       requests:
    14         memory: "100Mi"
    15     command: ["stress"]
    16     args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

    配置文件中的args部分在容器启动时为其提供参数。“-vm bytes”、“150M”参数告诉容器尝试分配150 MiB的内存。

    创建Pod:

    kubectl apply -f memory-request-limit.yaml --namespace=mem-example

    确认POD容器正在运行:

    kubectl get pod memory-demo --namespace=mem-example

    查看有关POD的详细信息:

    kubectl get pod memory-demo --output=yaml --namespace=mem-example

    输出显示pod中的一个容器具有100 MiB的内存请求和200 MiB的内存限制。

    ...
    resources:
      limits:
        memory: 200Mi
      requests:
        memory: 100Mi
    ...

    运行kubectl top获取pod的度量:

    kubectl top pod memory-demo --namespace=mem-example

    输出显示POD使用了大约162900000字节的内存,大约是150MiB。这大于POD的100MiB请求,但在POD的200 MiB限制内。

    NAME                        CPU(cores)   MEMORY(bytes)
    memory-demo                 <something>  162856960

    删除POD:

    kubectl delete pod memory-demo --namespace=mem-example

    超过容器的内存限制

    如果节点有可用内存,则容器可以超出其内存请求。但是一个容器不允许使用超过其内存限制。如果容器分配的内存超过其限制,则该容器将成为终止的候选对象。如果容器继续消耗超出其限制的内存,则容器将终止。如果终止的容器可以重新启动,kubelet将重新启动它,就像任何其他类型的运行时失败一样。

    memory-request-limit-2.yaml
     1 apiVersion: v1
     2 kind: Pod
     3 metadata:
     4   name: memory-demo-2
     5   namespace: mem-example
     6 spec:
     7   containers:
     8   - name: memory-demo-2-ctr
     9     image: polinux/stress
    10     resources:
    11       requests:
    12         memory: "50Mi"
    13       limits:
    14         memory: "100Mi"
    15     command: ["stress"]
    16     args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]

    在配置文件的args部分,可以看到容器将尝试分配250 MiB的内存,这远远高于100 MiB的限制。

    创建Pod:

    kubectl apply -f memory-request-limit-2.yaml --namespace=mem-example

    查看有关POD的详细信息: 

    kubectl get pod memory-demo-2 --namespace=mem-example

    此时,容器可能正在运行或被终止。重复上述命令,直到容器被终止:

    NAME            READY     STATUS      RESTARTS   AGE
    memory-demo-2   0/1       OOMKilled   1          24s

    获取容器状态的更详细视图:

    kubectl get pod memory-demo-2 --output=yaml --namespace=mem-example

    输出显示容器因内存不足(OOM)而被终止:

    lastState:
       terminated:
         containerID: docker://65183c1877aaec2e8427bc95609cc52677a454b56fcb24340dbd22917c23b10f
         exitCode: 137
         finishedAt: 2017-06-20T20:52:19Z
         reason: OOMKilled
         startedAt: null

    容器可以重新启动,因此kubelet会重新启动它。多次重复此命令,以查看容器是否被重复终止和重新启动:

    kubectl get pod memory-demo-2 --namespace=mem-example

    输出显示容器被终止、重新启动、再次终止、再次重新启动,依此类推:

    kubectl get pod memory-demo-2 --namespace=mem-example
    NAME            READY     STATUS      RESTARTS   AGE
    memory-demo-2   0/1       OOMKilled   1          37s
    kubectl get pod memory-demo-2 --namespace=mem-example
    NAME            READY     STATUS    RESTARTS   AGE
    memory-demo-2   1/1       Running   2          40s

    查看有关POD历史记录的详细信息:

    kubectl describe pod memory-demo-2 --namespace=mem-example

    输出显示容器重复启动和失败:

    ... Normal  Created   Created container with id 66a3a20aa7980e61be4922780bf9d24d1a1d8b7395c09861225b0eba1b1f8511
    ... Warning BackOff   Back-off restarting failed container

    查看有关群集节点的详细信息:

    kubectl describe nodes

    输出包括由于内存不足而被终止的容器的记录:

    Warning OOMKilling Memory cgroup out of memory: Kill process 4481 (stress) score 1994 or sacrifice child

    删除Pod:

    kubectl delete pod memory-demo-2 --namespace=mem-example

    指定对节点来说太大的内存请求

    内存请求和限制与容器相关,但将pod视为具有内存请求和限制是有用的。Pod的内存请求是pod中所有容器的内存请求的总和。同样,pod的内存限制是pod中所有容器的限制之和。

    Pod调度基于请求。只有当节点有足够的可用内存来满足Pod的内存请求时,Pod才计划在节点上运行。

    如下,创建一个Pod,该Pod的内存请求太大,超过集群中任何节点的容量。这是一个Pod的配置文件,其中有一个容器请求1000 GiB的内存,这可能超过集群中任何节点的容量。

     memory-request-limit-3.yaml

     1 apiVersion: v1
     2 kind: Pod
     3 metadata:
     4   name: memory-demo-3
     5   namespace: mem-example
     6 spec:
     7   containers:
     8   - name: memory-demo-3-ctr
     9     image: polinux/stress
    10     resources:
    11       limits:
    12         memory: "1000Gi"
    13       requests:
    14         memory: "1000Gi"
    15     command: ["stress"]
    16     args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

    创建Pod:

    kubectl apply -f memory-request-limit-3.yaml --namespace=mem-example

    查看POD状态:

    kubectl get pod memory-demo-3 --namespace=mem-example

    输出显示POD状态为挂起。也就是说,pod不计划在任何节点上运行,它将无限期地保持在挂起状态:

    kubectl get pod memory-demo-3 --namespace=mem-example
    NAME            READY     STATUS    RESTARTS   AGE
    memory-demo-3   0/1       Pending   0          25s

    查看有关POD的详细信息,包括事件:

    kubectl describe pod memory-demo-3 --namespace=mem-example

    输出显示,由于节点上的内存不足,无法计划容器:

    Events:
      ...  Reason            Message
           ------            -------
      ...  FailedScheduling  No nodes are available that match all of the following predicates:: Insufficient memory (3).

    内存单元

     内存资源以字节为单位。您可以使用以下后缀之一将内存表示为普通整数或定点整数:E、P、T、G、M、K、Ei、Pi、Ti、Gi、Mi、Ki。例如,以下内容表示大致相同的值:

    128974848, 129e6, 129M , 123Mi

    如果未指定内存限制

     如果未指定容器的内存限制,则下列情况之一适用:

          - 容器使用的内存量没有上限。容器可以使用运行它的节点上的所有可用内存,而这些内存又可以调用OOM kill。此外,在OOM终止的情况下,没有资源限制的容器被终止的可能性更大。

          - 容器正在具有默认内存限制的命名空间中运行,容器将自动分配默认限制。群集管理员可以使用LimitRange指定内存限制的默认值。

    内存请求和限制的动机

    通过为集群中运行的容器配置内存请求和限制,可以有效地利用集群节点上可用的内存资源。通过保持pod的内存请求较低,可以给pod很好的被调度的机会。通过具有大于内存请求的内存限制,您可以完成两件事:

         - pod可以有突发的活动,在那里它利用的内存恰好是可用的。

         - pod在突发期间可以使用的内存量被限制在某个合理的数量。

  • 相关阅读:
    背水一战 Windows 10 (61)
    背水一战 Windows 10 (60)
    背水一战 Windows 10 (59)
    背水一战 Windows 10 (58)
    背水一战 Windows 10 (57)
    背水一战 Windows 10 (56)
    背水一战 Windows 10 (55)
    背水一战 Windows 10 (54)
    背水一战 Windows 10 (53)
    背水一战 Windows 10 (52)
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/11606933.html
Copyright © 2011-2022 走看看