配置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在突发期间可以使用的内存量被限制在某个合理的数量。

 

转载于:https://www.cnblogs.com/UniqueColor/p/11606933.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值