指定内存请求和内存限制node
要为容器指定内存请求,在容器的资源清单中使用resources:requests字段。要指定内存限制,使用resources:limits。linux
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的内存。docker
建立Pod:api
kubectl apply -f memory-request-limit.yaml --namespace=mem-example
确认POD容器正在运行:app
kubectl get pod memory-demo --namespace=mem-example
查看有关POD的详细信息:spa
kubectl get pod memory-demo --output=yaml --namespace=mem-example
输出显示pod中的一个容器具备100 MiB的内存请求和200 MiB的内存限制。rest
...
resources:
limits:
memory: 200Mi
requests:
memory: 100Mi
...
运行kubectl top获取pod的度量:code
kubectl top pod memory-demo --namespace=mem-example
输出显示POD使用了大约162900000字节的内存,大约是150MiB。这大于POD的100MiB请求,但在POD的200 MiB限制内。orm
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在突发期间可使用的内存量被限制在某个合理的数量。